1

を使用してクエリをループしているときにエラーが発生しましたcfloop

クエリで a を使用するcfdumpと (ループ内で注意してください)、すべてのデータを正常に表示できます。しかし、 で通常行うように各変数の値を取得しようとすると、cfloop未定義であるというメッセージが表示されます。次に、各変数を変更してクエリを具体的に参照するようにしましたが、問題は変数がクエリで定義されていないことです。コードは次のとおりです。

<cffunction name="writeCourses">
<cfargument name="recordset" required="yes" type="query">
     <cfif recordset.RecordCount NEQ 0>
         <cfset temp = "">  
         <cfoutput>
         <cfloop query="recordset">     
         <!--- <cfdump var="#recordset#"> <cfabort/> --->  

            <cfset temp = temp & "<strong>#recordset.courseType# #recordset.courseNum# ">
            <cfif isDefined("recordset.courseTHM") AND recordset.courseTHM EQ 1>
                <cfset temp = temp & "(#left(recordset.courseNum,3)#4) ">
            </cfif>
            <cfif isDefined("recordset.courseName")>
                <cfset temp = temp & "#recordset.courseName# </strong><br>">
            </cfif>
            <cfset temp = temp & "#recordset.courseDESC#<br>">
            <cfset temp = temp & "#recordset.courseHours#<br><br>">
        </cfloop>
        </cfoutput>
     <cfelse>
        <cfset temp = "">
     </cfif>
 <cfreturn temp>
</cffunction>

ご覧のとおり、各変数は##タグで囲まれています。もともとそれらのいずれも処理されていませんでしたrecordset.が、まだ定義されていませんでした。cfdumpタグとタグのコメントを外すとcfabort、それらは正常にrecordset機能し、すべてのデータを含むクエリを正常に表示できます。

cfloopクエリで使用するたびに、期待どおりに機能します。また、このコードは私が書いたものではありません。変更する必要があります (元の作成者はここで働いていません)。

recordsetダンプの例を次に示します。

ここに画像の説明を入力

エラー メッセージ:
詳細: [空の文字列]
ErrNumber: 0
メッセージ: 要素 COURSETYPE が RECORDSET で定義されていません。
解決済みの名前: RECORDSET

エラー行は次のとおりです。

   <cfset temp = temp & "<strong>#recordset.courseType# #recordset.courseNum# ">   
   <cfif isDefined("recordset.courseTHM") AND recordset.courseTHM EQ 1>
   <cfset temp = temp & "(#left(recordset.courseNum,3)#4) ">
   </cfif>
   <cfif isDefined("recordset.courseName")>
   <cfset temp = temp & "#recordset.courseName# </strong><br>">
   </cfif>

それはすべて1行です:/

上記を呼び出すストアド プロシージャ/関数:

<cffunction name="getCoursesByDept">
<cfargument name="deptCode" required="yes" type="string">
<CFSTOREDPROC procedure="dbo.GetCourses"     datasource="WebCatalog">
    <CFPROCPARAM type="IN" dbvarname="@deptCode" value="#deptCode#" cfsqltype="CF_SQL_CHAR">
    <CFPROCRESULT name="result">
</CFSTOREDPROC>
<cfinvoke method="writeCourses" recordset="#result#" returnvariable="output">
<cfreturn output>
</cffunction>
4

2 に答える 2

1

あなたの問題は、スコープに失敗しているようです。最初の 4 行は次のとおりです。

<cffunction name="writeCourses">
<cfargument name="recordset" required="yes" type="query">
 <cfif recordset.RecordCount NEQ 0>
     <cfset temp = "">  

次のようにしてみてください。

<cffunction name="writeCourses">
<cfargument name="recordset" required="yes" type="query">
<cfset var temp = "">  
<cfif arguments.recordset.RecordCount NEQ 0>

違いは、ローカル変数 temp に var キーワードを使用することと、引数スコープをレコードセット変数に追加することです。

于 2013-04-16T22:55:26.760 に答える
0

(ダンのコメントに加えて...)

[プロシージャ] が何も見つからない場合、エラー メッセージを含むクエリが返されます (つまり、コースが見つかりません)。

次に、COURSETYPE列が に常に存在するとは限らないことを意味しますresultset。これは、エラー メッセージが報告していることとまったく同じです。プロシージャが結果を返す場合cfif内容に関係なく、ブロック内のコードが実行されます。コードの最初の行はその列を使用しているため、その列が存在することを確認せずに、表示されている正確なエラーが発生します。

resultまた、コメントで述べたように、関数変数、、、などoutputをローカライズする必要がありますtempvar変数名を再利用すると、同じページ内であっても、スコープがないと問題が発生する可能性があります。@Dan が示唆したように、すべての変数、特に function を完全にスコープする必要がありますarguments

(余談ですが、あなたが既存のコードを変更していることは理解していますが、エラー メッセージは実際にはプロシージャ内ではなくCF で処理する必要があります。プロシージャの仕事はデータを返すことだけです。CF コードは recordCount をチェックし、適切なアクションを実行する必要があります。レコードが見つからない場合。)

于 2013-04-17T02:35:44.243 に答える