2016-06-10 83 views
3

我有一个具有多个功能的cfc文件(info.cfc),如下所示。如何从一个cfc文件中的函数查询中调用另一个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> 

问:我如何可以调用“addBusinessDays”从查询内(info.cfc)也产生效果的另一列。

我想我可能已经能够做一些事情,如:

<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> 
+0

这应该处理视图页面上进行时,HTML生成 –

+1

为了回答这个问题,我们需要看到addBusinessDays代码。 –

+0

(编辑)不能以这种方式使用CFC。 ColdFusion服务器和数据库完全分离。 CF对数据库对象一无所知,数据库对CFML一无所知,所以你不能用这种方式来混合这两种。 ColdFusion的唯一工作就是充当信使。它在执行查询之前执行它的工作*。 CF会评估任何cfml代码并将所有内容转换为文字。然后它生成一个SQL字符串并将该字符串发送到数据库以供执行。数据库完成剩下的工作。 – Leigh

回答

0

你可以做需要提醒的以下的会有额外的处理循环。

编辑:每下面的讨论,更新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> 
+1

1)不要忘记VAR/LOCAL范围内的所有函数局部变量(查询名称)2)从CF循环中删除“dbo.tablename”。它不是查询列名的一部分3)由于代码没有显示任何内容,因此使用'cfloop'而不是'cfoutput' – Leigh

+0

另外4)不要使用'''作为Due_DATE'',因为它不会生成正确的数据新列的类型和/或大小。而应使用类似'CAST(NULL AS datetime)AS Due_Date'。确切的语法是dbms特定的。 – Leigh

+0

cfloop vs cfoutput是一个偏好问题,除非涉及嵌套循环。我不确定这种情况下的演员对于可读性以外的任何事情都很重要。 dbo.tablename上的好点,我可以更正。我同意范围界定(但从未真正做到)。 – snackboy

0

而不是创建的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> 
+0

我知道上面是基于以前的答案,但作为[在评论中提到](http://stackoverflow.com/questions/37757359/how-can-i-call-a-function-in-another-cfc - 从函数的查询中查询文件#comment63005512_37759519),应该用'CAST(NULL AS datetime)'(dbms specific)替换'''作为Due_DATE',以确保正确的列类型。 – Leigh

+0

另请参阅:http://stackoverflow.com/questions/37779101/are-there-different-kinds-of-nulls –

相关问题