coldfusion structure cfml

coldfusion - CFML convierte la cadena de consulta de evaluación() en sintaxis de estructura



structure (3)

Para responder la pregunta, puede usar QueryToStruct. Establezca una matriz con cada índice como una estructura de la consulta.

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

Luego, más adelante puede recorrer esa temp matriz y generar los valores.

<cfloop from="1" to="#arrayLen(temp)#" index="t"> ... <cfinvokeargument name="Advisor_ID" value="#temp[t].advisor_ID#"> ... </cfloop>

Información para QueryToStruct: https://gist.github.com/erikvold/764276

Aquí hay una captura de pantalla de ella trabajando:

Respuesta original: ¿Por qué no utilizar la consulta para cfloop o cfoutput ? Entonces es trivial:

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

Tengo el siguiente código dentro de un bucle, así que a medida que el bucle itera estoy estableciendo una variable variable dinámica para el valor de getAdvisor_Advisors.advisor_ID para la iteración actual del bucle.

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

Este cfinvoke a continuación llama a una consulta que paso en la variable dinámica "temp", pero tengo que usar la evaluación lenta (temp) a su alrededor para obtener el valor adecuado.

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

Estoy queriendo reescribir la variable de temp y evaluate() para no usar la evaluación. Me dijeron que puedo usar la sintaxis de la estructura para hacer referencia a ella de la siguiente manera:

Sin evaluar:

<cfset foo = qBar["text#lang#"][CurrentRow]> getAdvisor_Advisor["advisor_ID"][CurrentRow]

¿Cómo reescribo?

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

usando la sintaxis estructural?

Agregar más código para que pueda ver por qué esto es complicado, estos son bucles compuestos.

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


Su enfoque actual es más complicado de lo necesario y tiene demasiado en juego dentro de su ciclo. Comience con las cosas que no cambian con cada iteración de bucle.

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>

Luego haz tu ciclo.

<cfloop query = "getAdvisor_Advisor"> <cfscript> argumentStructure.advisor_ID = advisor_ID; variableFromObject = myObject.get_All_Appointments(argumentCollection = argumentStructure); // code to process that variable </cfscript> </cfloop>

Tenga en cuenta que la pregunta no tiene información sobre lo que devuelve el método. Ese detalle particular podría afectar la última parte de la respuesta.


variables["getAdvisor_Advisors#LoopCount#"].advisor_ID[variables["getAdvisor_Advisors#LoopCount#"].currentRow]`

también recuerde que las variables generalmente hacen referencia a los objetos, por lo que también puede limpiar el código haciendo referencia a él por otro nombre de variable ...

currentQuery = variables["getAdvisor_Advisors#LoopCount#"]; currentQuery.advisor_ID[currentQuery.currentRow]`

También una sugerencia adicional. Cuando quiero tener una lista de consultas o acciones que tomar, generalmente colocaré las consultas en una estructura y luego iteraré sobre ellas o tendré una lista de nombres para repetir.

Entonces, por ejemplo, si el orden no importa ...

<cfset queries = {} /> <cfquery name="queries.AdvisoryQuery1Name" ...> ... </query> <cfloop collection="#queries#" ...

o si la orden es importante y hay un conjunto conocido de nombres, puede recorrer una lista o matriz. La lista también podría generarse dinámicamente.

<cfloop list="FR_SO_ExpressAdvisors,JR_SR_ExpressAdvisors,etc" index="queryname"> <cfset query = variables[queryname] /> .... etc

Ambos le permiten nombrar las consultas de una manera más descriptiva.