Title: Message
Darius,
 
What you want is an array of structures (what Flex wants), not a structure of arrays (what a CF Query is).  By using queryname.columnList, you get the keys you want to dynamically populate each structure, but unfortunately,  case sensitivity of column names isn't preserved - so you may end up hard coding each structure key if case sensitivity of your struct keys matters to your application. Also, your cfset var will have to be placed at the top of the function body, just after your CFARGUMENT tags.
 
Jeff
-----Original Message-----
From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf Of [EMAIL PROTECTED]
Sent: Thursday, August 11, 2005 5:57 PM
To: [email protected]
Subject: RE: [flexcoders] Calling ArrayStructures in CFCs from Flex

Jeff,
 
Great example! It almost works for me except the cfc I call from Flex is a facade to my cfc query.  The cfc query returns a variable that needs to be converted to an array or whatever before being put into a structure.  Do you have any ideas how to do this?  Many thanks, Darius
 
<cfcomponent>
 
<!--- Data coming in from Flex --->
 <cffunction name="invUpdateAuthorization" access="remote" returnType="Array">
  <cfargument name="Input" required="true" type="Array">
  <cfset AuthorizedUserId = input[1] >
  <cfset CCode = input[2] >
  <cfset CFlag = input[3] >
  <cfset COAvailableFlag = input[4] >
  <cfset Dsn = input[5] >
  <cfset ComponentPath = "Model.mUtilities.mUpdate.qry_UpdateAuthorization">
  
<!--- This is the call to the query that returns the recordset qGetUpdateAuthorization --->
  <cfinvoke component="#ComponentPath#" method="GetUpdateAuthorization" returnvariable="qGetUpdateAuthorization">
   <cfinvokeargument name="AuthorizedUserId" value="#AuthorizedUserId#">
   <cfinvokeargument name="CountyCode" value="#CountyCode#">
   <cfinvokeargument name="CaseFlag" value="#CaseFlag#">
   <cfinvokeargument name="CourtOrderAvailableFlag" value="#CourtOrderAvailableFlag#">
   <cfinvokeargument name="Dsn" value="#Dsn#">
  </cfinvoke>
 
<!--- How do I get this component recordset into your Structure of arrays? --->
  
  <cfset var arrResult = ArrayNew(1)/>
        <cfset var stItem = StructNew()/>
  
  
        <cfoutput query="qGetUpdateAuthorization">
            <cfset stItem = StructNew()/>
            <cfset stItem["label"] = label/>
            <cfset stItem["data"] = data/>
           <cfset ArrayAppend(arrResult,stItem)/>           
       </cfoutput>
           
            <cfreturn arrResult/>     
 
  
 
 </cffunction>
 
</cfcomponent>
 
 
-----Original Message-----
From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf Of Battershall, Jeff
Sent: Thursday, August 11, 2005 8:38 AM
To: [email protected]
Subject: RE: [flexcoders] Calling ArrayStructures in CFCs from Flex

I'm jonny-come-lately to this thread, but I send and return arrays and
structures to/from CFCs all the time.  I've abandoned passing back
CFQueries as such but convert them to an array of structures first as
that is what Flex UIComponents seem to like.

Example code:

<cffunction name="getIndustryCategories" returntype="array"
access="public">
     
            <cfset var arrResult = ArrayNew(1)/>
            <cfset var stItem = StructNew()/>           
           
            <cfstoredproc procedure="sp_GetIndustryCategories"
datasource="#getDataSource()#">
                  <cfprocresult name="qryCats"/>
            </cfstoredproc>     
     
            <cfoutput query="qryCats">
                  <cfset stItem = StructNew()/>
                  <cfset stItem["label"] = label/>
                  <cfset stItem["data"] = data/>
                  <cfset arrayAppend(arrResult,stItem)/>           
            </cfoutput>
           
            <cfreturn arrResult/>     

</cffunction>     

If you were dealing with a dynamic list of columns the code could be
altered as such:

<cfoutput query="qryCats">

            <cfset stItem = StructNew()/>

            <cfloop list="#qryCats.columnList#" index="i">
                  <cfset stItem[i] = qryCats[i][currentrow]/>
            </cfloop>

            <cfset arrayAppend(arrResult,stItem)/>           

</cfoutput>

Produced in this fashion, Flex WILL accept this result as an array of
structures. I'm mystified at the problem you're experiencing.

Jeff

-----Original Message-----
From: [email protected] [mailto:[EMAIL PROTECTED] On
Behalf Of Malcolm
Sent: Wednesday, August 10, 2005 7:48 PM
To: [email protected]
Subject: RE: [flexcoders] Calling ArrayStructures in CFCs from Flex


Hi Darius,

I too went through the same pain (days & days of trying see what data
types I could successfully return from a CFC).

I'm still learning but in my somewhat limited experience I could find no
way to return an array datatype, it just wouldn't do it no matter what I
tried, same goes for structures. I have successfully returned the
following
datatypes:

:String
:Query
:Boolean

:Numeric (yet to try)
:Date (yet to try)

It's interesting to note that Flex (somehow) in the background actually
converts a ColdFusion query to an array. (Search the group on how these
can be accessed)

At the moment I am mostly using queries to get data back. This has the
unfortunate side effect of losing typing (everything in the query is a
string), thus you may need cast some results etc to their correct type
in Flex.

Malcolm

-----Original Message-----
From: [email protected] [mailto:[EMAIL PROTECTED] On
Behalf Of coldfs
Sent: Friday, 5 August 2005 7:29 AM
To: [email protected]
Subject: [flexcoders] Calling ArrayStructures in CFCs from Flex

Hi,

Using Tom Link's blog (http://tomlink.net/blog/index.cfm?
mode=entry&entry=B662BEF9-7E97-A3B0-E3FB286E23BDAA50) and other
sources, I've been trying for days to translate queries to arrays of
structures (and vice versa).  Whatever I do, the cfc doesn't except
my values from Flex as arrays.  I know it's a chunk of code to
review, but you'd help a sane man going slowly mad...:-)

Many thanks,
Darius

-----------
index.mxml:
-----------
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml">

      <mx:Script>
            <![CDATA[
                 
                  var RecordSetModel;

                  private function doResult(event:Object):Void{
                        var method: String =
event.call.methodName;
                        if (method
== "GetUpdateAuthorization"){
                              RecordSetModel = event.result;
                        }
                  }
                 
                  private function doClick():Void{
                        var UserId = "rgatta";           
                 
                        var CountyCode = 37;
                        var CaseFlag = "No";
                        var CourtOrderAvailableFlag = "No";
                        var Dsn = "TssDev";
                        ro.GetUpdateAuthorization
(UserId,CountyCode,CaseFlag,CourtOrderAvailableFlag,Dsn);
                  }
            ]]>
      </mx:Script>
     
     
      <mx:RemoteObject id="ro"
endpoint="http://gx270dev.net/flashservices/gateway"
source="Model.mUtilities.mUpdate.qry_UpdateAuthorization"
fault="mx.controls.Alert.show(event.fault.faultstring)"
showBusyCursor="true">
            <mx:method name="GetUpdateAuthorization"
result="doResult(event.result)"/>
      </mx:RemoteObject>
     
      <mx:Panel width="100%" title="Forms" height="22%">
         <mx:DataGrid id="UpdatesDG" width="166" height="156"
wordWrap="true" dataProvider="{RecordSetModel}">
                  <mx:columns>
                          <mx:Array>
                              <mx:DataGridColumn
width="200" headerText="Update Form" columnName="Function"/>
                              <mx:DataGridColumn
width="320" headerText="Description" columnName="Description"/>
                           </mx:Array>
                  </mx:columns>
            </mx:DataGrid>
            <mx:Button label="Get Records" click="doClick()"/>
      </mx:Panel>
     
</mx:Application>

--------------------------
fx_UpdateAuthorization.cfc
--------------------------
<cfcomponent extends="Base">
     
      <cfset obj = createObject
("component","qry_UpdateAuthorization")>
     
      <!--- <cffunction name="getEmployees" access="remote"
returntype="array">
            <cfreturn queryToArrayOfStructures(emp.getEmployees())
>
      </cffunction> --->
     
      <cffunction name="GetUpdateAuthorization" access="remote"
returntype="array">
            <cfargument name="AuthorizedUserIdObject"
type="array" required="yes">
            <cfargument name="CountyCodeObject" type="array"
required="yes">
            <cfargument name="CaseFlagObject" type="array"
required="yes">
            <cfargument name="CourtOrderAvailableFlagObject"
type="array" required="yes">
            <cfargument name="DsnObject" type="array"
required="yes">
            <cfreturn queryToArrayOfStructures
(obj.GetUpdateAuthorization
(AuthorizedUserIdObject,CountyCodeObject,CaseFlagObject,CourtOrderAvai
lableFlagObject,DsnObject))>
      </cffunction>
     
</cfcomponent>

-----------------------------
qry_UpdateAuthorization.cfc
-----------------------------
<cfcomponent extends="Base">
     
      <cffunction name="GetUpdateAuthorization" access="remote"
returntype="query">

            <cfargument name="AuthorizedUserId" type="array"
required="yes">
            <cfargument name="CountyCode" type="array"
required="yes">
            <cfargument name="CaseFlag" type="array"
required="yes">
            <cfargument name="CourtOrderAvailableFlag"
type="array" required="yes">
            <cfargument name="Dsn" type="array" required="yes">

            <CFSTOREDPROC PROCEDURE="spUpdateAuthorization"
DATASOURCE="#Arguments.Dsn#">
                  <CFPROCPARAM DBVARNAME="AuthorizedUserId"
TYPE="IN" VALUE="#Arguments.AuthorizedUserId#"
CFSQLTYPE="CF_SQL_CHAR">
                  <CFPROCPARAM DBVARNAME="CountyCode" TYPE="IN"
VALUE="#Arguments.CountyCode#" CFSQLTYPE="CF_SQL_CHAR">
                  <CFPROCPARAM DBVARNAME="CaseFlag" TYPE="IN"
VALUE="#Arguments.CaseFlag#" CFSQLTYPE="CF_SQL_CHAR">
                  <CFPROCPARAM
DBVARNAME="CourtOrderAvailableFlag" TYPE="IN"
VALUE="#Arguments.CourtOrderAvailableFlag#" CFSQLTYPE="CF_SQL_CHAR">
                  <CFPROCRESULT NAME="qGetUpdateAuthorization">
            </CFSTOREDPROC>
           
         <cfreturn qGetUpdateAuthorization>

      </cffunction>

</cfcomponent>

-------------
Base.cfc
-------------
<cfcomponent>

      <cffunction name="dumpToFile" access="package" hint="A quick
and easy debugging utility when testing with Flash.">
            <cfargument name="dumpObject" type="any" 
required="yes">
            <cfargument name="path" type="string" required="yes">
            <cfset var varToOutput="">
            <cfsavecontent variable="varToOutput">
                  <cfdump var="#arguments.dumpObject#">
            </cfsavecontent>
            <cffile action="" file="#arguments.path#"
addnewline="yes" output="#varToOutput#">     
      </cffunction>

      <cfscript>
      /**
      * Converts a query object into an array of structures.
      *
      * @param query       The query to be transformed
      * @return This function returns a structure.
      * @author Nathan Dintenfass ([EMAIL PROTECTED])
      * @version 1, September 27, 2001
      */
      function QueryToArrayOfStructures(theQuery){
            var theArray = arraynew(1);
            var cols = ListtoArray(theQuery.columnlist);
            var row = 1;
            var thisRow = "";
            var col = 1;
            for(row = 1; row LTE theQuery.recordcount; row = row
+ 1){
                  thisRow = structnew();
                  for(col = 1; col LTE arraylen(cols); col =
col + 1){
                        thisRow[cols[col]] = theQuery[cols
[col]][row];
                  }
                  arrayAppend(theArray,duplicate(thisRow));
            }
            return(theArray);
      }

      /**
      * Converts an array of structures to a CF Query Object.
      * 6-19-02: Minor revision by Rob Brooks-Bilson
([EMAIL PROTECTED])
      *
      * Update to handle empty array passed in. Mod by Nathan
Dintenfass. Also no longer using list func.
      *
      * @param Array       The array of structures to be
converted to a query object.  Assumes each array element contains
structure with same  (Required)
      * @return Returns a query object.
      * @author David Crawford ([EMAIL PROTECTED])
      * @version 2, March 19, 2003
      */
      function arrayOfStructuresToQuery(theArray){
            var colNames = "";
            var theQuery = queryNew("");
            var i=0;
            var j=0;
            //if there's nothing in the array, return the empty
query
            if(NOT arrayLen(theArray))
                  return theQuery;
            //get the column names into an array =
            colNames = structKeyArray(theArray[1]);
            //build the query based on the colNames
            theQuery = queryNew(arrayToList(colNames));
            //add the right number of rows to the query
            queryAddRow(theQuery, arrayLen(theArray));
            //for each element in the array, loop through the
columns, populating the query
            for(i=1; i LTE arrayLen(theArray); i=i+1){
                  for(j=1; j LTE arrayLen(colNames); j=j+1){
                        querySetCell(theQuery, colNames[j],
theArray[i][colNames[j]], i);
                  }
            }
            return theQuery;
      }
      </cfscript>

</cfcomponent>








--
Flexcoders Mailing List
FAQ: http://groups.yahoo.com/group/flexcoders/files/flexcodersFAQ.txt
Search Archives:
http://www.mail-archive.com/flexcoders%40yahoogroups.com
Yahoo! Groups Links









--
Flexcoders Mailing List
FAQ: http://groups.yahoo.com/group/flexcoders/files/flexcodersFAQ.txt
Search Archives:
http://www.mail-archive.com/flexcoders%40yahoogroups.com
Yahoo! Groups Links










--
Flexcoders Mailing List
FAQ: http://groups.yahoo.com/group/flexcoders/files/flexcodersFAQ.txt
Search Archives: http://www.mail-archive.com/flexcoders%40yahoogroups.com




SPONSORED LINKS
Computer software testing Macromedia flex Development
Software developer


YAHOO! GROUPS LINKS




Reply via email to