CFML 将 evaluate() 查询字符串转换为结构语法
CFML converting evaluate() query string to structure syntax
我在一个循环内有下面的代码,因此当循环迭代时,我将动态变量 temp
设置为当前循环迭代的 getAdvisor_Advisors.advisor_ID
的值。
<cfset temp = "getAdvisor_Advisors#LoopCount#.advisor_ID">
下面的这个 cfinvoke 调用了一个查询,我在动态 "temp" 变量中传递了这个查询,但必须在它周围使用缓慢的 evaluate(temp) 才能获得正确的值。
<cfinvoke component="com.appointments" method="get_All_Appointments" returnvariable="getAppointments">
<cfinvokeargument name="Advisor_ID" value="#evaluate(temp)#">
<cfinvokeargument name="StartDay" value="#dateFormat(form.cal,'dd')#">
<cfinvokeargument name="StartMonth" value="#dateFormat(form.cal,'mm')#">
<cfinvokeargument name="StartYear" value="#dateformat(form.cal,'yyyy')#">
</cfinvoke>
我想重写 temp
变量和 evaluate()
以不使用求值。有人告诉我可以使用结构语法来引用它,如下所示:
没有计算:
<cfset foo = qBar["text#lang#"][CurrentRow]>
getAdvisor_Advisor["advisor_ID"][CurrentRow]
如何重写
<cfset temp = "getAdvisor_Advisors#LoopCount#.advisor_ID">
使用结构语法?
添加更多代码以便您了解为什么这很复杂这些是复合循环。
<cfquery name="getAdvisor_Advisors1" dbtype="query" cachedWithin="#CreateTimeSpan(0,0,15,0)#">
Select *
From getAdvisors
Where Express = 'FR/SO'
Order by Specialization, Advisor
</cfquery>
<cfquery name="getAdvisor_Advisors2" dbtype="query" cachedWithin="#CreateTimeSpan(0,0,15,0)#">
Select *
From getAdvisors
Where Express = 'JR/SR'
Order by Specialization, Advisor
</cfquery>
<cfquery name="getAdvisor_Advisors3" dbtype="query" cachedwithin="#CreateTimeSpan(0,0,15,0)#">
Select *
From getAdvisors
Where Specialization IS NULL AND Appointments = 1 AND Campus_ID > 0
Order by Campus_ID, Advisor
</cfquery>
<cfquery name="getAdvisor_Advisors4" dbtype="query" cachedwithin="#CreateTimeSpan(0,0,15,0)#">
Select *
From getAdvisors
Where Specialization IS NOT NULL
AND Title != 'BCC-GA'
Order by Specialization, Advisor
</cfquery>
<div id="calendarGrid">
<!--- looping over the filter queries above that split advisors into groups --->
<cfloop index="LoopCount" from = "1" to = "4">
<!--- FR/SO Advisors --->
<cfif LoopCount LTE 3>
<cfset currGroup = "campus_id">
<cfelse>
<cfset currGroup = "specialization">
</cfif>
<cfoutput query="getAdvisor_Advisors#LoopCount#" group="#currGroup#">
<div class="advisorGrouping">
<div id="calcontainer">
<table class="pickme" border="0" cellspacing="1" cellpadding="1">
<tr class="hdr">
<td width="6.9%">
<cfif (Specialization IS "BCC") OR (Specialization IS "HONORS")>
#uCase(Specialization)#
<cfelse>
#uCase(Campus_Text)#
<cfif Len(Express) NEQ 0>
- #uCase(Express)#
</cfif>
</cfif>
</td>
<td width="4.9%" class="border">8:00</td>
<td width="4.9%" class="border">8:30</td>
<td width="4.9%" class="border">9:00</td>
<td width="4.9%" class="border">9:30</td>
<td width="4.9%" class="border">10:00</td>
<td width="4.9%" class="border">10:30</td>
<td width="4.9%" class="border">11:00</td>
<td width="4.9%" class="border">11:30</td>
<td width="4.9%" class="border">12:00</td>
<td width="4.9%" class="border">12:30</td>
<td width="4.9%" class="border">1:00</td>
<td width="4.9%" class="border">1:30</td>
<td width="4.9%" class="border">2:00</td>
<td width="4.9%" class="border">2:30</td>
<td width="4.9%" class="border">3:00</td>
<td width="4.9%" class="border">3:30</td>
<td width="4.9%" class="border">4:00</td>
<td width="4.9%" class="border">4:30</td>
<td width="4.9%" class="border">5:00</td>
</tr>
<cfoutput group="advisor_id">
<cfset temp = "getAdvisor_Advisors#LoopCount#.advisor_ID">
<!--- get Appts for cal date --->
<cfinvoke component="com.appointments" method="get_All_Appointments" returnvariable="getAppointments">
<cfinvokeargument name="Advisor_ID" value="#evaluate(temp)#">
<cfinvokeargument name="StartDay" value="#dateFormat(form.cal,'dd')#">
<cfinvokeargument name="StartMonth" value="#dateFormat(form.cal,'mm')#">
<cfinvokeargument name="StartYear" value="#dateformat(form.cal,'yyyy')#">
</cfinvoke>
您当前的方法比必要的更复杂,并且您的循环中发生了太多事情。从每次循环迭代都不会改变的事情开始。
myObject = CreateObject("component","com.appointments");
argumentStructure = StructNew();
argumentStructure.StartDay= dateFormat(form.cal,'dd');
argumentStructure.StartMonth= dateFormat(form.cal,'mm');
argumentStructure.StartYear = dateFormat(form.cal,'yyyy');
</cfscript>
然后循环。
<cfloop query = "getAdvisor_Advisor">
<cfscript>
argumentStructure.advisor_ID = advisor_ID;
variableFromObject = myObject.get_All_Appointments(argumentCollection = argumentStructure);
// code to process that variable
</cfscript>
</cfloop>
请注意,问题没有关于方法返回什么的信息。该特定细节可能会影响答案的最后一部分。
要回答这个问题,您可以使用 QueryToStruct。设置一个数组,每个索引都是查询的结构。
<!--- CREATE THE ARRAY --->
<cfset temp = arrayNew(1)>
<cfquery name="getAdvisor_Advisors1" dbtype="query" cachedWithin="#CreateTimeSpan(0,0,15,0)#">
Select *
rom getAdvisors
Where Express = 'FR/SO'
Order by Specialization, Advisor
</cfquery>
<!--- CREATE AND FILL THE STRUCT --->
<cfset temp[1] = QueryToStruct(getAdvisor_Advisors1)>
然后您可以遍历该数组 temp
并输出值。
<cfloop from="1" to="#arrayLen(temp)#" index="t">
...
<cfinvokeargument name="Advisor_ID" value="#temp[t].advisor_ID#">
...
</cfloop>
QueryToStruct 的信息:https://gist.github.com/erikvold/764276
这是它工作的屏幕截图:
原回答:
为什么不使用 cfloop
或 cfoutput
的查询?然后它是微不足道的:
<cfloop query = "getAdvisor_Advisor">
<cfinvoke component="com.appointments" method="get_All_Appointments" returnvariable="getAppointments">
<cfinvokeargument name="Advisor_ID" value="#getAdvisor_Advisors.advisor_ID#">
<cfinvokeargument name="StartDay" value="#dateFormat(form.cal,'dd')#">
<cfinvokeargument name="StartMonth" value="#dateFormat(form.cal,'mm')#">
<cfinvokeargument name="StartYear" value="#dateformat(form.cal,'yyyy')#">
</cfinvoke>
</cfloop>
variables["getAdvisor_Advisors#LoopCount#"].advisor_ID[variables["getAdvisor_Advisors#LoopCount#"].currentRow]`
还请记住,变量通常引用对象,因此您还可以通过使用另一个变量名引用它来清理代码...
currentQuery = variables["getAdvisor_Advisors#LoopCount#"];
currentQuery.advisor_ID[currentQuery.currentRow]`
另外一个建议。当我想要一个查询列表或要执行的操作时,我通常会将查询放入一个结构中然后遍历它们,或者有一个要循环的名称列表。
例如,如果顺序无关紧要...
<cfset queries = {} />
<cfquery name="queries.AdvisoryQuery1Name" ...>
...
</query>
<cfloop collection="#queries#" ...
或者如果顺序很重要并且有一组已知的名称,您可以遍历列表或数组。该列表也可以动态生成。
<cfloop list="FR_SO_ExpressAdvisors,JR_SR_ExpressAdvisors,etc" index="queryname">
<cfset query = variables[queryname] />
.... etc
这两者都允许您以更具描述性的方式命名查询。
我在一个循环内有下面的代码,因此当循环迭代时,我将动态变量 temp
设置为当前循环迭代的 getAdvisor_Advisors.advisor_ID
的值。
<cfset temp = "getAdvisor_Advisors#LoopCount#.advisor_ID">
下面的这个 cfinvoke 调用了一个查询,我在动态 "temp" 变量中传递了这个查询,但必须在它周围使用缓慢的 evaluate(temp) 才能获得正确的值。
<cfinvoke component="com.appointments" method="get_All_Appointments" returnvariable="getAppointments">
<cfinvokeargument name="Advisor_ID" value="#evaluate(temp)#">
<cfinvokeargument name="StartDay" value="#dateFormat(form.cal,'dd')#">
<cfinvokeargument name="StartMonth" value="#dateFormat(form.cal,'mm')#">
<cfinvokeargument name="StartYear" value="#dateformat(form.cal,'yyyy')#">
</cfinvoke>
我想重写 temp
变量和 evaluate()
以不使用求值。有人告诉我可以使用结构语法来引用它,如下所示:
没有计算:
<cfset foo = qBar["text#lang#"][CurrentRow]>
getAdvisor_Advisor["advisor_ID"][CurrentRow]
如何重写
<cfset temp = "getAdvisor_Advisors#LoopCount#.advisor_ID">
使用结构语法?
添加更多代码以便您了解为什么这很复杂这些是复合循环。
<cfquery name="getAdvisor_Advisors1" dbtype="query" cachedWithin="#CreateTimeSpan(0,0,15,0)#">
Select *
From getAdvisors
Where Express = 'FR/SO'
Order by Specialization, Advisor
</cfquery>
<cfquery name="getAdvisor_Advisors2" dbtype="query" cachedWithin="#CreateTimeSpan(0,0,15,0)#">
Select *
From getAdvisors
Where Express = 'JR/SR'
Order by Specialization, Advisor
</cfquery>
<cfquery name="getAdvisor_Advisors3" dbtype="query" cachedwithin="#CreateTimeSpan(0,0,15,0)#">
Select *
From getAdvisors
Where Specialization IS NULL AND Appointments = 1 AND Campus_ID > 0
Order by Campus_ID, Advisor
</cfquery>
<cfquery name="getAdvisor_Advisors4" dbtype="query" cachedwithin="#CreateTimeSpan(0,0,15,0)#">
Select *
From getAdvisors
Where Specialization IS NOT NULL
AND Title != 'BCC-GA'
Order by Specialization, Advisor
</cfquery>
<div id="calendarGrid">
<!--- looping over the filter queries above that split advisors into groups --->
<cfloop index="LoopCount" from = "1" to = "4">
<!--- FR/SO Advisors --->
<cfif LoopCount LTE 3>
<cfset currGroup = "campus_id">
<cfelse>
<cfset currGroup = "specialization">
</cfif>
<cfoutput query="getAdvisor_Advisors#LoopCount#" group="#currGroup#">
<div class="advisorGrouping">
<div id="calcontainer">
<table class="pickme" border="0" cellspacing="1" cellpadding="1">
<tr class="hdr">
<td width="6.9%">
<cfif (Specialization IS "BCC") OR (Specialization IS "HONORS")>
#uCase(Specialization)#
<cfelse>
#uCase(Campus_Text)#
<cfif Len(Express) NEQ 0>
- #uCase(Express)#
</cfif>
</cfif>
</td>
<td width="4.9%" class="border">8:00</td>
<td width="4.9%" class="border">8:30</td>
<td width="4.9%" class="border">9:00</td>
<td width="4.9%" class="border">9:30</td>
<td width="4.9%" class="border">10:00</td>
<td width="4.9%" class="border">10:30</td>
<td width="4.9%" class="border">11:00</td>
<td width="4.9%" class="border">11:30</td>
<td width="4.9%" class="border">12:00</td>
<td width="4.9%" class="border">12:30</td>
<td width="4.9%" class="border">1:00</td>
<td width="4.9%" class="border">1:30</td>
<td width="4.9%" class="border">2:00</td>
<td width="4.9%" class="border">2:30</td>
<td width="4.9%" class="border">3:00</td>
<td width="4.9%" class="border">3:30</td>
<td width="4.9%" class="border">4:00</td>
<td width="4.9%" class="border">4:30</td>
<td width="4.9%" class="border">5:00</td>
</tr>
<cfoutput group="advisor_id">
<cfset temp = "getAdvisor_Advisors#LoopCount#.advisor_ID">
<!--- get Appts for cal date --->
<cfinvoke component="com.appointments" method="get_All_Appointments" returnvariable="getAppointments">
<cfinvokeargument name="Advisor_ID" value="#evaluate(temp)#">
<cfinvokeargument name="StartDay" value="#dateFormat(form.cal,'dd')#">
<cfinvokeargument name="StartMonth" value="#dateFormat(form.cal,'mm')#">
<cfinvokeargument name="StartYear" value="#dateformat(form.cal,'yyyy')#">
</cfinvoke>
您当前的方法比必要的更复杂,并且您的循环中发生了太多事情。从每次循环迭代都不会改变的事情开始。
myObject = CreateObject("component","com.appointments");
argumentStructure = StructNew();
argumentStructure.StartDay= dateFormat(form.cal,'dd');
argumentStructure.StartMonth= dateFormat(form.cal,'mm');
argumentStructure.StartYear = dateFormat(form.cal,'yyyy');
</cfscript>
然后循环。
<cfloop query = "getAdvisor_Advisor">
<cfscript>
argumentStructure.advisor_ID = advisor_ID;
variableFromObject = myObject.get_All_Appointments(argumentCollection = argumentStructure);
// code to process that variable
</cfscript>
</cfloop>
请注意,问题没有关于方法返回什么的信息。该特定细节可能会影响答案的最后一部分。
要回答这个问题,您可以使用 QueryToStruct。设置一个数组,每个索引都是查询的结构。
<!--- CREATE THE ARRAY --->
<cfset temp = arrayNew(1)>
<cfquery name="getAdvisor_Advisors1" dbtype="query" cachedWithin="#CreateTimeSpan(0,0,15,0)#">
Select *
rom getAdvisors
Where Express = 'FR/SO'
Order by Specialization, Advisor
</cfquery>
<!--- CREATE AND FILL THE STRUCT --->
<cfset temp[1] = QueryToStruct(getAdvisor_Advisors1)>
然后您可以遍历该数组 temp
并输出值。
<cfloop from="1" to="#arrayLen(temp)#" index="t">
...
<cfinvokeargument name="Advisor_ID" value="#temp[t].advisor_ID#">
...
</cfloop>
QueryToStruct 的信息:https://gist.github.com/erikvold/764276
这是它工作的屏幕截图:
原回答:
为什么不使用 cfloop
或 cfoutput
的查询?然后它是微不足道的:
<cfloop query = "getAdvisor_Advisor">
<cfinvoke component="com.appointments" method="get_All_Appointments" returnvariable="getAppointments">
<cfinvokeargument name="Advisor_ID" value="#getAdvisor_Advisors.advisor_ID#">
<cfinvokeargument name="StartDay" value="#dateFormat(form.cal,'dd')#">
<cfinvokeargument name="StartMonth" value="#dateFormat(form.cal,'mm')#">
<cfinvokeargument name="StartYear" value="#dateformat(form.cal,'yyyy')#">
</cfinvoke>
</cfloop>
variables["getAdvisor_Advisors#LoopCount#"].advisor_ID[variables["getAdvisor_Advisors#LoopCount#"].currentRow]`
还请记住,变量通常引用对象,因此您还可以通过使用另一个变量名引用它来清理代码...
currentQuery = variables["getAdvisor_Advisors#LoopCount#"];
currentQuery.advisor_ID[currentQuery.currentRow]`
另外一个建议。当我想要一个查询列表或要执行的操作时,我通常会将查询放入一个结构中然后遍历它们,或者有一个要循环的名称列表。
例如,如果顺序无关紧要...
<cfset queries = {} />
<cfquery name="queries.AdvisoryQuery1Name" ...>
...
</query>
<cfloop collection="#queries#" ...
或者如果顺序很重要并且有一组已知的名称,您可以遍历列表或数组。该列表也可以动态生成。
<cfloop list="FR_SO_ExpressAdvisors,JR_SR_ExpressAdvisors,etc" index="queryname">
<cfset query = variables[queryname] />
.... etc
这两者都允许您以更具描述性的方式命名查询。