Float Rechnen?

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Float Rechnen?

Beitrag von TT73GP7 »

hach :(

ich bin grade ein bissel am rumfummeln und irgendwie bekomme ich einen fehler nach dem anderen :(

also ich habe ein Feld mit einen Preis.
solange ich es als ganz zahl angebe kann ich damit machen was ich will.

aber sobald der Preis 6,50€ geht es in die Hose :(

Technik:
SQLite
ZeosLib

Fehlermeldung:
3160.0 is an Invalid Float

die 3160.0 kommt zustande weil der Stückpreis * Lageranzahl

Code: Alles auswählen

 
Function aktWert(nWert: double):double;
begin
  SQL('SELECT b.id, b.Artikelname, round(b.STD_PREIS,2), case when Sum(a.Buchung) <> "" then Sum(a.Buchung) else 0 end as Anzahl, round((b.STD_PREIS * sum(a.Buchung)),2) as Ges FROM dbArtikel b left join dbLagerpositionen a on a.fk_artikel = b.id Group by b.id ');
  Data.DS.DataSet.First;
  nWert := 0;
  while not Data.DS.DataSet.EOF do
  begin
    if (Data.DS.DataSet.FieldByName('Ges').Text = '') then
    begin
      nWert := nWert + 0;
    end else
    begin
      nWert := nWert + Data.DS.DataSet.FieldByName('Ges').AsFloat;
    end;
      Data.DS.DataSet.next;
    end;
 
     aktWert := nWert;
end;   
 


hach hat jemand einen Plan?

VG

:)

MmVisual
Beiträge: 1466
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Float Rechnen?

Beitrag von MmVisual »

nWert := nWert + TFloatField(Data.DS.DataSet.FieldByName('Ges')).AsFloat;
EleLa - Elektronik Lagerverwaltung - www.elela.de

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: Float Rechnen?

Beitrag von TT73GP7 »

nee ist es leider nicht

da muss irgendwie noch ein logik fehler drin sein :(

wp_xyz
Beiträge: 4888
Registriert: Fr 8. Apr 2011, 09:01

Re: Float Rechnen?

Beitrag von wp_xyz »

Code: Alles auswählen

Function aktWert(nWert: double):double;
var
  fs: TFormatSettings;
begin
  fs := DefaultFormatSettings;
  DefaultformatSettings.DecimalSeparator := '.';
 
  SQL('SELECT b.id, b.Artikelname, round(b.STD_PREIS,2), case when Sum(a.Buchung) <> "" then Sum(a.Buchung) else 0 end as Anzahl, round((b.STD_PREIS * sum(a.Buchung)),2) as Ges FROM dbArtikel b left join dbLagerpositionen a on a.fk_artikel = b.id Group by b.id ');
  Data.DS.DataSet.First;
  nWert := 0;
  while not Data.DS.DataSet.EOF do
  begin
    if (Data.DS.DataSet.FieldByName('Ges').Text = '') then
    begin
      nWert := nWert + 0;
    end else
    begin
      nWert := nWert + Data.DS.DataSet.FieldByName('Ges').AsFloat;
    end;
      Data.DS.DataSet.next;
    end;
 
   aktWert := nWert;
 
  DefaultFormatSettings := fs;
end;

Erwin
Beiträge: 286
Registriert: Mi 16. Sep 2009, 14:15
OS, Lazarus, FPC: Xubuntu 22.04 / x86_64_linux-gtk 2 / L 2.2.0 / FPC 3.2.2

Re: Float Rechnen?

Beitrag von Erwin »

TT73GP7 hat geschrieben:Fehlermeldung:
3160.0 is an Invalid Float

Müsste es in der Deutschen Version nicht 3160,0 sein? Statt den Punkt?
Aber normalerweise erkennt Lazarus/FP meines Wissens so was automatisch und wandelt es dem Land entsprechend um. Es sei denn ... es liegt daran, dass die Daten aus der Datenbank übernommen wird?
Leider ist meine Arbeit mit einer Datenbank zu lange her, als dass ich noch wüsste, wie ich es behoben habe, und ob es überhaupt das gleiche Problem war?
Lazarus 2.2.0 / FP 3.2.4

MmVisual
Beiträge: 1466
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Float Rechnen?

Beitrag von MmVisual »

Zeos versucht den Feldtyp aus den Metadaten zu ermitteln, da jedoch 'Ges' ein berechnetes Feld ist kann das Zeos nicht und interpretiert das Feld als Text. Daher gibt es Probleme bei der Float Wandlung und man muss das selbst richtig machen:

Code: Alles auswählen

s := StringReplace(Data.DS.DataSet.FieldByName('Ges').AsString, '.', DefaultFormatSettings.DecimalSeparator, []);
s := StringReplace(s, ',', DefaultFormatSettings.DecimalSeparator, []);
nWert := nWert + StrToFloatDef(s, 0);


In der Regel reicht ein Typecast als TFloatField(), da wohl das Komma nicht korrekt ist (oder was anderes falsches drin steht) klappt das nicht.
Nun kannst Du auch noch weitere Fehler abfangen, wie z.B. wenn anstatt der Zahl da irgend ein anderer Text kommt.
EleLa - Elektronik Lagerverwaltung - www.elela.de

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: Float Rechnen?

Beitrag von TT73GP7 »

gute idee

da hätte ich auch selber drauf kommen können

joar komma ist falsch
aber nun läuft es

vielen dank

Antworten