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
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? –
Die Null-Werte, die ich dachte, habe ich mit recordcount entfernt.Kannst du die Summe() erläutern? –
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