Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi "" kein gültiger Gleitkommawert (https://www.delphipraxis.net/24450-kein-gueltiger-gleitkommawert.html)

Michael80 21. Jun 2004 10:14


"" 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;

r_kerber 21. Jun 2004 10:20

Re: "" kein gültiger Gleitkommawert
 
Hallo Michael,

ich würde es mal mit
Delphi-Quellcode:
        ParamByName('wert3').AsString := detailsl.Strings[2]; <-------- das müsste die zeile sein
versuchen.

Michael80 21. Jun 2004 10:22

Re: "" kein gültiger Gleitkommawert
 
Zitat:

Zitat von r_kerber
Hallo Michael,

ich würde es mal mit
Delphi-Quellcode:
        ParamByName('wert3').AsString := detailsl.Strings[2]; <-------- das müsste die zeile sein
versuchen.

da trägt er die werte gar nicht ein sobald ein, drin vorkommt

Sharky 21. Jun 2004 10:22

Re: "" kein gültiger Gleitkommawert
 
Hai Michael80,

warum lässt Du die "Umwandlung" nicht durch den Treiber machen?

Delphi-Quellcode:
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;
So sollte es genau so gut gehen!

Sharky 21. Jun 2004 10:23

Re: "" kein gültiger Gleitkommawert
 
Zitat:

Zitat von Michael80
...da trägt er die werte gar nicht ein sobald ein, drin vorkommt

Dann wandele vorher die , mit StringReplace in . um ;-)

shmia 21. Jun 2004 10:37

Re: "" kein gültiger Gleitkommawert
 
Hab ich dir nicht schon mal geraten folgende Zeilen ausserhalb der Schleife zu schreiben ??
Delphi-Quellcode:
   SQL.Text := 'INSERT INTO '+edit2.text+'(Artikelnummer, Bezeichnung, Verkaufspreis) VALUES (:wert1,:wert2,:wert3)';
   ParamCheck := True;
Und DataModule2.IBQuery1.Close muss ganz weg!!!
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.

Michael80 21. Jun 2004 10:42

Re: "" kein gültiger Gleitkommawert
 
Zitat:

Zitat von shmia
Hab ich dir nicht schon mal geraten folgende Zeilen ausserhalb der Schleife zu schreiben ??
Delphi-Quellcode:
   SQL.Text := 'INSERT INTO '+edit2.text+'(Artikelnummer, Bezeichnung, Verkaufspreis) VALUES (:wert1,:wert2,:wert3)';
   ParamCheck := True;
Und DataModule2.IBQuery1.Close muss ganz weg!!!
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.

okok hab ich vergessen :oops:

Michael80 21. Jun 2004 17:48

Re: "" kein gültiger Gleitkommawert
 
Zitat:

Zitat von shmia
Hab ich dir nicht schon mal geraten folgende Zeilen ausserhalb der Schleife zu schreiben ??
Delphi-Quellcode:
   SQL.Text := 'INSERT INTO '+edit2.text+'(Artikelnummer, Bezeichnung, Verkaufspreis) VALUES (:wert1,:wert2,:wert3)';
   ParamCheck := True;

wenn ich jetz richtig bin übergibt er dann mit exec sql die einzelnen werte, richtig??

Robert_G 21. Jun 2004 18:22

Re: "" kein gültiger Gleitkommawert
 
Zitat:

warum lässt Du die "Umwandlung" nicht durch den Treiber machen?
In den seltensten Fällen wandelt der Treiber Parameter vom Typ Unknown um (DOA macht es zum Bleistift nicht (ist ja auch kein Treiber ;) ) -> die DB muss das dann erledigen. Mit etwas Pech für JEDEN Aufruf.

Zitat:

...da trägt er die werte gar nicht ein sobald ein, drin vorkommt
Das gute, alte Problem mit unterschiedlichen Regional settings von Client und Server.
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]);

Michael80 21. Jun 2004 18:47

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:

Zitat von Robert_G
Das war also gar nicht so falsch
Source:
ParamByName('wert3').AsBCD := strtocurr(detailsl.Strings[2]);

(sourcetabelle ist wieder mit Kommas)

macht er wieder 1,2

wenn ich schreib

Delphi-Quellcode:
ParamByName('wert3').AsBCD := strtocurr('1,28');
trägt er es wieder richtig ein

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.
Seite 1 von 2  1 2      

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