Sql 如何从一个CFC文件中函数的查询中调用另一个CFC文件中的函数?
我有一个cfc文件(info.cfc),具有如下所示的多个功能Sql 如何从一个CFC文件中函数的查询中调用另一个CFC文件中的函数?,sql,methods,coldfusion,invoke,Sql,Methods,Coldfusion,Invoke,我有一个cfc文件(info.cfc),具有如下所示的多个功能 <cfcomponent output="true" extends="DateFunctions"> <cffunction name="getStatuses" access="remote" returntype="any" output="true" returnformat="plain"> ... </cffunction> <cffunc
<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>
...
挑选
dbo.tickets.Incident,
dbo.tickets.Start_日期,
dbo.tickets.Days\u到期
从…起
dbo.tickets
另一个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>
您可以执行以下操作,但需要注意的是,循环将有额外的处理
编辑:根据下面的讨论,将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>
挑选
dbo.tickets.Incident,
dbo.tickets.Start_日期,
dbo.tickets.Days\u到期日,
“”作为到期日
从…起
dbo.tickets
与其创建df对象,不如将其绑定到此
范围。这样,对象只创建一次。这将使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>
挑选
dbo.tickets.Incident,
dbo.tickets.Start_日期,
dbo.tickets.Days\u到期日,
强制转换(日期时间为空)
从…起
dbo.tickets
生成HTML时,应在查看页面上完成此处理。为了回答此问题,我们需要查看addBusinessDays的代码。(编辑)CFC不能以这种方式使用。ColdFusion服务器和数据库是完全独立的。CF对数据库对象一无所知,而数据库对CFML一无所知,因此不能以这种方式将两者混合使用。ColdFusion的唯一工作就是充当信使。它在查询执行之前完成工作。CF计算任何cfml代码并将所有内容转换为文本。然后,它构建一个SQL字符串并将该字符串发送到数据库执行。此外,根据AddStudio的实际逻辑,您可以考虑将逻辑移动到数据库,并使用带有连接的日历数据库表或B)标量数据库函数。1)不要忘记瓦尔河/本地范围所有函数局部变量(查询名称也一样)2)删除“DBO.TabLNAME”。从CF循环。它不是查询列名的一部分3)由于代码没有显示任何内容,请使用cfloop
而不是cfoutput
另外4)不要使用“%”作为到期日“”,因为它不会为新列生成正确的数据类型和/或大小。相反,使用类似于CAST(NULL作为datetime)的内容作为到期日
。确切语法是dbms-specific.IMHO:函数应设置为output=“false”
,除非确实希望函数生成输出。在我的代码中,函数返回字符串比生成输出更常见。这与:@snackboy-它是:“显示输出…”。你说的是变量赋值。不一样。RE:它真的保留了查询列的数据类型吗这就是重点。查询列不是无类型的。sql使用错误的数据类型创建列。CFLoop现在实际上支持分组。虽然对于旧版本,是的,这是误用cfoutput的少数合法用例之一。@JamesAMohler-同意在不需要时抑制输出。我刚才谈到了在这种情况下不必要地使用cfoutput。医生的病情有所好转,但是。。仍然有很多不好的例子,到处都是多余的英镑符号、引号和滥用cfoutput;-)。这不仅仅是因为这些示例是丑陋的代码,它们有助于培养对cfml IMO某些方面的误解和误解。我意识到以上是基于前面的答案,但是,''到期日
应该替换为类似于CAST(NULL as datetime)
(特定于dbms)确保列类型正确。另请参见:
<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>