![]() |
"" kein gültiger Gleitkommawert
Hallo, folgender Code produziert mir den Fehler "" kein Gültiger Gleitkommawert, sobald
der feldwert den er einlesen soll 0 ist. Auserdem übernimmt er nur die 1. stelle nach dem komma. sprich er macht aus 199,24 --> 199,2. das Feld ist in meiner DB mit numeric(12,2) deklariert. An was kann das liegen?!?
Delphi-Quellcode:
procedure TForm8.Button1Click(Sender: TObject);
var masterSL : TStringList; detailSL : TStringList; ndx : Integer; // Laufvariable für Master begin masterSL := TStringList.Create; // Master StringList detailSL := TStringList.Create; // Detail StringList try detailSL.Delimiter := ';'; // Trennzeichen der Einträge pro Zeile detailSL.QuoteChar := '|'; // Quoting Zeichen. masterSL.LoadFromFile(''+edit1.text+''); progressbar1.max := mastersl.count; for ndx := 0 to Pred (mastersl.Count) do begin progressbar1.Position := ndx; detailsl.Clear; detailsl.DelimitedText := '|' + StringReplace(mastersl.Strings[ndx],';','|;|',[rfReplaceAll]); //detailsl.savetofile('c:\test.txt'); while detailsl.Count < 3 do detailsl.Add(''); with DataModule2.IBQuery1 do begin Close; SQL.Text := 'INSERT INTO '+edit2.text+'(Artikelnummer, Bezeichnung, Verkaufspreis) VALUES (:wert1,:wert2,:wert3)'; ParamCheck := True; ParamByName('wert1').AsString := detailsl.Strings[0]; ParamByName('wert2').AsString := detailsl.Strings[1]; ParamByName('wert3').AsBCD := strtocurr(detailsl.Strings[2]); <-------- das müsste die zeile sein ExecSQL; end; datamodule2.IBTransaction1.Commit; //DataModule2.IBTransaction1.Commit; //If RecsInTransact > 500 then //begin //IBTransaction1.Commit; //RecsInTransact := 0; //end; //inc(RecsInTransact); end; finally FreeAndNil (mastersl); FreeAndNil (detailsl); progressbar1.Position := 0; if MessageDLg('Einlesen abgeschlossen!', mtConfirmation,[mbOK],0)=mrOK then end; end; |
Re: "" kein gültiger Gleitkommawert
Hallo Michael,
ich würde es mal mit
Delphi-Quellcode:
versuchen.
ParamByName('wert3').AsString := detailsl.Strings[2]; <-------- das müsste die zeile sein
|
Re: "" kein gültiger Gleitkommawert
Zitat:
|
Re: "" kein gültiger Gleitkommawert
Hai Michael80,
warum lässt Du die "Umwandlung" nicht durch den Treiber machen?
Delphi-Quellcode:
So sollte es genau so gut gehen!
procedure TForm8.Button1Click(Sender: TObject);
. . ParamByName('wert1').AsString := detailsl.Strings[0]; ParamByName('wert2').AsString := detailsl.Strings[1]; ParamByName('wert3').AsString := detailsl.Strings[2]; <-------- das müsste die zeile sein ExecSQL; . . end; |
Re: "" kein gültiger Gleitkommawert
Zitat:
|
Re: "" kein gültiger Gleitkommawert
Hab ich dir nicht schon mal geraten folgende Zeilen ausserhalb der Schleife zu schreiben ??
Delphi-Quellcode:
Und DataModule2.IBQuery1.Close muss ganz weg!!!
SQL.Text := 'INSERT INTO '+edit2.text+'(Artikelnummer, Bezeichnung, Verkaufspreis) VALUES (:wert1,:wert2,:wert3)';
ParamCheck := True; Entweder man arbeitet mit einer Ergebnismenge (und die liefert nur SELECT) und benützt dann IBQuery.Open und IBQuery.Close oder bei SQL-Anweisungen ohne Ergebnismenge (INSERT, UPDATE, DELETE, ..) arbeitet man nur mit IBQuery.ExecSQL. Man soll diese 2 Arbeitsweisen nicht mischen. |
Re: "" kein gültiger Gleitkommawert
Zitat:
|
Re: "" kein gültiger Gleitkommawert
Zitat:
|
Re: "" kein gültiger Gleitkommawert
Zitat:
Zitat:
Ein blindes Umwandeln von ',' zu '.' kann ich nicht empfehlen. Vielmehr sollte man die Werte lokal in den Zieltyp umwandeln. Schließlich hat der User sein System so eingestellt, wie er es für "richtig" empfindet. Ob der Server jetzt auf deutsch, englisch oder japanisch läuft interessiert dann nicht mehr. Das war also gar nicht so falsch ;)
Delphi-Quellcode:
ParamByName('wert3').AsBCD := strtocurr(detailsl.Strings[2]);
|
Re: "" kein gültiger Gleitkommawert
So, dieser code würde funktionieren, wenn er nicht immernoch eine Kommastelle abschneiden würde. Seltsam ist (dank an r_kerber) wenn ich
statt :wert3 gleich 1.28 eintrag, schreibt er mir auch 1,28 in die DB. lass ichs über :wert3 laufen macht er wieder 1,2 :wall:
Delphi-Quellcode:
procedure TForm8.Button1Click(Sender: TObject);
var masterSL : TStringList; detailSL : TStringList; ndx : Integer; // Laufvariable für Master begin masterSL := TStringList.Create; // Master StringList detailSL := TStringList.Create; // Detail StringList try detailSL.Delimiter := ';'; // Trennzeichen der Einträge pro Zeile detailSL.QuoteChar := '|'; // Quoting Zeichen. masterSL.LoadFromFile(''+edit1.text+''); progressbar1.max := mastersl.count; for ndx := 0 to Pred (mastersl.Count) do begin progressbar1.Position := ndx; detailsl.Clear; detailsl.DelimitedText := '|' + StringReplace(mastersl.Strings[ndx],';','|;|',[rfReplaceAll]); //detailsl.savetofile('c:\test.txt'); DataModule2.IBQuery1.SQL.Text := 'INSERT INTO '+edit2.text+'(Artikelnummer, Bezeichnung, Verkaufspreis) VALUES (:wert1,:wert2,:wert3)'; DataModule2.IBQuery1.ParamCheck := True; while detailsl.Count < 3 do detailsl.Add(''); with DataModule2.IBQuery1 do begin ParamByName('wert1').AsString := detailsl.Strings[0]; ParamByName('wert2').AsString := detailsl.Strings[1]; ParamByName('wert3').AsString := detailsl.Strings[2]; ExecSQL; end; datamodule2.IBTransaction1.Commit; end; finally FreeAndNil (mastersl); FreeAndNil (detailsl); progressbar1.Position := 0; if MessageDLg('Einlesen abgeschlossen!', mtConfirmation,[mbOK],0)=mrOK then end; end; Zitat:
macht er wieder 1,2 wenn ich schreib
Delphi-Quellcode:
trägt er es wieder richtig ein
ParamByName('wert3').AsBCD := strtocurr('1,28');
wobei er dann wieder meckert mit "" ist kein gleitkommwert, sobald als Wert die 0 vorkommt. also tendier ich zum oberen code! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 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-2025 by Thomas Breitkreuz