2012-04-02 3 views
3

Ich versuche, einige Seiten von meiner Anwendung zu cfc zu konvertieren, und eine Seite verwendet eine gespeicherte Prozedur, um ein paar Datensätze abzurufen.Rückgabe mehrerer Ergebnisprozesssätze gespeicherter Prozeduren von einem cfc

Jetzt, wenn ich auf die Ergebnisse zugreifen, verhalten sie sich wie ein, wenn ich ein <cfquery>-Tag verwendet, und all die Funktionalität, die gibt. Jetzt versuche ich, dieselbe gespeicherte Prozedur in einem cfc zu verwenden, den ich gerade erstelle, und ich möchte auf die gleiche Weise auf die Ergebnisse zugreifen können, und da liegt mein Problem. Ich bin mir nicht sicher, wie mehrere Abfragen von der Funktion zurückgegeben werden, ohne ein Array zu erstellen, das ich gestartet habe. Die Funktion ist übrigens unvollständig. Ich habe nur versucht, etwas zur Arbeit zu bringen. Im folgenden Setup bekomme ich ein Array von Abfrageobjekten, aber ich denke, es gibt einen besseren Weg, dies zu tun. Hier

ist die <cffuntion>:

<cffunction name="getProfileData" 
      access="public" 
      output="false" 
      returntype="string"> 

    <cfargument name="cusip" type="string" required="true"> 
    <cfargument name="report_date" type="date" required="true"> 
    <cfset var errorMessage = "everything is good"> 

    <cftry> 
     <cfstoredproc datasource="#dsn#" procedure="prc_asset_profile_retrieve"> 
      <cfprocparam type="in" cfsqltype="cf_sql_varchar" value="#cusip#" dbvarname="@cusip"> 
      <cfprocparam type="in" cfsqltype="cf_sql_varchar" value="#report_date#" dbvarname="@reportDate"> 
      <cfprocresult name="profile_head" resultset="1"> 
      <cfprocresult name="attribution" resultset="2"> 
      <cfprocresult name="characteristics" resultset="3"> 
      <cfprocresult name="exposure" resultset="4"> 
      <cfprocresult name="weights" resultset="5"> 
      <cfprocresult name="holdings" resultset="6"> 
     </cfstoredproc> 

     <cfset var profileArray = []> 
     <cfset #ArrayAppend(profileArray,profile_head)#> 

     <cfcatch type="any"> 
      <cfset errorMessage = "something happened"> 
     </cfcatch>   
    </cftry> 

    <cfreturn profileArray> 
</cffunction> 

Wenn ich Ausgabe einige Testdaten, es passt bis

<cfset count = fund_profile.getProfileData("#cusip#","#report_date#")> 
<cfdump var="#count[1]#"> 
<cfoutput> 
    From cfc (##count[1].recordCount##): #count[1].recordCount#<br> 
    From stored proc (##profile_head.recordCount##): #profile_head.recordCount# 
</cfoutput> 

ich:

Von cfc (#count [1]. recordCount #): 1
Von gespeicherten Proc (# profile_head.recordCount #): 1

Aber der zweite Weg sieht so viel sauberer aus.

-----------------------------WORKING SOLUTION------------------------------ 

Also nach der Arbeit mit der Antwort von @leigh, kam ich mit diesem. Hier

ist die volle cfc:

<cfcomponent displayname="Fund Profile" hint="This is the cfc that will do the processing of all fund profile information" output="false"> 
    <cfproperty name = "result1"> <!--- PROFILE HEAD ---> 
    <cfproperty name = "result2"> <!--- ATTRIBUTION ---> 
    <cfproperty name = "result3"> <!--- CHARACTERISTICS ---> 
    <cfproperty name = "result4"> <!--- EXPOSURE ---> 
    <cfproperty name = "result5"> <!--- WEIGHTS ---> 
    <cfproperty name = "result6"> <!--- HOLDINGS ---> 

    <cffunction name="init" 
      displayname="init" 
      hint="This will initialize the object" 
      access="public" 
      output="false" 
      returnType="Any"> 

     <cfargument name="dsn" type="string" required="true" /> 
     <cfargument name="cusip" type="string" required="true" /> 
     <cfargument name="report_date" type="date" required="true" /> 

     <cfset variables.dsn = #arguments.dsn#> 
     <cfset variables.cusip = #arguments.cusip#> 
     <cfset variables.report_date = #arguments.report_date#> 

     <cfscript> 
      getProfiledata(cusip,report_date); 
     </cfscript>  

     <cfreturn this> 
    </cffunction> 

    <cffunction name="getProfileData" 
      access="private" 
      output="false" 
      returntype="void"> 

     <cfargument name="cusip" type="string" required="true"> 
     <cfargument name="report_date" type="date" required="true"> 

     <cfstoredproc datasource="#dsn#" procedure="prc_asset_profile_retrieve"> 
      <!--- STORED PROCEDURE HASN'T CHANGED. SEE ABOVE FOR CODE ---> 
     </cfstoredproc> 

     <cfscript> 
      setProfilehead(profile_head); 
      setAttribution(attribution); 
      setCharacteristics(characteristics); 
      setExposure(exposure); 
      setWeights(weights); 
      setHoldings(holdings); 
     </cfscript> 

     <cfreturn> 
    </cffunction> 

    <!--- NOT GOING TO INCLUDE ALL SETTERS AND GETTERS, ---> 
    <!--- BECAUSE THEY ARE ALL THE SAME OTHER THAN THE NAMES ---> 

    <cffunction name="setProfileHead" access="private"> 
     <cfargument name="ProfileHead"> 
     <cfset variables.result1 = arguments.ProfileHead>  
    </cffunction> 

    <cffunction name="getProfileHead" access="public" returntype="query"> 
     <cfreturn variables.result1> 
    </cffunction> 

</cfcomponent> 

Hier ist der Code von der rufenden Seite:

<cfset fund_profile = CreateObject("component", "CFCs.fund_profile").init("#dsn#","#cusip#","#report_date#")> 
<cfset profile_head = fund_profile.getProfileHead()> 

Sorry für den gesamten Code, aber ich wollte den Code zur Verfügung stellen. Also sieht irgendjemand irgendwelche Probleme mit dem, was mir eingefallen ist?

+0

Dies scheint nicht so gut. Jedes Mal, wenn Sie Daten wollen, müssen Sie 'getProfileData' ausführen, um die gespeicherte Prozedur auszuführen, und dann eine andere 'get'-Methode ausführen, um die aktualisierten Informationen zu erhalten. Ist das effizient? –

Antwort

3

ich andere Methoden im CFC schaffen würde, die jeweils für die Rückgabe eines Ergebnisses aus der gespeicherten proc verantwortlich wäre. Im Hauptverfahren, rufen Setter setProfileHead (profilehead: profileHead)

<cffunction name=ProfileHead> 
    <cfarguments name=ProfileHead /> 
    <cfset variables.profilehead = arguments.profilehead> 
</cffunction> 

Then ...

<cffunction name=GetProfileHead> 
    <cfreturn variables.profileHead /> 
</cffuction> 
+0

Also, ich bin ein bisschen verwirrt. Wenn Sie "Hauptmethode" sagen, meinen Sie die aus meinem ursprünglichen Post, die den tatsächlich gespeicherten Prozess enthält? Oder meinst du die cfm-Seite, die das cfc aufruft? –

+0

Die Methode getProfileData. –

+0

Das habe ich gestern gepostet. Wenn Sie sich den Originalbeitrag ansehen, den ich heute bearbeitet habe, werden Sie sehen, was ich getan habe. –

8

Eine Funktion kann nur einen einzelnen Wert zurückgeben. Wenn Sie mehrere Werte zurückgeben möchten, müssen Sie einen Typ eines komplexen Objekts (ein Array, eine Struktur, ...) verwenden. Wenn Arrays nicht intuitiv genug sind, können Sie die Abfragen in eine Struktur einfügen und diese stattdessen zurückgeben. Dann könnte die aufrufende Seite auf die Abfragen nach Namen statt nach Index zugreifen.

(Randbemerkung, sollten Sie richtig var Umfang/lokalisieren alle Funktionsvariablen.)

<cfset var data = {}> 
... 
<!--- store query results in structure ---> 
<cfset data.profile_head = profile_head> 
<cfset data.attribution = attribution> 
... 
<cfset data.holdings = holdings> 
<!--- return structure ---> 
<cfreturn data> 
+1

Sie könnten eine Bean-Methode verwenden und ein "get" für jede Ergebnismenge haben (wobei jedes Ergebnis eine "Eigenschaft" der Komponente wäre). Dann hätten Sie # objProfile.getprofileHead() #, das die zurückgegeben würde Ergebnismenge, als wäre es der "Name" der Proc-Ergebnismenge. Das schlägt Jim vor. Zum leichteren Übergang von dem, was Sie gewohnt sind, vermute ich, dass Leighs Ansatz besser zu Ihnen passt. –

+0

Ja, ich war mir seiner Einrichtung nicht sicher, also nahm ich den generischen Ansatz. Aber Bohnen wäre ein guter Weg, um es auch zu nähern. (Edit: Ich sehe, dass ich Jims Vorschlag falsch gelesen habe. Tut mir leid, @Jim. +1 :) – Leigh

+0

Ich denke, ich werde beide Methoden ausprobieren. Ich habe die Struktur des Setter/Getter-Typs zuvor verwendet, daher kenne ich das Konzept. Ich werde beides ausprobieren und sehen, welche mir besser gefällt. –