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