2016-10-26 2 views
0

Schleife durch einige Zahlen für einige Buchhaltung.Accounting Error - ColdFusion - Fügt keine Summe hinzu

Aber wenn ich versuche, die st.hrs zu addieren - bekomme ich einen Fehler. Der Wert '' kann nicht in eine Zahl umgewandelt werden.

Ich dachte, es war, weil die st.hrs nicht vorhanden ist - das ist, warum es die Record Scheck ...

Irgendwelche Ideen Leute?

 <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

Die fragliche Datenbank enthält Nullwerte im Gesamtfeld für einige Datensätze Um Strings zu leeren Gibt es irgendeinen Grund, warum Sie die sum() -Funktion von sql nicht benutzen, um Ihre Antwort zu bekommen? –

+0

Die Null-Werte, die ich dachte, habe ich mit recordcount entfernt.Kannst du die Summe() erläutern? –

+0

RecordCount sagt Ihnen nur, ob die Abfrage Datensätze enthält. Es sagt nichts über die Spaltenwerte in diesen Datensätzen aus. Sie müssen die einzelnen Werte überprüfen. Dan schlägt vor, dass Sie das Aggregat SUM verwenden, um den Gesamtbetrag in einer einzelnen Abfrage zu berechnen, anstatt innerhalb einer Schleife abzufragen. Sie müssten das SQL für die BL-Abfrage für Details veröffentlichen. – Leigh

Antwort

1

Kurze Antwort:

Wenn Sie nur eine Gesamt berechnen müssen, gehen Sie mit Dan Vorschlag eine einzelne Abfrage zu verwenden, mit einer grundlegenden SUM() Aggregat. Ich werde Dan weiter ausführen lassen, aber das wäre effizienter als Abfragen in einer Schleife.

Lange Antwort:

einfach den ursprünglichen Fehler zu adressieren, ist dies ein gutes Beispiel dafür, warum Scoping-Variablen sind eine gute Praxis. Das Fehlen von Scoping hat den fatalen Fehler verursacht. Es könnte jedoch genauso leicht Logikfehler verursachen, die nicht so einfach zu erkennen sind.

Initialisierung der total Variable ohne einen Bereich bedeutet, dass es im Standardbereich variables endet. So machst du im Wesentlichen diese:

<cfset variables.total = 0>

Wenn Sie eine Schleife durch die äußere Abfrage, die Daten in der aktuellen Zeile Variablen zugewiesen wird, sondern in einem anderen Bereich: die (psuedo) -Abfrage Umfang. Da eine der Abfrage Spalten geschieht total genannt werden, schafft die Schleife versehentlich eine zweite total Variable, die Dinge verursacht gehen seitwärts, wenn Sie die Summe versuchen und berechnen hier:

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

Da die Variable total nicht im Bereich liegt, muss CF erraten, welche der beiden Variablen verwendet werden soll, und in diesem Fall wird falsch geraten.

Variablen ohne Gültigkeitsbereich sind evaluated according to these rules, die dem Abfragebereich eine höhere Priorität geben als variables. Als Ergebnis verwendet CF den bl.total-Wert anstelle von variables.total. Da bl.total null ist (oder ein leerer String), das bewirkt, dass der „value‚‘können zu einer Anzahl Fehler nicht umgewandelt werden. Die Angabe der variable Umfang, dh variables.total, würde diesen Fehler vermeiden.

Auch hier gibt es eine bessere Möglichkeiten, einfach eine Summe zu berechnen Wenn Sie wirklich eine Abfrage-Schleife benötigen, stellen Sie sicher, dass alle Variablen in einem Bereich liegen, um mögliche Konflikte zu vermeiden

Verwandte Themen