2009-06-30 10 views
7

Tengo un conjunto de nombres de columna en una tabla, p. foo1, foo2, foo3, foo4. Quiero hacer referencia a estos nombres de columna dinámicamente a través de un bucle:Coldfusion: nombre del campo variable cuando se realiza un bucle a través de los resultados de la consulta de base de datos

<cfloop index="i" from="1" to="4"> 
    <cfset foo = Evaluate("query.foo" & i)> 
</cfloop> 

Lo anterior no funciona - ColdFusion genera un error "variable no definida", a pesar de que query.foo1 es una referencia válida a la resultados de consulta ¿De qué otra manera puedo hacer esto?

Respuesta

21

No utilice Evaluate() de cosas por el estilo! Es lento y should be avoided.

<cfloop index="i" from="1" to="4"> 
    <cfset foo = query["foo" & i][query.CurrentRow]> 
</cfloop> 

O, si se quiere:

<cfloop index="i" from="1" to="4"> 
    <cfset foo = query["foo#i#"][query.CurrentRow]> 
</cfloop> 

Evaluate() es para la evaluación de bits de código. No lo use para cosas que se puedan resolver de manera más elegante en formas integradas y más apropiadas para el lenguaje.

EDIT:

Al acceder Objetos de la consulta con la -Sintaxis "ángulo del soporte", debe añadir el índice de número de fila (basado-1) (query["foo#i#"][RowNum]). Cuando se usa la tradicional "punto" -sintaxis (query.foo1), la fila actual está implícita.

Para acceder a la fila actual explícitamente, utilice la propiedad QueryObject.CurrentRow. Pero podría ser cualquier entero positivo hasta QueryObject.RecordCount. Se recomienda una verificación de rango para cualquier cosa que no sea CurrentRow.

Esto abre un campo interesante: puede comenzar a utilizar objetos de consulta con "acceso aleatorio". Anteriormente (antes de CFMX) todo lo que podía hacer era iterarlos de principio a fin, sacando las cosas que buscaba. Ahora es como una estructura de datos estructura/matriz anidada que puede usar de diferentes maneras.

+0

Desafortunadamente, ninguno de esos trabajos - ColdFusion me dice "el valor de foo1 no se puede convertir en un número". – ClairelyClaire

+0

Oh, ya veo. Espere, hay un pequeño inconveniente sobre cómo direccionar las filas de consulta con la sintaxis del paréntesis angular. – Tomalak

+0

No veo eso en la documentación a la que vinculó, ¿alguna sugerencia? – ClairelyClaire

2

Estás muy cerca. Prueba esto:

<cfset query.foo1 = "foo val 1"> 
<cfset query.foo2 = "foo val 2"> 
<cfset query.foo3 = "foo val 3"> 
<cfset query.foo4 = "foo val 4"> 

<cfloop index="i" from="1" to="4"> 
     <cfset foo = Evaluate("query.foo#i#")> 
     <cfoutput>#foo#<br></cfoutput> 
</cfloop> 
+8

Sé que Evaluate() se ha utilizado tradicionalmente (es decir, hasta CF5) para este tipo de cosas, pero desde CF6 no es necesario y generalmente no es recomendable. Incluso Macromedia/Adobe desaconsejan su uso: http://livedocs.adobe.com/coldfusion/7/htmldocs/00000946.htm – Tomalak

+0

Impresionante, no me di cuenta de esto. Gracias. –

Cuestiones relacionadas