2016-06-10 55 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 –

相關問題