CFML将evaluate()查询字符串转换为结构语法

时间:2017-05-17 13:39:47

标签: coldfusion structure cfml

我在循环内部有以下代码,因此循环迭代我将动态变量temp设置为当前循环迭代的getAdvisor_Advisors.advisor_ID的值。

<cfset temp = "getAdvisor_Advisors#LoopCount#.advisor_ID">

下面的cfinvoke调用我在动态&#34; temp&#34;中传递的查询。变量,但必须使用它周围的慢评估(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()不要使用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>  

3 个答案:

答案 0 :(得分:1)

您当前的方法比必要的更复杂,并且您在循环内部进行了太多操作。从每次循环迭代不会改变的事情开始。

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>

请注意,该问题没有关于该方法返回的信息。这一特定细节可能会影响答案的最后部分。

答案 1 :(得分:1)

要回答这个问题,您可以使用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

以下是其工作的屏幕截图:enter image description here

原始回答: 为什么不使用cfloopcfoutput的查询?然后它是微不足道的:

<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>

答案 2 :(得分:1)

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

这两种方法都允许您以更具描述性的方式命名查询。