2016-10-26 5 views
0

会計処理を行うためにいくつかの数値をループします。会計エラー - ColdFusion - 合計を加算しない

しかし、私は合計するst.hrsを追加しようとすると - 私はエラーが発生します。 値 ''は数値に変換できません。

任意のアイデアの人々...のRecordCountチェックがある理由です -

はst.hrsが存在しないので、それはだと思いましたか?

 <cfloop index = "ul" list = "#templist#"> 
      <cfset total = 0> 
      <cfoutput query="bl"> 
       <cfquery name="st" datasource="#tds#"> 
       SELECT * from billstaff 
       where billid = '#bl.billid#' and uid = '#ul#' 
       </cfquery> 
       <cfif st.recordcount is not 0> 
       <cfset total = #st.hrs# + total> 
       </cfif> 
      </cfoutput> 
      <cfoutput>#total#</cfoutput><br> 
     </cfloop> 
+2

一部のレコードではデータベースの合計フィールドにnull値があります。あなたが答えを得るためにsqlのsum()関数を使用しない理由はありますか? –

+0

Null値は私がrecordcountで削除したと思っていました。あなたはsum()を詳しく調べることができますか? –

+0

RecordCountは、クエリにレコードが含まれているかどうかを指示します。これらのレコードの列値については何も教えてくれません。個々の値をチェックする必要があります。 Danは、集合SUMを使用して、ループ内でクエリを実行するのではなく、単一のクエリで合計量を計算することを提案しています。詳細については、blクエリのSQLをポストする必要があります。 – Leigh

答えて

1

短い答え:

あなただけの、合計を計算する基本的なSUM()集約して、単一のクエリを使用してのダンの提案で行く必要がある場合。私はダンを精巧にするつもりですが、それはループ内でのクエリよりも効率的です。

長い答え:

ただ、元のエラーに対処するため、これはスコープの変数は良い習慣である理由の良い例です。スコープの欠如は、致命的なエラーを引き起こした原因です。しかし、それは簡単に見つけることが容易ではない論理エラーを同様に簡単に引き起こす可能性があります。

total変数をスコープなしで初期化すると、デフォルトのvariablesスコープになります。だから、基本的にこれをやっている:

<cfset variables.total = 0>

あなたが外側のクエリをループし、現在の行のデータが変数に割り当てられたが、異なる範囲に入った場合:(擬似)クエリを範囲。クエリー列の一つがtotal名前を付けることを起こるので、うっかりループは、ここで合計を試してみて、計算したときに物事が横に行く原因となる二total変数を作成します。

<cfset total = #st.hrs# + total>

total変数はスコープされていないので、CFはどちらを使用するべきかを推測しなければならず、この場合は間違っていると推測されます。

evaluated according to these rulesの変数は、variablesよりも高い優先度をクエリスコープに指定します。その結果、CFはvariables.totalの代わりにbl.totalの値を使用します。 bl.totalがnull(または空の文字列)であるので、それは 『「値』を引き起こし、すなわちvariables.total、変数のスコープを指定する。数エラーに変換することができないというエラーを防止するであろう。

を再度、よりよいがあります単純に合計を計算する方法ですが、実際にクエリループが必要な場合は、競合の可能性を避けるためにすべての変数の範囲を設定してください。