Sql 如何从一个CFC文件中函数的查询中调用另一个CFC文件中的函数?

Sql 如何从一个CFC文件中函数的查询中调用另一个CFC文件中的函数?,sql,methods,coldfusion,invoke,Sql,Methods,Coldfusion,Invoke,我有一个cfc文件(info.cfc),具有如下所示的多个功能 <cfcomponent output="true" extends="DateFunctions"> <cffunction name="getStatuses" access="remote" returntype="any" output="true" returnformat="plain"> ... </cffunction> <cffunc

我有一个cfc文件(info.cfc),具有如下所示的多个功能

<cfcomponent output="true" extends="DateFunctions">
    <cffunction name="getStatuses" access="remote" returntype="any" output="true" returnformat="plain">
       ...
    </cffunction>

    <cffunction name="viewDate" access="remote" returntype="any" output="true" returnformat="plain">
        <cfquery  name="records">
              SELECT
                 dbo.tickets.Incident,
                 dbo.tickets.Start_Date,
                 dbo.tickets.Days_Due
              FROM
                 dbo.tickets    
        </cfquery>
    </cffunction>
</component>

...
挑选
dbo.tickets.Incident,
dbo.tickets.Start_日期,
dbo.tickets.Days\u到期
从…起
dbo.tickets
另一个cfc文件(DateFunctions.cfc)包含一个带有两个参数并返回日期的函数。 DateFunctions.cfc文件如下所示:

<cfcomponent output="true" name="DateFunctions"">
    <cffunction name="addBusinessDays" access="remote" returntype="any" output="true" returnformat="plain">
       <cfargument name="daysToAdd" 
                required="yes" 
                type="numeric" 
                hint="The number of whole business days to add or subtract from the given date">
        <cfargument name="date" 
                required="No" 
                type="date" 
                hint="The date object to start counting from.." 
                default="#NowDateTime#">

         ...
         ... <!--- Perform some tasks --->

         <cfreturn Date>
    </cffunction>
</cfcomponent>

您可以执行以下操作,但需要注意的是,循环将有额外的处理

编辑:根据下面的讨论,将cfoutput更新为cfloop

 <cffunction name="viewDate" access="remote" returntype="any" output="true" returnformat="plain">
    <cfquery  name="records">
          SELECT
             dbo.tickets.Incident,
             dbo.tickets.Start_Date,
             dbo.tickets.Days_Due, 
            '' as Due_DATE
          FROM
             dbo.tickets    
    </cfquery>

    <cfset df = createobject("component","DateFunctions")>

    <cfloop query="records">
        <cfset records.Due_DATE = df.addBusinessDays(Days_Due, Start_Date)>
    </cfloop>

   <cfreturn records>
</cffunction>

挑选
dbo.tickets.Incident,
dbo.tickets.Start_日期,
dbo.tickets.Days\u到期日,
“”作为到期日
从…起
dbo.tickets

与其创建df对象,不如将其绑定到
范围。这样,对象只创建一次。这将使
viewDate
函数运行更快,因为在创建
df
时没有开销

另外,
new
只是一种更简洁的语法

<cfcomponent>

    <cfset this.df =  new DateFunctions()>

    <cffunction name="viewDate" access="remote" returntype="any" output="false" returnformat="plain">
        <cfquery  name="Local.records">
           SELECT
                dbo.tickets.Incident,
                dbo.tickets.Start_Date,
                dbo.tickets.Days_Due, 
                CAST(NULL AS datetime)
           FROM
                dbo.tickets    
       </cfquery>


      <cfloop query="Local.records">
         <cfset Local.records.Due_DATE = this.df.addBusinessDays( Local.records.Days_Due, Local.records.Start_Date)>
      </cfloop>

      <cfreturn Local.records>
    </cffunction>

<cfcomponent>

挑选
dbo.tickets.Incident,
dbo.tickets.Start_日期,
dbo.tickets.Days\u到期日,
强制转换(日期时间为空)
从…起
dbo.tickets

生成HTML时,应在查看页面上完成此处理。为了回答此问题,我们需要查看addBusinessDays的代码。(编辑)CFC不能以这种方式使用。ColdFusion服务器和数据库是完全独立的。CF对数据库对象一无所知,而数据库对CFML一无所知,因此不能以这种方式将两者混合使用。ColdFusion的唯一工作就是充当信使。它在查询执行之前完成工作。CF计算任何cfml代码并将所有内容转换为文本。然后,它构建一个SQL字符串并将该字符串发送到数据库执行。此外,根据AddStudio的实际逻辑,您可以考虑将逻辑移动到数据库,并使用带有连接的日历数据库表或B)标量数据库函数。1)不要忘记瓦尔河/本地范围所有函数局部变量(查询名称也一样)2)删除“DBO.TabLNAME”。从CF循环。它不是查询列名的一部分3)由于代码没有显示任何内容,请使用
cfloop
而不是
cfoutput
另外4)不要使用“%”作为到期日“”,因为它不会为新列生成正确的数据类型和/或大小。相反,使用类似于
CAST(NULL作为datetime)的内容作为到期日
。确切语法是dbms-specific.IMHO:函数应设置为
output=“false”
,除非确实希望函数生成输出。在我的代码中,函数返回字符串比生成输出更常见。这与:@snackboy-它是:“显示输出…”。你说的是变量赋值。不一样。RE:它真的保留了查询列的数据类型吗这就是重点。查询列不是无类型的。sql使用错误的数据类型创建列。CFLoop现在实际上支持分组。虽然对于旧版本,是的,这是误用cfoutput的少数合法用例之一。@JamesAMohler-同意在不需要时抑制输出。我刚才谈到了在这种情况下不必要地使用cfoutput。医生的病情有所好转,但是。。仍然有很多不好的例子,到处都是多余的英镑符号、引号和滥用cfoutput;-)。这不仅仅是因为这些示例是丑陋的代码,它们有助于培养对cfml IMO某些方面的误解和误解。我意识到以上是基于前面的答案,但是,
''到期日
应该替换为类似于
CAST(NULL as datetime)
(特定于dbms)确保列类型正确。另请参见:
<cfcomponent>

    <cfset this.df =  new DateFunctions()>

    <cffunction name="viewDate" access="remote" returntype="any" output="false" returnformat="plain">
        <cfquery  name="Local.records">
           SELECT
                dbo.tickets.Incident,
                dbo.tickets.Start_Date,
                dbo.tickets.Days_Due, 
                CAST(NULL AS datetime)
           FROM
                dbo.tickets    
       </cfquery>


      <cfloop query="Local.records">
         <cfset Local.records.Due_DATE = this.df.addBusinessDays( Local.records.Days_Due, Local.records.Start_Date)>
      </cfloop>

      <cfreturn Local.records>
    </cffunction>

<cfcomponent>