weil ich gerade 4 Stunden für die Fehlersuche benötigt habe:
Auch wenn die Daten in der Tabelle keine NULL enthalten, habe ich das Problem, dass bei Summen im
SQL Befehl Vorsicht ratsam ist:
Ist der Datentyp des Feldes über das man summiert
Real würde folgendes fehlerfrei laufen
auch wenn ich durch die WHERE Einschränkung
keine Daten zurück bekomme
Delphi-Quellcode:
// SQL Befehl
MyCommandVorbereitung;
with MyCommand
do
begin
Text := '
SELECT SUM(Nettogewicht) AS Sum_Nettogewicht ' +
'
FROM '+ GetTblName + '
WHERE ' +
'
(UnternehmenNr_ID = ?) AND ' +
'
(Belegdatum BETWEEN ? AND ?) AND ' +
'
(Markenstamm = ?)';
AddParameterInt32(iUnternehmen);
AddParameterDate(iVonDatum);
AddParameterDate(iBisDatum);
AddParameterString(iMarke);
end;
MyCommandExecuteQuery;
// Daten holen
ioGewicht := 0;
while Next
do
begin
ioGewicht := MyReader.Value['
Sum_Nettogewicht'].GetDouble;
// hier wird 0 zurückgegeben wenn KEINE Daten da sind.
end;
Ist der Datentyp des Feldes über das man summiert
Decimal würde folgendes
NICHT fehlerfrei laufen
wenn ich durch die WHERE Einschränkung
keine Daten zurück bekomme
Delphi-Quellcode:
// SQL Befehl
MyCommandVorbereitung;
with MyCommand
do
begin
Text := '
SELECT SUM(Nettogewicht) AS Sum_Nettogewicht ' +
'
FROM '+ GetTblName + '
WHERE ' +
'
(UnternehmenNr_ID = ?) AND ' +
'
(Belegdatum BETWEEN ? AND ?) AND ' +
'
(Markenstamm = ?)';
AddParameterInt32(iUnternehmen);
AddParameterDate(iVonDatum);
AddParameterDate(iBisDatum);
AddParameterString(iMarke);
end;
MyCommandExecuteQuery;
// Daten holen
ioGewicht := 0;
while Next
do
begin
ioGewicht := BcdToDouble(MyReader.Value['
Sum_Nettogewicht'].GetBcd);
// Fehler: "BCD-Überlauf" möglich
end;
In dem Moment wo GetBcd aufgerufen wird bekomme ich die Meldung "BCD-Überlauf"
ich muss also in diesem Fall mit
Delphi-Quellcode:
Text := 'SELECT ISNULL(SUM(Nettogewicht),0) AS Sum_Nettogewicht, ' +
'ISNULL(SUM(BetragMW),0) AS Sum_BetragMW FROM '+ GetTblName + ' WHERE ' +
'(UnternehmenNr_ID = ?) AND ' +
'(Belegdatum BETWEEN ? AND ?) AND ' +
'(Markenstamm = ?)';
arbeiten. Dann klapp es immer.
Oder anders gesagt: Nutze immer ISNULL bei Summenberechnung