2017-05-17 50 views
6

我在循环内部有下面的代码,以便循环迭代我将当前循环迭代的动态变量temp设置为getAdvisor_Advisors.advisor_ID的值。CFML将evaluate()查询字符串转换为结构语法

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

下面这CFINVOKE调用我通过在动态“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> 
+2

变量的范围是什么?使用相同的括号表示法语法,只需添加范围即'#scopeName [“get_Advisors”&loopIndex] [“advisor_ID”] [someRowNumber]#'。可能还想调查动态变量名是否是必要的。 – Leigh

+0

目前“temp”是一个变量作用域,但如果我可以使用直接表示法,则不需要临时变量。我只是知道我可以通过在临时动态上使用evaluate()来达到目标​​......这种方法的工作起来很慢,但并不是最佳实践。 但我需要的值是一个cfquery“getAdvisor_Advisor.advisor_ID”是一个带有advisor_ID列的cfquery。 – user2676844

+0

使用上面的括号表示法进行尝试。尽管如此,根据代码的作用,可能并不需要动态名称。 – Leigh

回答

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

原来的答复: 为什么不使用查询的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> 
+0

这是行不通的,因为我不在寻找getAdvisor_Advisor查询的当前行我正在寻找getAdvisor_Advisor#X#查询的当前行。这是查询的4种不同查询之一,具体取决于我们在哪里索引循环 – user2676844

+0

噢,我明白了,当我回到桌面时,我会重写我的答案 – Jules

+0

这看起来是正确的,但是当我尝试页面尽快死掉时,您的修改答案像它不能运行那部分...也没有错误信息 – user2676844

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> 

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

+0

这将返回日历和给定顾问上给定日期的所有约会。然后它就在循环顾问组中循环。 – user2676844

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 

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