2012-04-02 32 views
3

私のアプリケーションの一部のページをcfcのものに変換しようとしています.1ページはストアドプロシージャを使用してデータを取得しています。cfcから複数のストアドプロシージャの結果セットを返す

結果にアクセスすると、<cfquery>タグを使用した場合と同じように動作し、すべての機能が実行されます。だから私は構築しているcfcでこの同じストアドプロシージャを使用しようとしていますが、同じ方法で結果にアクセスできるようにしたいと思います。私はどのように関数から複数のクエリを返すかわからない、配列を作成せずに、私は開始しました。ちなみに、関数は不完全です。私は仕事のために何かを得ようとしていただけです。以下のセットアップでは、クエリオブジェクトの配列を取得しますが、それを行うためのより良い方法があると感じています。ここで

<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> 

私は、出力テストデータ、それは

<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> 

を一致したとき、私は得る:

をCFCから(#count [1]。 (#profile_head.recordCount#):1

しかし、2番目の方法でははるかにきれいに見えます。

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

@leighからの回答で作業した後、私はこれを思いついた。

ここ
<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> 

は、呼び出しページからのコードです:

はここでいっぱいCFCであるすべてのコードのための

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

申し訳ありませんが、私は、コードを利用できるようにしたかったです。だから誰も私が思いついたことで何か問題を見ますか?

+0

は、これは良いことを思えません。データを必要とするたびに、 'getProfileData'を実行してストアドプロシージャを実行し、別の' get'メソッドを実行して更新された情報を取得する必要があります。これは効率的ですか? –

答えて

3

私は、各ストアドプロシージャから結果を返すために責任を負うことになるCFC内の他のメソッドを作成します。 mainメソッドでは、 setProfileHead(profilehead:profileHead)セッターを呼び出す

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

その後...

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

私はちょっと混乱しています。 "main method"と言うと、実際の格納されているprocを含む、私の元の投稿からのものを意味しますか?あるいは、cfcを呼び出すcfmページを意味しますか? –

+0

getProfileDataメソッド。 –

+0

私はそれを昨日掲載しました。今日編集した元の投稿を見ると、私のしたことが分かります。 –

8

関数は単一の値しか返すことができません。複数の値を返す場合は、何らかの型の複雑なオブジェクト(配列、構造体など)を使用する必要があります。配列が直感的ではない場合は、構造体にクエリを置き換えて代わりに返すことができます。次に、呼び出しページは、索引ではなく名前で照会にアクセスできます。

(サイドノートで、適切VAR範囲/すべての関数の変数を局所化するようにしてください。)

<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

あなたはBeanのアプローチを使用し、結果セットごとに "get"を持つことができます(各結果はコンポーネントの "プロパティ"になります)。#objProfile.getprofileHead()#結果は、まるでそれがproc結果セットの「名前」であるかのように設定されます。それがジムの提案です。しかし、あなたが使用しているものから容易に移行できるように、私はリーのアプローチがあなたに適していると思っています。 –

+0

うん、私は彼のセットアップについてはわからなかったので、私は一般的なアプローチを取った。しかし、豆もそれに近づける良い方法でしょう。 (編集:私はジムの提案を誤解しているのを見ました。申し訳ありません、@ Jim。+1 :) – Leigh

+0

私は両方の方法にショットを付けるつもりです。私は前にsetter/getter型の構造体を使用していましたので、私はこの概念に精通しています。私は試してみて、どれが好きなのか見てみましょう。 –

関連する問題