2017-06-28 4 views
2

Webフォームの送信時にAJAX呼び出しを行うWebページを構築しています。 AJAXはcfcを呼び出します。ここでは、Webフォームの値を入力引数として渡すSQLストアドプロシージャを呼び出す関数があります。ここまでは問題ありませんが、ストアドプロシージャによって複数の結果セットが返されたときに、呼び出し元のAJAX関数にデータを返す方法については分かりません。複数のcfquery結果をAJAX呼び出しに戻す

ストアドプロシージャは内部的に多くのSELECTトランザクションを持ち、それぞれがcfstoredprocのcfprocresultの一部として取得されています。 cfprocresultが1つだけだった場合、AJAXに戻すことは簡単ですが、複数のcfprocresult結果を呼び出し元のAJAX関数に返すにはどうすればよいですか?

以下の擬似コード:

AJAX: ---------

$.ajax(

     { 

      type: “post”, 

      url: "Contacts.cfc", 

      data: { 

       method: "retrieveCustomers", 

       username: this.DOMReferences.Name.val(), 



       }, 

      dataType: "json", 





      success: function(objResponse){ 



       if (objResponse.SUCCESS){ 



// rest of AJAX to process returned data here 

Contacts.cfc ---------

<cfcomponent> 
<cffunction name="retrieveCustomers" returntype="query"> 

<cfstoredproc datasource="#application.dsn_spoon#" procedure="proc_getUsers_paged"> 
      <cfprocparam cfsqltype="cf_sql_varchar" value="#username#"> 
      <cfprocresult name="qResult1" resultset="1"> 
      <cfprocresult name="qResult2" resultset="2"> 
      <cfprocresult name="qResult3" resultset="3"> 
</cfstoredproc> 


// how do i return all 3 result sets back to calling AJAX function? 

</cffunction> 
</cfcomponent> 

注:私はストアドプロシージャのロジックを変更するコントロールはほとんどありません。既存のWebページでは、AJAXを使用せずにcfstoredprocコンポーネントを呼び出している間に、ページ自体をリフレッシュしていました。代わりにAJAXを使うためにUIを書き直しています。

ありがとうございます!

+1

私はあなたができることは、構造体を作成し、その中に結果セットを格納することだと思います。そして、SerializeJSON関数を使って構造体をJSONに変換し、レスポンスとしてAjaxに返します。 Ajaxレスポンスを受け取ったら、それを解析してさらに操作するだけです。 –

+1

また、ajaxを使用してCFC関数を直接呼び出す場合、access = remoteを設定し、returntype = JSONを設定する必要があります。 –

+1

@Keshavjha - ありがとうございます。今私はこのアプローチを理解していると思う。いつか試してみるよ! – maverick

答えて

1

あなたはこのような何かを試みることができる:

<cfcomponent> 
<cffunction name="retrieveCustomers" returntype="struct" returnformat="json" access="remote"> 

<cfstoredproc datasource="#application.dsn_spoon#" procedure="proc_getUsers_paged"> 
     <cfprocparam cfsqltype="cf_sql_varchar" value="#username#"> 
     <cfprocresult name="qResult1" resultset="1"> 
     <cfprocresult name="qResult2" resultset="2"> 
     <cfprocresult name="qResult3" resultset="3"> 
</cfstoredproc> 

<cfset _results = structNew()> 
<cfset _results.result1 = qResult1> 
<cfset _results.result2 = qResult2> 
<cfset _results.result3 = qResult3> 

<cfreturn _results> 


</cffunction> 
</cfcomponent> 

ここで注意すべき点は、あなたがqResultsをマッサージする必要があるかもしれないということです。通常、私は各クエリをループし、配列を構築します。しかし、それは単に個人的な好みです。クエリを返すときに私が通常行うことは、それをループして新しい構造を構築することです。これは、各プロパティに対して追加アクションを実行したい場合があるためです。

... 
<cfset _results = structNew()> 
<cfset _results.result1 = arrayNew()> 
<cfset _results.result2 = arrayNew()> 
<cfset _results.result3 = arrayNew()> 

<cfloop query="qResult1"> 
    <cfset _result = structNew()> 
    <cfset _result.col1 = qResult1.col1> 
    <cfset _result.col2 = qResult1.col2> 
    <cfset _result.col3 = qResult1.col3> 
    <cfset arrayAppend(_results.result1,_result)> 
</cfloop> 

<cfloop query="qResult2"> 
    <cfset _result = structNew()> 
    <cfset _result.cola = qResult2.cola> 
    <cfset _result.colb = qResult2.colb> 
    <cfset _result.colc = qResult2.colc> 
    <cfset _result.cold = qResult3.cold> 
    <cfset arrayAppend(_results.result2,_result)> 
</cfloop> 

<cfloop query="qResult3"> 
.... 
</cfloop> 

<cfreturn _results> 

私にとっては、これはよりクリーンで使いやすいです。より多くのオーバーヘッドとサーバー側の処理が必要になるかもしれませんが、保守が簡単です。返される構造体は適切なJSON形式になっているため、JS側の解析は行われません。

+1

ありがとう!構造を使用することについてかなり新しいので、2つのフォローアップの質問 - a。 qResult1、qResult2、... - これらの列の数が異なる場合があります。同様に、table1とqResult2の出力であるqResult1はtable2の出力であり、table1とtable2はまったく別のテーブルですが、これは構造を正しいものにしても問題ありません。 b。あなたは "警告"の部分の詳細を追加していただけますか?私はなぜ、私がqResultsをマッサージする必要があるのか​​、なぜか分かりませんでした。私は、AJAXにデータを渡してそこに解析することを考えています。 もう一度ありがとう! – maverick

+1

構造体を他の変数のコンテナと考えてください。変数の種類(シンプル、配列、クエリ、その他の構造など)は関係ありません。コンテナは何も受け入れません。 –

+1

はい、qResult1、qResult2 ...は異なる列を持つことができます。構造をオブジェクトと考える。構造体には、値、別の構造体、配列のいずれかのプロパティーがあります。マッサージすることによって、私は "... JavaScriptの側に"追加しておくべきです。私はjavascriptに直接クエリオブジェクトを返して以来、それはしばらくしています。私は、私が典型的にしているもので私の答えを修正します。 – snackboy

関連する問題