 |
Soms heb je dat: je wilt iets in CF, maar de boeken bieden geen oplossing.
Op internet surfen en zoeken helpt ook niet. Nergens kun je referenties
(of achtergrondinformatie) vinden over het probleem waar je mee zit...
CFLOOP is zoiets. |
| |
|
CFLOOP is zoiets.
In boeken staat meestal de basis over hoe CFLOOP werkt. Maar dan...
Ik wilde een CFLOOP hebben die niet verticaal door een tabel heen
'loopte' (dat is geen kunst), maar horizontaal - dus door 1 rij
-. Bovendien wilde ik dat er tegelijkertijd in ieder veld - uit die specifieke
rij ! - gegevens met een SQL-Insert werd weggeschreven.
Met andere woorden: Hoe realiseer je een CFLOOP door een tableRow in
plaats van een tableColumn?
Voor wat het waard is hier een oplossing - - - en een vervolg!
Horizontal Looping over an query
Gegeven: De tableRow bestaat uit velden met de namen: Vr1, Vr2, Vr3,
Vr4, Vr5.<br>
Je wil uit rij 1 alle waarden uit die velden ophalen.<br>
Op zich kan dat door steeds alle velden hard te coderen in je pagina met
CFOUTPUT QUERY="":
________________________________
<cfoutput query="RSView">
<b>
#Vr1#<br>
#Vr2#<br>
#Vr3#<br>
#Vr4#<br>
#Vr5#<br>
</b>
</cfoutput>
________________________________
Maar dat willen we niet.
Voor 5 velden gaat het nog wel, maar voor 100 wordt dat wat veel typewerk.
Daarom willen we een CFLOOP gebruiken om dat automatisch voor ons te laten
doen.
OK, denken we dan. Dan zal de volgende code wel de oplossing brengen:
________________________________
<CFLOOP from=1 to=5 index="ind">
<CFOUTPUT>
<CFSET ditVeld="RSView.vr#ind#">
<b>
#ditVeld#<br>
</b>
</CFOUTPUT>
</CFLOOP>
________________________________
Mis. Want wat getoond wordt zijn de veldNAMEN en NIET de inhoud ervan.
Het gaat ons om inhoud!
De feitelijke code om de INHOUD te bereiken is:
________________________________
<CFLOOP from=1 to=5 index="ind">
<CFOUTPUT>
<CFSET ditVeld="RSView.vr#ind#">
<b>
#evaluate(ditVeld)#<br>
</b>
</CFOUTPUT>
</CFLOOP>
________________________________
YES!
Zoals je ziet in de code is het enige verschil de toevoeging 'evaluate'.
In CFSET wordt de veldnaam samengesteld uit de string 'RSView.vr' en het
indexnummer '#ind#'.
Vervolgens: evaluate! Simpel...
Om tenslotte de SQL-Update er in te bouwen, laat ik graag aan je eigen
creativiteit over: dat moet nu niet meer al te moeilijk zijn.
...Maar mijn veldnamen hebben steeds een andere naam!...
en het aantal kolommen verschilt steeds.
Heel apart!
Tjarko Rikkerink, Senior Advanced Certified ColdFusion MX Developer
bij Prisma IT (dank!) komt met een 'knip en plak' oplossing.
Een horizontale loop over een recordset waarvan het aantal kolommen en de veld(kolom)namen onbekend zijn.
NB: geef je query even de naam qRecordset, dan zie je wat dit doet...
________________________________
<cfoutput>
<!--- Vertical loop --->
<cfloop from="1" to="#qRecordset.recordcount#" index="i">
<!--- Horizontal loop without
knowing the columns in your table --->
<cfloop list="#qRecordset.columnlist#"
index="column">
#column#
= #evaluate("qRecordset.#column#[i]")#
</cfloop>
</cfloop>
</cfoutput>
________________________________
|