2009-06-30 5 views
7

मेरे पास तालिका में कॉलम नामों का एक सेट है - उदा। foo1, foo2, foo3, foo4। मैं गतिशील रूप से एक पाश के माध्यम से इन स्तंभ नाम का उल्लेख करना चाहते हैं:कोल्डफ्यूजन - परिवर्तनीय फ़ील्ड नाम जब डेटाबेस क्वेरी परिणामों के माध्यम से लूपिंग

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

से काम नहीं होता - ColdFusion एक "चर परिभाषित नहीं" त्रुटि फेंकता है, भले ही query.foo1 के लिए एक वैध संदर्भ है प्रश्न परिणाम मैं यह और कैसे कर सकता हूं?

उत्तर

21

Evaluate() का उपयोग ऐसी चीजों के लिए न करें! यह धीमा है और should be avoided है।

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

या, यदि आप चाहते:

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

Evaluate() कोड के टुकड़े के मूल्यांकन के लिए है। उन चीज़ों के लिए इसका उपयोग न करें जिन्हें भाषा-एकीकृत, अधिक उपयुक्त तरीकों से अधिक सुन्दर तरीके से हल किया जा सके।

संपादित करें:

क्वेरी तक पहुँचने "कोण कोष्ठक" -syntax साथ वस्तुओं है, तो आप (1-आधारित) पंक्ति संख्या सूचकांक (query["foo#i#"][RowNum]) संलग्न करना होगा। पारंपरिक "डॉट" -सिंटाक्स (query.foo1) का उपयोग करते समय, वर्तमान पंक्ति निहित है।

वर्तमान पंक्ति को स्पष्ट रूप से एक्सेस करने के लिए, QueryObject.CurrentRow संपत्ति का उपयोग करें। लेकिन यह QueryObject.RecordCount तक कोई सकारात्मक पूर्णांक हो सकता है। CurrentRow के अलावा किसी अन्य चीज़ के लिए एक श्रेणी की जांच की सलाह दी जाती है।

यह एक दिलचस्प फ़ील्ड खुलता है: आप "यादृच्छिक पहुंच" के साथ क्वेरी ऑब्जेक्ट्स का उपयोग शुरू कर सकते हैं। पहले (सीएफएमएक्स से पहले) आप जो कुछ भी कर सकते थे, उन्हें शुरू करने से शुरू करने के लिए उन्हें शुरू कर दिया गया था। अब यह एक नेस्टेड स्ट्रक्चर/सरणी डेटा संरचना की तरह है जिसे आप विभिन्न तरीकों से उपयोग कर सकते हैं।

+0

दुर्भाग्य से, उन कार्यों में से कोई भी नहीं - कोल्डफ्यूजन मुझे बताता है "मान foo1 को किसी संख्या में परिवर्तित नहीं किया जा सकता है।" – ClairelyClaire

+0

ओह, मैं देखता हूं। रुको, कोण ब्रैकेट सिंटैक्स के साथ क्वेरी पंक्तियों को कैसे संबोधित करें के बारे में थोड़ा सा पकड़ है। – Tomalak

+0

मैं उस दस्तावेज़ में नहीं देख रहा हूं जिसमें आपने लिंक किया है - कोई सुझाव? – ClairelyClaire

2

आप बहुत करीब हैं। इसे आज़माएं:

<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

मुझे पता है कि इस तरह के सामान के लिए मूल्यांकन() पारंपरिक रूप से (यानी सीएफ 5 तक) का उपयोग किया गया है, लेकिन सीएफ 6 के बाद से यह अनावश्यक है और आम तौर पर अनुशंसित नहीं है। यहां तक ​​कि मैक्रोमीडिया/एडोब भी इसका उपयोग हतोत्साहित करता है: http://livedocs.adobe.com/coldfusion/7/htmldocs/00000946.htm – Tomalak

+0

बहुत बढ़िया, मुझे यह एहसास नहीं हुआ। धन्यवाद। –

संबंधित मुद्दे