Solved

Loop Within Loop

Posted on 2004-08-25
12
737 Views
Last Modified: 2013-12-24
One of my developers told me there is a bug with Coldfusion with loops within loops when looping on querys. In disbelief I tested it and he is correct. Here is a simple example.

I'm just pulling out 3 states and 3 categories, and want to loop through each category for each state, but the state never changes. I can access the changed state within the outer loop but not within the inner loop.

<cfquery name="GetState" datasource="AustralianBridalDirectory">
      select            top 3 *
      from            syState
      order by      StateCode
</cfquery>

<cfquery name="GetCategory" datasource="AustralianBridalDirectory">
      select            top 3 *
      from            vtVotingCategory
</cfquery>

<cfoutput query="GetState">
      <cfloop query="GetCategory">
             #GetState.StateCode# - #CategoryName#<br>
      </cfloop>
      <br>
</cfoutput>

Here's the output.

ACT - Accessories, Lingerie & Shoes
ACT - Bomboniere
ACT - Bridal Clothing

ACT - Accessories, Lingerie & Shoes
ACT - Bomboniere
ACT - Bridal Clothing

ACT - Accessories, Lingerie & Shoes
ACT - Bomboniere
ACT - Bridal Clothing


I want to know if this is a known bug / feature? And how you guys handle this, I know I could do this in one query, but I want to know how when needed I loop over two queries within each other.
0
Comment
Question by:Plucka
  • 3
  • 3
  • 2
  • +4
12 Comments
 
LVL 17

Expert Comment

by:Tacobell777
ID: 11899144
how about

<cfoutput query="GetState">
     <cfloop query="GetCategory">
           #GetState.StateCode# - #GetCategory.CategoryName#<br>
     </cfloop>
     <br>
</cfoutput>

I believe its a bug..
0
 
LVL 18

Author Comment

by:Plucka
ID: 11899200
Same problem
0
 
LVL 9

Expert Comment

by:shooksm
ID: 11899225
Known bug.  We train our developers to set variables to hold the outside loop data:

<cfoutput query="GetState">
     <cfset VARIABLES.StateCode = GetSate.StateCode>
     <cfloop query="GetCategory">
           #VARIABLES.StateCode# - #CategoryName#<br>
     </cfloop>
     <br>
</cfoutput>

The other option is to use the queries as arrays and make sure you use a unique index for each loop.
0
 
LVL 12

Expert Comment

by:jyokum
ID: 11899245
here's a workaround

<cfoutput query="GetState">
      <cfset thisStateCode=GetState.StateCode>
      <cfloop query="GetCategory">
            #thisStateCode# - #GetCategory.CategoryName#<br>
      </cfloop>
      <br>
</cfoutput>
0
 
LVL 12

Expert Comment

by:jyokum
ID: 11899251
oops... yeah, what shooksm said
0
 
LVL 18

Author Comment

by:Plucka
ID: 11899258
Yeah,

That's what we currently do.

Don't quite understand why there is an issue though, doing the same thing on an index loop works fine.
0
Comprehensive Backup Solutions for Microsoft

Acronis protects the complete Microsoft technology stack: Windows Server, Windows PC, laptop and Surface data; Microsoft business applications; Microsoft Hyper-V; Azure VMs; Microsoft Windows Server 2016; Microsoft Exchange 2016 and SQL Server 2016.

 
LVL 14

Accepted Solution

by:
Renante Entera earned 500 total points
ID: 11899310
Actually, here is another workaround.  You can also do it without setting for another variable.

Try this :

<cfoutput query="GetState">
     <cfloop query="GetCategory">
           #GetState.StateCode[GetState.currentrow]# - #CategoryName#<br>
     </cfloop>
     <br>
</cfoutput>


Regards!
eNTRANCE2002 :-)
0
 
LVL 21

Expert Comment

by:pinaldave
ID: 11899430
Hi Plucka,

many many many thanks for bringing this on desk. I had same problem two weeks ago and was lost like anything. We end up doing some SQL things and DBA handled things differently and gave one column which have things to look up. I was just denying that I am doing something wrong and my team was just speachless.
I thank you shooksm, jyokum and enterance also for providing this workaround. I will have to save this thread for future use.
Thank you all.

Regards,
---Pinal
0
 
LVL 9

Expert Comment

by:CFDevHead
ID: 11899532
I don't belive this is a BUG. If you think about it makes sense  example if you write a query
<cfquery name="GetState" datasource="AustralianBridalDirectory">
     select          top 3 *
     from          syState
     order by     StateCode
</cfquery>

and then reference a field from the query like so
<cfoutput>
#GetState.StateCode#
<cfoutput>
you will get the first record.

so if you write  this
<cfquery name="GetCategory" datasource="AustralianBridalDirectory">
     select          top 3 *
     from          vtVotingCategory
</cfquery>
<cfquery name="GetState" datasource="AustralianBridalDirectory">
     select          top 3 *
     from          syState
     order by     StateCode
</cfquery>
<cfoutput query="GetState">
     <cfloop query="GetCategory">
           #GetState.StateCode# - #CategoryName#<br>
     </cfloop>
     <br>
</cfoutput>

you should get the same record everytime when calling the field like this GetState.StateCode to keep CF Consistent

so te correct way to do what you want to do.  Should be something like this

<cfoutput query="GetState">
     <cfset tempStateCode=GetState.StateCode>
     <cfloop query="GetCategory">
          #tempStateCode# - #GetCategory.CategoryName#<br>
     </cfloop>
     <cfset tempStateCode=''>
     <br>
</cfoutput>

Just thought Iwould give my two cents.

P.S I hope this made sense
0
 
LVL 17

Expert Comment

by:Tacobell777
ID: 11900362
I think I know the answer, I believe I implemented this (but not sure anymore ;-)

You need to use the index, i.e.

<cfloop from="1" to="#GetState.recordCount#" index="i1">
<cfloop from="1" to="#GetCategory.recordCount#" index="i2">
#GetState..tempStateCode[ variables.i1 ]# - #GetCategory.CategoryName[ variables.i2 ]#<br>
</cfloop>
</cfloop>

if this is not the answer, then blame it on the beer ;-))
0
 
LVL 17

Expert Comment

by:Tacobell777
ID: 11900442
;-) just read the whole thread - just ignore me... See that people already gave the same answer ;-))
0
 
LVL 18

Author Comment

by:Plucka
ID: 11908527
I think it is a bug, as it works differently to other types of loops.

I think the solution posted by entrance is very simple, clean and nice. This is the method we will be using.
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
XML problem with Internet Explorer 7 40
php.ini on ipage hosting 12 47
whm high memory usage in processes 7 70
Redirect to HTTPS results in Infinite LOOP 4 91
A web service (http://en.wikipedia.org/wiki/Web_service) is a software related technology that facilitates machine-to-machine interaction over a network. This article helps beginners in creating and consuming a web service using the ColdFusion Ma…
When it comes to showing a 404 error page to your visitors, you do not want that generic page to show, and you especially do not want your hosting provider’s ad error page to show either. In this article, I will show you how to enable the custom 40…
Windows 10 is mostly good. However the one thing that annoys me is how many clicks you have to do to dial a VPN connection. You have to go to settings from the start menu, (2 clicks), Network and Internet (1 click), Click VPN (another click) then fi…
Hi friends,  in this video  I'll show you how new windows 10 user can learn the using of windows 10. Thank you.

895 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

15 Experts available now in Live!

Get 1:1 Help Now