Reputation: 45
I have one cfc file (info.cfc) with multiple functions as shown below.
<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>
And the other cfc file (DateFunctions.cfc) containing the a function with two arguments and returning a date. The DateFunctions.cfc file is as follows:
<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>
Question: How can I invoke "addBusinessDays" from within the query in (info.cfc) also producing another column of results.
I thought I might have been able to do something like:
<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>
Upvotes: 4
Views: 2154
Reputation: 11120
Rather than creating the df object, it should be tied to the this
scope. That way the object is created only once. This should make the viewDate
function run faster as there is no overhead in creating df
.
Also, new
is just a cleaner syntax
<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>
Upvotes: 0
Reputation: 679
You could do the following with the caveat of there would be additional processing for the loop.
Edit: Per discussion below, updated cfoutput to 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>
Upvotes: 1