Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Gleitkomma Wert, Nachkomma wird nicht dargestellt (https://www.delphipraxis.net/88042-gleitkomma-wert-nachkomma-wird-nicht-dargestellt.html)

TankWart 9. Mär 2007 11:08

Datenbank: firebird • Version: 1.5 • Zugriff über: ZEOS

Gleitkomma Wert, Nachkomma wird nicht dargestellt
 
Hallo zusammen,
wie muss ich Double Werte speichern, damit sie mir wieder richtig angezeigt werden?

Momentan gehe ich noch so vor:
Speichern:
Delphi-Quellcode:
menge :=
(StrToFloat(panFirstScale.Caption) - StrToFloat(medtLastBalance.Text));

MengeStr   := FloatToStr(Menge);
MengeStr   := Format('%.3f', [Menge]);

MengeStr :=
StringReplace(MengeStr, ',', '.', [rfReplaceAll]);

ZQuery1.Close;
ZQuery1.SQL.Clear;
ZQuery1.SQL.Text := 'UPDATE gesammt SET points = ' + MengeStr +
' WHERE gid = ' + ZQWettkampf.FieldByName('gid').AsString;
ZQuery1.ExecSQL;
Also, zuerst die Berechnung.
Dann Format, es sollen immer 3 Nachkommastellen sein.
Dann Komma durch Punkt ersetzen, sonnst kommt beim ausführen von ExecSQL eine Fehlermeldung.
Wert in DB speichern
Wert in DB ist dann z.B. 6,456.

Ist das mit dem Komma richtig?
Ich denke schon da er einen Punkt doch als tausender Trennzeigen erkennt.

Lesen:
Delphi-Quellcode:
erg2 := ZQWettkampf.FieldByName('points').AsString;
erg := ZQWettkampf.FieldByName('points').AsFloat;
Wenn ich jetzt den Wert aus der DB lese, egal ob als String, oder Float, schneidet er mir immer die Nachkommastelle ab,
obwohl der Wert richtig in der DB steht.

Verstehe das echt nicht, warum er mir nicht mal den Wert als String richtig ausgibt, bin schon am Verzweifeln.


Ich danke schon mal im Voraus

Gruß

TankWart

mkinzler 9. Mär 2007 11:12

Re: Gleitkomma Wert, Nachkomma wird nicht dargestellt
 
Warum wird immer versucht alle Tapen als strings im Klartext in die Datenbank einzutragen? Da muß man sich mit alle Eventualitäten der Datentypen herumschlagen. Laß diese Arbeit doch von Delphi/dem DBMS lösen und verwende Parameter.

TankWart 9. Mär 2007 11:15

Re: Gleitkomma Wert, Nachkomma wird nicht dargestellt
 
mhh??
verstehe jetzt nicht ganz, wie soll ich da dann vorgehn?
Löst das mein Problem?

hoika 9. Mär 2007 11:17

Re: Gleitkomma Wert, Nachkomma wird nicht dargestellt
 
Hallo,

*zustimm*

Entweder "double precision" als Feldtyp nehmen
und mit AsFloat speichern.


oder noch besser, falls die Nachkommastellen fest sind (z.B. bei Euro),
gleich nur Integer speichern (also bei Euro die EuroCent).
Dann kann man mit den Werten gleich Rechnen in der DB.


Heiko

PS: Numeric speichert stellenweise als Integer ab.

TankWart 9. Mär 2007 11:30

Re: Gleitkomma Wert, Nachkomma wird nicht dargestellt
 
super hoika,
das Hilft mir schon mal.

Sollte ich in Zukunft meine Werte Übergabe mit Parametern lösen?
Ist das die elegantere Art?
Und wo liegen da die Vorteile?

Möcht ja lernen und mich verbessern.

Danke an alle


Gruß

TankWart

mkinzler 9. Mär 2007 11:43

Re: Gleitkomma Wert, Nachkomma wird nicht dargestellt
 
Verwendung Parameter:
Delphi-Quellcode:
ZQuery1.SQL.Text := 'UPDATE gesammt SET points = :points WHERE gid = :gid';
...
ZQuery1.SQL.ParamByName('gid').Value := ZQWettkampf.FieldByName('gid').Value;
ZQuery1.SQL.ParamByName('points').Value :=Menge;
ZQuery1.ExecSQL;
Vorteile:
-Wenn Datenformat variabel ist (Datum, Dezimaltrenne/Tausendertrenner, ...) muß man sich nicht drum kümmern.
-beim mehrfacher Verwendung muß man nur die Parameter neu belegen.
-übersichtlicher als zusammengestückelter Abfragestring
-...

[Edit: Tippfehler korrigiert]

TankWart 9. Mär 2007 12:05

Re: Gleitkomma Wert, Nachkomma wird nicht dargestellt
 
danke mkinzler,
werde in Zukunft dann wohl mit Parametern arbeiten.


Gruß

TankWart

hoika 9. Mär 2007 14:29

Re: Gleitkomma Wert, Nachkomma wird nicht dargestellt
 
Hallo,

ein weiterer Vorteil ist,
dass die Query "prepared" werden kann.
Das heisst, der SQL-Server muss den Queryplan nur einmal "berechnen".

Firebird ist damit etwa 50% schneller,
wenn z.B. Daten in einer Schleife eingetragen werden.

Delphi-Quellcode:
Query.Prepare;
for i to
begin
  ParambyNamr() bla

  ExecSQL;
end;
Bei ZEOS muss man das nicht selber machen,
sondern die Query wird bei erster Benutzung prepared und bleibt,
solange sich der SQL-Text nicht ändert.



Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz