Einzelnen Beitrag anzeigen

GroHae

Registriert seit: 19. Apr 2007
Ort: Nabburg
83 Beiträge
 
Delphi 2007 Enterprise
 
#8

Datentyp Real im Vergleich zu Decimal

  Alt 20. Okt 2008, 11:31
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
Grüße

Thomas
  Mit Zitat antworten Zitat