2009-11-03 3 views
1

J'ai une grille de données modifiable et je dois la renvoyer à la base de données via un CFC pour insertion dans la base de données une fois la modification terminée . Dumping la collection de tableau à cfdump me dit que j'ai un tableau avec des éléments et une structure mais je ne peux pas comprendre comment "boucler" à travers chacun et insérer dans la base de données.Comment transmettre une grille de données Flex éditée à un CFC pour l'insérer dans une base de données

Il semble y avoir très peu d'écrit qui fonctionne réellement! Mon MXML et CFC sont ci-dessous, mais donnez-moi l'erreur de "Vous avez essayé de déréférencer une variable scalaire de type classe coldfusion.runtime.Array en tant que structure avec des membres." -qui est agréable

toute aide est très appréciée - merci

[Bindable] 
private var getconsent:ArrayCollection = new ArrayCollection([ 
{LocationName:'Service A', Contact: 'Bob Jones' }, 
{LocationName:'Service B', Contact: 'Jane Smith' }, 
{LocationName:'Service c', Contact: 'Doug Johnson' }, 
{LocationName:'Service d', Contact: 'John Jackson'} 
]); 

public function send():void { 
cfdata.sendData(getconsent.source); 
} 

public function send_Result(event:ResultEvent):void { 
Alert.show('ok'); 
} 

public function send_Fault(event:FaultEvent):void { 
Alert.show(event.fault.message); 
} 

]]> 
</mx:Script> 

<mx:RemoteObject 
id="cfdata" 
showBusyCursor="true" 
destination="ColdFusion" 
source="buildtest.test2"> 

<mx:method name="sendData" result="send_Result(event)" fault="send_Fault(event)" /> 
</mx:RemoteObject> 

<mx:DataGrid id="myGrid" 
dataProvider="{getconsent}" editable="true" > 
<mx:columns> 
<mx:DataGridColumn dataField="LocationName" width="150" 
editable="false"/> 

<mx:DataGridColumn dataField="Contact" width="150" /> 

</mx:columns> 
</mx:DataGrid> 
<mx:Button label="Update DB" click="send()"/> 


<cfcomponent displayname="sendData" output="false" > 
    <cffunction name="sendData" access="remote" output="no" returnType="void"   required="yes" > 

     <cfargument name="getconsent" type="any" required="true"> 

     <cfloop from="1" to="#ArrayLen(getconsent.dataprovider)#" index="i"> 

      <cfquery name="clientconsent" datasource="gvr"> 

       INSERT INTO ClientConsent" 
         (Location) 
       VALUES 
       ('#getconsent.dataprovider.LocationName[i]#') 

      </cfquery> 
     </cfloop> 
    </cffunction> 

</cfcomponent> 

tableau 1 struct Contactez Bob Jones
service LocationName A
mx_internal_uid 807D204F-A315-7D78-C745-BAD78087CB28

2 struct 
Contact  Jane Smith 
LocationName Service B 
mx_internal_uid EAA43EF4-A7EA-82C9-5F3C-BAD780D7FD6F 

3 struct 
Contact  Doug Johnson 
LocationName Service c 
mx_internal_uid 9768D6D2-8F97-5F4D-767C-BAD780D7B478 
+0

pls utiliser cfloop INTÉRIEUR cfquery, et non l'inverse, pour des raisons de performances . :) – Henry

+0

Pour développer le commentaire de Henry, vous créez actuellement une nouvelle connexion à la base de données pour chaque requête. Si vous placez la boucle à l'intérieur, une seule connexion est créée. Cela suppose que le pilote de source de données que vous utilisez vous permette de publier plusieurs commandes (séparées par un point-virgule), ce qui n'est pas le cas de tous. –

Répondre

2

Si vous utilisez CF9, essayez DCD avec Flex 4: http://ria.dzone.com/articles/flash-remoting-and-coldfusion

Si vous utilisez CF8 avec Flex 3, essayez LCDS: http://www.adobe.com/devnet/coldfusion/articles/data_app.html

+0

Merci pour le point de mettre le cfloop dans la requête je vais le faire (school boy error je suppose;) Cependant, je n'utilise pas LCDS juste une connexion directe de flex 3 à cf7 à SQLExpress DB- cela devrait être facile, mais Je semble juste avoir manqué quelque chose d'évident. – charlie

+0

J'ai ajouté le cfdump à la question originale - le peu qui m'intrigue est que c'est un tableau, avec une structure, avec des membres et c'est ce que coldfusion se plaint - mais c'est quoi un tableau? – charlie

+0

Donc vous obtenez un tableau de struct, essayez # getconsent.dataprovider [i] .LocationName #? – Henry

0

Serait-il plus facile pour vous de travailler avec un objet de requête au lieu d'un tableau de structures? J'ai créé un UDF pour convertir un ArrayCollection en une requête [ArrayCollectionToQuery] dans CF après son retour de votre application Flex.

0

Salut Adam merci pour cela, il semble très utile, mais je ne suis pas sûr de savoir comment l'utiliser pour insérer des données dans mon DB

<cfquery name="clientconsent" datasource="gvr"> 
INSERT INTO dbo.ClientConsent 
(Location, ClientAppointments, ClientDemographics) 
VALUES(
     #qresult# 
) 
</cfquery> 
Questions connexes