2009-06-30 17 views
7

Tabloda bir dizi sütun ismim var - örn. foo1, foo2, foo3, foo4. query.foo1 geçerli bir referans için olsa bile, ColdFusion bir "değişken tanımlanmamış" hatası atıyor -Coldfusion - veritabanı sorgu sonuçları arasında döngü yaparken değişken alan adı

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

yukarıdaki çalışmaz: Dinamik bir döngü aracılığıyla bu sütun adları başvurmak istiyorum sorgu sonuçları. Bunu başka nasıl yapabilirim?

cevap

21

bunun gibi şeyler için Evaluate() kullanmayın! Yavaş ve should be avoided.

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

Veya, eğer isterseniz:

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

Evaluate()

kod bitlerini değerlendirmek içindir. Dile entegre, daha uygun şekillerde daha zarif bir şekilde çözülebilen şeyler için kullanmayın.

DÜZENLEME:

Sorgu erişen "açılı ayraç" -Sözdizimi nesneleri yaparken (1 tabanlı) sıralı sayı endeksi (query["foo#i#"][RowNum]) eklemek gerekir. Geleneksel "dot" -syntax (query.foo1) kullanıldığında, geçerli satır gizlidir.

Geçerli satıra açıkça erişmek için QueryObject.CurrentRow özelliğini kullanın. Ancak QueryObject.RecordCount'a kadar herhangi bir pozitif tam sayı olabilir. CurrentRow'dan başka bir şey için bir aralık kontrolü önerilir.

Bu ilginç bir alan açar: "Rasgele erişim" ile sorgu nesnelerini kullanmaya başlayabilirsiniz. Önceden (CFMX'ten önce) yapabileceğiniz tek şey, aradığınız şeyleri ortaya çıkarmak için onları baştan sona itebiliyordu. Artık farklı şekillerde kullanabileceğiniz iç içe geçmiş bir yapı/dizi veri yapısı gibi.

+0

Ne yazık ki, bu çalışmaların hiçbiri - ColdFusion bana "foo1 değeri bir sayıya dönüştürülemez" diyor. – ClairelyClaire

+0

Oh, anlıyorum. Bekleyin, açılı ayraç sözdizimi ile sorgu satırları adresleme hakkında biraz yakalamak var. – Tomalak

+0

Bağlandığınız belgelerde bunu görmüyorum - herhangi bir öneriniz var mı? – ClairelyClaire

2

Çok yakınsınız. Bu deneyin:

<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

Evaluate() yönteminin bu tür şeyler için geleneksel olarak (örneğin CF5'e kadar) kullanıldığını biliyorum, ancak CF6'dan beri gereksiz ve genellikle tavsiye edilmez. Macromedia/Adobe bile kullanımının önünü açıyor: http://livedocs.adobe.com/coldfusion/7/htmldocs/00000946.htm – Tomalak

+0

Harika, bunun farkında değildim. Teşekkürler. –

İlgili konular