DB-Abfrage liefert "277,00", angezeigt wird aber "277"?



  • Hallo zusammen,

    im DB-Manager selektiere ich mir eine Summe als float. Angezeigt wird auch eine Zahl mit zwei Nachkommastellen (277,00). Hier mal die Abfrage:

    select CAST(SUM(FA1214_TAG) AS NUMERIC(10,2)) AS SUMME from ABWASSER_ROHSTOFFE where (DATUM BETWEEN '07.09.2018' AND '09.09.2018')
    

    Wenn ich diese Abfrage jetzt aus meinem Programm her aufrufe, erhalte ich einen Rückgabewert ohne Nachkommastellen (277).

    Hier der gesamte Aufruf:

    sql = "select CAST(SUM(FA1214_TAG) AS NUMERIC(10,2)) AS SUMME from ABWASSER_ROHSTOFFE where (DATUM BETWEEN '"+datum_von+"' AND '"+datum_bis+"')";
    		DataModule2->DSetTonnRoh->SelectSQL->Clear();
    		DataModule2->DSetTonnRoh->SelectSQL->Add(sql);
    		DataModule2->DSetTonnRoh->Open();
    		EdFA_HDH->Text = DataModule2->DSTonnRoh->DataSet->FieldByName("SUMME")->AsFloat;
    				DataModule2->TTonnRoh->Commit();
    

    Was mache ich da falsch???

    Danke
    Torsten
    PS: Bin mir nicht Sicher ob ich hier oder doch im DB-Bereich posten sollte. Bitte ggf. umleiten. Danke


  • Global Moderator

    @torsten_156 sagte in DB-Abfrage liefert "277,00", angezeigt wird aber "277"?:

    Wenn ich diese Abfrage jetzt aus meinem Programm her aufrufe, erhalte ich einen Rückgabewert ohne Nachkommastellen (277).

    Woher weißt du das?



  • Im Debugger stelle ich den Cursor auf "->AsFloat" und erhalte da den Wert "277".



  • @torsten_156
    Ein Grund könnte das Komma in 277,00 sein.
    Andererseits gibt es auch keinen Unterschied im Wert zwischen 277,00 und 277



  • Das Komma ist es nicht. Wenn ich die Abfrage auf ein Datum ausführe, in dem ein Wert von z.B. "88,40" in der DB steht, erhalte ich als Rückgabe eine Summe von "88,4". Es werden also immer die Nullen nicht angezeigt. Warum werden diese denn unterdrückt???



  • AsFloat ist ein float? Dann verhält es sich wie ein float, d.h. insbesondere es hat keine fixen Nachkommastellen. Musst du hier vielleicht AsString oder etwas änliches verwenden?



  • Das ist egal. Auch wenn ich "AsString" verwende, wird mir ein "88,4" geliefert. Was mich dabei stutzig macht ist, dass ich im SQL-String ein Ergebnis als float definiere.



  • Die beiden "float"-Werte (DB und C++) sind aber unterschiedlich definiert.
    Der Datenbank-Wert wird einfach als IEEE 754-Wert im Dataset gespeichert (d.h. binär).
    Und bei der Umwandlung von float nach string im C++-Code (z.B. bei deiner Text-Zuweisung) wird die standardmäßige Textdarstellung verwendet (d.h. Nachkommastellen nur, wenn erforderlich - also ungleich 0).

    Wenn du schon im SQL die Nachkommastellen angeben möchtest, dann mußt du es dort als Text (varchar) ausgeben:

    select CAST(CAST(SUM(FA1214_TAG) AS NUMERIC(10,2)) as varchar(20)) AS SUMME from ABWASSER_ROHSTOFFE where (DATUM BETWEEN '07.09.2018' AND '09.09.2018')
    

    Und dann mittels FieldByName("SUMME")->AsStringausgeben.



  • SUPER, das war´s. Jetzt werden mir die Nachkommastellen angezeigt.

    Vielen Dank
    Gruß Torsten