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

How can I call a function in another CFC file from within a query of a function in one cfc file?

我有一个 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>

而另一个 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>

问题:如何从 (info.cfc) 中的查询中调用 "addBusinessDays" 并生成另一列结果。

我以为我可以做类似的事情:

<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,
             (
               <cfinvoke component="DateFunctions" method="addBusinessDays" returnVariable="Date">
                  <cfinvokeargument name="daysToAdd" value="#dbo.tickets.Days_Due#">
                  <cfinvokeargument name="date" value="#dbo.tickets.Start_Date#">
               </cfinvoke>
             ) AS Due_DATE
          FROM
             dbo.tickets    
    </cfquery>
</cffunction>

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

编辑:根据下面的讨论,将 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>

与其创建 df 对象,不如将其绑定到 this 范围。这样对象只创建一次。这应该会使 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>