Solved

Coldfusion nested loops question

Posted on 2012-04-06
4
291 Views
Last Modified: 2012-04-08
Hi,

I have a CF9 page where I have 2 loops - an outer loop that loops over form variables and an inner query loop that checks to see if there is match in a form variable from the outer loop in the inner query loop. If there is a match, then I need to populate a structure with a key/value pair - a form variable value from the outer loop is key and the query's resultset value is the value.

I've tried to do this but it's not giving me the desired result. Here is the code that I have:

<cfset teamStruct = structnew() />
<cfloop index="loopCount" from="1" to="#val(form.schoolcount)#">
        <cfset variables.schoolname = form["schoolname_#LoopCount#"]>
        <cfset variables.teamname = form["sel_teamname_#LoopCount#"]>
        <!---begin check for teamnames--->
             <cfloop query="GetTeams">
                   <cfif GetTeams.team_name is variables.teamname>
                              <!---this is the struct that is not being updated properly--->
                    <cfset teamStruct[variables.schoolname] = GetTeams.team_name />
                </cfif>
             </cfloop>
</cfloop>
0
Comment
Question by:roger_v
  • 3
4 Comments
 
LVL 28

Expert Comment

by:Pravin Asar
ID: 37819479
Hope this clarifies how the array of structures works.
Here is complete example. You may also notice use of QueryNew() feature of CF9



<cfform name="f1">
<br/><cfinput type="hidden" name="schoolcount" value="3"/>
<br/><cfinput type="text" name="schoolname_1" value="school_1"/>
<cfinput type="text" name="sel_teamname_1" value="team_1"/>
<br/><cfinput type="text" name="schoolname_2" value="school_2"/>
<cfinput type="text" name="sel_teamname_2" value="team_2"/>
<br/><cfinput type="text" name="schoolname_3" value="school_3"/>
<cfinput type="text" name="sel_teamname_3" value="team_3"/>
<br/><cfinput type="submit" name="submit" value="Submit">
</cfform>
<cfexit>
</cfif>


<cfset GetTeams=QueryNew("team_id,team_name","Integer,VarChar")>
<cfloop from="1" to="5" index="tx">
<cfset tt=QueryAddRow(GetTeams)/>
<cfset tt=QuerySetCell(GetTeams,"team_id",tx)>
<cfset tt=QuerySetCell(GetTeams,"team_name","team_"&tx)>
</cfloop>

<cfset teamArray=ArrayNew(1)>
<cfset teamCnt=1>
<cfloop index="loopCount" from="1" to="#val(form.schoolcount)#">
      <cfset variables.schoolname = form["schoolname_#LoopCount#"]>
    <cfset variables.teamname = form["sel_teamname_#LoopCount#"]>
      <cfdump var="#variables.schoolname#"/>
      <cfdump var="#variables.teamname#"/>
    <!---begin check for teamnames--->
         <cfloop query="GetTeams">
          <cfif CompareNoCase(trim(GetTeams.team_name[GetTeams.currentrow]),trim(variables.teamname)) eq 0>
            <cfset tt=StructInsert(teamstruct,"schoolname",#GetTeams.team_name[GetTeams.currentrow]#)/>
                  <cfset teamArray[teamCnt] = teamStruct>
                  <cfset teamCnt=teamCnt+1>
         </cfif>
      </cfloop>
</cfloop>

<!--- Dump the teamArray --->
<cfdump var="#teamArray#"/>
0
 
LVL 28

Expert Comment

by:Pravin Asar
ID: 37819515
Use this one. I cleaned up few things

<cfif not isdefined("form.submit")>
<cfform name="f1">
<br/><cfinput type="hidden" name="schoolcount" value="3"/>
<br/><cfinput type="text" name="schoolname_1" value="school_1"/>
<cfinput type="text" name="sel_teamname_1" value="team_1"/>
<br/><cfinput type="text" name="schoolname_2" value="school_2"/>
<cfinput type="text" name="sel_teamname_2" value="team_2"/>
<br/><cfinput type="text" name="schoolname_3" value="school_3"/>
<cfinput type="text" name="sel_teamname_3" value="team_3"/>
<br/><cfinput type="submit" name="submit" value="Submit">
</cfform>
<cfexit>
</cfif>


<cfset GetTeams=QueryNew("team_id,team_name","Integer,VarChar")>
<cfloop from="1" to="5" index="tx">
<cfset tt=QueryAddRow(GetTeams)/>
<cfset tt=QuerySetCell(GetTeams,"team_id",tx)>
<cfset tt=QuerySetCell(GetTeams,"team_name","team_"&tx)>
</cfloop>

<cfset teamArray=ArrayNew(1)>
<cfset teamCnt=1>
<cfloop index="loopCount" from="1" to="#val(form.schoolcount)#">
      <cfset variables.schoolname = form["schoolname_#LoopCount#"]>
    <cfset variables.teamname = form["sel_teamname_#LoopCount#"]>
      <!---<cfdump var="#variables.schoolname#"/>
      <cfdump var="#variables.teamname#"/>--->
    <!---begin check for teamnames--->
         <cfloop query="GetTeams">
          <cfif CompareNoCase(trim(GetTeams.team_name[GetTeams.currentrow]),trim(variables.teamname)) eq 0>
                  <cfset teamStruct = structnew() />
            <!---this is the struct that is not being updated properly--->
            <cfset tt=StructInsert(teamstruct,"schoolname",#GetTeams.team_name[GetTeams.currentrow]#)/>
                  <cfset teamArray[teamCnt] = teamStruct>
                  <cfset teamCnt=teamCnt+1>
         </cfif>
      </cfloop>
</cfloop>

<!--- Dump the teamArray --->
<cfdump var="#teamArray#"/>
0
 
LVL 1

Author Comment

by:roger_v
ID: 37819779
@pravinasar:

Instead of a struct you used an array. Why?

Also, I'm more familiar/comfortable with the whole key/value concept of structs. Is it possible to use struct instead of array?
0
 
LVL 28

Accepted Solution

by:
Pravin Asar earned 500 total points
ID: 37820288
What I am using is array of structures, as at the end of loop we have many elements.

Please read the article at sitepoint.

http://www.sitepoint.com/coldfusion-ii-structs/
0

Featured Post

DevOps Toolchain Recommendations

Read this Gartner Research Note and discover how your IT organization can automate and optimize DevOps processes using a toolchain architecture.

Question has a verified solution.

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

Hi, I will be creating today a basic tutorial on how we can create a Mail Custom Function and use it where ever we want. The main advantage about creating a custom function is that we can accommodate a range of arguments to pass to the Function and …
PROBLEM:  How to open a cfwindow or run a function on double click of a cfgrid row. One of my clients wanted to be able to double click on a row item to get more detailed information about a transaction and to be able to modify the line items i…
This Micro Tutorial will teach you how to censor certain areas of your screen. The example in this video will show a little boy's face being blurred. This will be demonstrated using Adobe Premiere Pro CS6.
Both in life and business – not all partnerships are created equal. As the demand for cloud services increases, so do the number of self-proclaimed cloud partners. Asking the right questions up front in the partnership, will enable both parties …

863 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

23 Experts available now in Live!

Get 1:1 Help Now