2017-05-17 54 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 

這兩個都允許您以更具描述性的方式命名查詢。