Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
?
Solved

Coldfusion loop and cffunction return

Posted on 2010-09-10
8
Medium Priority
?
1,043 Views
Last Modified: 2012-05-10
How do I get a cffunction to return results from a looped query? The follow is my code and while one result is returned (the last query), I need a way for the return to contain all the results from the looped query.

<cfcomponent displayname="optionList.cfc" hint="I build arrays from comma serperated values.">
	
  <cffunction
    name="dataList"
    access="public"
    returntype="any"
    output="false"
    hint="I invoke the createArray component and return the results">
    
  <cfargument
      name="options" 
      type="string" 
      required="false"
      hint="I contain the comma seperated list">
    
    <cfset arrayObject = CreateObject("component","/com/createArray").listToArray(
          listData = arguments.options,
          Delimiter = ",",
          Qualifier = """"
          ) />
        
    <cfreturn getDescriptions( arrayObject=arrayObject )>
  </cffunction>
  
  <cffunction
    name="getDescriptions"
    access="private"
    returntype="any"
    output="false"
    hint="I get the option descriptions">
    
    <cfargument
      name="arrayObject"
      type="array"
      required="true"
      hint="I contain the array object">
      
    <cfloop index="i" from="1" to="#arrayLen(arrayObject[1])#">
    <cfset id = arrayObject[1][i]/>
        
    <cfquery name="qGetDescriptions" datasource="#request.dsn.source#">
          SELECT description
          FROM dbo.options
          WHERE id = '#id#'
     </cfquery>
       
    </cfloop>
      
    <cfreturn (#qGetDescriptions.description#)>        
  </cffunction>
  
</cfcomponent>

Open in new window

0
Comment
Question by:TheDesigners
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 3
8 Comments
 
LVL 52

Expert Comment

by:_agx_
ID: 33651159
I think a better approach is to just run a single query using IN (....). First loop to generate a list of id's.  Then pass that list to your query

<cfquery name="qGetDescriptions" datasource="#request.dsn.source#">
SELECT description
FROM dbo.options
WHERE id IN (  <cfqueryparam value="#id#" cfsqltype="cf_sql_varchar" list="true"> )
</cfquery>
0
 
LVL 52

Expert Comment

by:_agx_
ID: 33651161
>> I build arrays from comma serperated values

Oops.. looks like you've already got a list ;-) So you can pass directly into your query.
0
 

Author Comment

by:TheDesigners
ID: 33651226
OK, passing the list to one query works to get all the results (tested in SMSS),  but what do I set the return to? When left as:

<cfreturn (#qGetDescriptions.description#)>

only the first "description" is returned. This is how I'm invoking the cffunction, and I'm displaying the results for testing using a cfdump:

<cfinvoke
      component="com.optionList"
      method="dataList"
      options="1,3,43,99"
      returnvariable="result">
</cfinvoke>
<cfdump var="#result#"/>

So, the query does get all the results, as tested in SMSS, but only the first description in the query is displayed in the cfdump.
0
[Webinar] Lessons on Recovering from Petya

Skyport is working hard to help customers recover from recent attacks, like the Petya worm. This work has brought to light some important lessons. New malware attacks like this can take down your entire environment. Learn from others mistakes on how to prevent Petya like worms.

 

Author Comment

by:TheDesigners
ID: 33651932
Figured it out on my own. Solution was to place the query results into an array, return that array, and finally loop through that array to display the results:

<cfcomponent displayname="optionList.cfc" hint="I build arrays from comma serperated values.">
      
  <cffunction
    name="dataList"
    access="public"
    returntype="any"
    output="false"
    hint="I query a database table based on the variables passed in">
   
    <cfargument
      name="options"
      type="string"
      required="false"
      hint="I contain the comma seperated list">
   
    <cfquery name="qGetDescription" datasource="#request.dsn.source#">
        SELECT description
        FROM dbo.options
        WHERE id IN (<cfqueryparam value="#options#" cfsqltype="cf_sql_varchar" list="true">)
      </cfquery>
     
      <cfset results = arrayNew(1)>
     
      <cfloop query="qGetDescription">
            <cfset results[CurrentRow][1]=description>
      </cfloop>
     
      <cfset totalRecords = qGetDescription.RecordCount>
      <cfloop index="Counter" from="1" to="#totalRecords#">
            <cfoutput>
              Description: #qGetDescription.description#[1]
        </cfoutput>
      </cfloop>
       
      <cfreturn results>
  </cffunction>
 
</cfcomponent>
0
 
LVL 52

Accepted Solution

by:
_agx_ earned 2000 total points
ID: 33658758
>> Solution was to place the query results into an array, return that array, and finally
>> loop through that array to display the results:

I think you're making it too complicated.  There is really no need for the extra conversion to an array. Just return the query object.  
ie <cfreturn qGetDescriptions>

When you want to display the results, loop through the query as usual.
<cfoutput query="qGetDescriptions">
     Description: #qGetDescription.description#
</cfoutput>

0
 

Author Closing Comment

by:TheDesigners
ID: 33700409
Thanks. Your solution works, The reason for the array is to be able to append additional information to the return.
0
 
LVL 52

Expert Comment

by:_agx_
ID: 33702234
Okay.  As long as that's the only way to append the extra information.  Sometimes people create extra arrays or loops when they're not needed ;-)
0

Featured Post

Tech or Treat!

Submit an article about your scariest tech experience—and the solution—and you’ll be automatically entered to win one of 4 fantastic tech gadgets.

Question has a verified solution.

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

This article  is about submitting  form through  ColdFusion.Ajax.submitForm to the action page and send a response back in JSON format which later can be decoded using ColdFusion.JSON.decode. By this way you can avoid the usual page refresh for subm…
PROBLEM: How to add your own buttons to the bottom toolbar with paging info ( result count ). While creating a cfgrid, I ran into an issue where I wanted to embed my own custom buttons where the default ones ( insert / delete / etc… ) are for aes…
In this video, Percona Director of Solution Engineering Jon Tobin discusses the function and features of Percona Server for MongoDB. How Percona can help Percona can help you determine if Percona Server for MongoDB is the right solution for …
We’ve all felt that sense of false security before—locking down external access to a database or component and feeling like we’ve done all we need to do to secure company data. But that feeling is fleeting. Attacks these days can happen in many w…
Suggested Courses

610 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