Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Rechnen mit Numeric Werten aus DB (https://www.delphipraxis.net/84546-rechnen-mit-numeric-werten-aus-db.html)

TankWart 18. Jan 2007 12:01

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

Rechnen mit Numeric Werten aus DB
 
Hallo zusammen,
wie muss ich es anstellen das ich mit Numeric Werten aus einer Datenbank rechnen kann.
Das Problem ist, das die Werte immer mit Komma statt einem Punkt ausgegeben werden,
also zum Beispiel 4,879 statt 4.879.

Im Moment mache ich das noch so:
Delphi-Quellcode:
//Wert 1
bLastScale := ZQContest.FieldByName('bLastScale').AsString;
//Wert 2
bFirstScale := ZQContest.FieldByName('bFirstScale').AsString;
//**Kommas durch Punkt ersetzen
StringReplace(bLastScale, ',', '.', [rfReplaceAll]);
StringReplace(bFirstScale, ',', '.', [rfReplaceAll]);
//Wert 1 - Wert 2
menge := (StrToFloat(bFirstScale) - StrToFloat(bLastScale));
Soweit klappt ja alles, bis auf das es ziemlich umständlich ist.

Wenn ich aber jetzt das Ergebnis wieder in die Datenbank in ein Numericfeld
zurückschreiben möchte, dann gibt es Probleme, Stacoverflow und so.

Delphi-Quellcode:
//Punkt durch komma ersetzen, sonnst Stack overflow
mengeStr := StringReplace(FloatToStr(menge), ',', '.', [rfReplaceAll]);
menge := StrToFloat(mengeStr);

ZQContest.RequestLive := True;
ZQContest.FieldByName('amount').AsFloat := menge;
ZQContest.RequestLive := False;
panAmount.Caption :=
ZQContest.FieldByName('amount').AsString;
panContestTotalAmount.Caption :=
ZQContest.FieldByName('amount').AsString;
Jetzt kommt aber eine Meldung, "4.879' is not a valid floationg point value.

Kann mir bitte jemand erklären wie ich richtig vorgehen muss??

Ich danke schon mal im Voraus

mkinzler 18. Jan 2007 12:05

Re: Rechnen mit Numeric Werten aus DB
 
Warum ersetzt du das Komma mit einem Punkt?

peteress 18. Jan 2007 12:41

Re: Rechnen mit Numeric Werten aus DB
 
Warum behandelst du die Werte als String. Es sind doch numerische Werte, also ruf sie auch so ab. Die Konvertierung in und von Strings zurück in numerische Werte ist nicht eindeutig, wird durch eine Vielzahl von Einstellungen in Datenbank, System und Delphicompiler beinflusst, und schreit nach Problemen únd unnötiger Arbeit.
Delphi stellt hierfür ja auch die benötigten Abrufmethoden zur Verfügung:

asfloat, asinteger, ascurrency ...

TankWart 18. Jan 2007 12:55

Re: Rechnen mit Numeric Werten aus DB
 
Danke erst mal für die schnellen Antworten.

Da habt ihr schon recht, das ganze ist schon überflüssig,
da hab ich wohl zu viel rumprobiert, weil es einfach nicht so klappt, wie es soll.

Ich hab die Berechnung noch einmal geändert:
Delphi-Quellcode:
menge := dmSnuffer.ZQContest.FieldByName('bFirstScale').AsFloat -
         dmSnuffer.ZQContest.FieldByName('bLastScale').AsFloat;
Möchte ich aber jetzt das Ergebnis wieder in die Datenbank schreiben,
kommt eine Meldung über einen Stack overflow.
Delphi-Quellcode:
ZQContest.RequestLive := True;
ZQContest.FieldByName('amount').AsFloat := menge;
ZQContest.RequestLive := False;
Wo könnte da das Problem liegen?

marabu 18. Jan 2007 14:57

Re: Rechnen mit Numeric Werten aus DB
 
Hallo,

RequestLive musst du schon vor dem Öffnen und Auslesen der Query auf True setzen - wenn deine Query das zulässt. Um Feldwerte zu aktualisieren gehst du dann so vor:

Delphi-Quellcode:
with Query do
begin
  Edit;
  FieldByName('amount').AsFloat := menge;
  // ...
  try
    Post
  except
    Cancel;
  end;
end;
Grüße vom marabu

hoika 22. Jan 2007 11:02

Re: Rechnen mit Numeric Werten aus DB
 
Hallo,

welchen Typ hat das Feld in der Tabelle ?
Falls du Numeric(x,y) nimmst, ist das der Fehlöer.

Double Precision musst du nehmen.

Numeric-Typen werden von Firebird bis x=8 als Integer gespeichert.


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:01 Uhr.

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