Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Import aus Access >> ThousandSeparator (https://www.delphipraxis.net/80869-import-aus-access-thousandseparator.html)

manfred_h 16. Nov 2006 15:47

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

Import aus Access >> ThousandSeparator
 
Hallo zusammen

ich versuche Daten aus einer Access DB nach Firebird zu Importieren.
Das ganze geht auch bis ich eine Zahl habe die über 999 ist.

Da Access das ganze so 7.111,15 gespeichert hat. Erhalte ich immer die
Fehlermeldung:
7.111,15 is not a valid BCD value

Hat auch Anfangs probleme mit dem Dezimalseparator aber dank der Forumssuche bin ich da weitergekommen.

Der code sieht folgendermassen aus:

Delphi-Quellcode:
    DM.DB_Gideons.Connected := True;
    DM.Default_D.Open;
    DecimalSeparator := ',';
    ThousandSeparator := '.';
    frm_main.log_window.Lines.Add('==================history=================');
    if not DM.Camps.Active then DM.Camps.Open;
      try
        DM.ADOT_Default_d_imp.Open;
        DM.ADOT_Default_d_imp.First;
        for i := 0 to DM.ADOT_Default_d_imp.RecordCount -1 do begin
          with DM.Default_D do
          begin
            Insert;
            FieldByName('ID').AsString         := DM.ADOT_default_d_imp.FieldByName('ID').AsString;
            FieldByName('C_NR').AsString       := DM.Camps.FieldByName('C_NR').AsString;
            FieldByName('U_NR').AsString       := DM.Camps.FieldByName('U_NR').AsString;
            FieldByName('ID_AREA').AsString    := DM.ADOT_default_d_imp.FieldByName('id_sparte').AsString;
            FieldByName('H_DATE').AsString     := DM.ADOT_default_d_imp.FieldByName('datum').AsString;
            FieldByName('H_KIND_SERVICE').AsString := DM.ADOT_default_d_imp.FieldByName('Art_Dienst').AsString;
            FieldByName('H_DONATION').AsString := DM.ADOT_default_d_imp.FieldByName('Spende').AsString;
            FieldByName('H_G_SPEAKER').AsString := DM.ADOT_default_d_imp.FieldByName('Gideon_Sprecher').AsString;
            FieldByName('H_C_PERSON').AsString := DM.ADOT_default_d_imp.FieldByName('kontakt_herg_durch').AsString;
            FieldByName('H_NOTE').AsString     := DM.ADOT_default_d_imp.FieldByName('Bemerkung').AsString;
            FieldByName('L_UPDATE').AsString   := DM.ADOT_default_d_imp.FieldByName('letzte_Aktualisierung').AsString;
            frm_main.log_window.Lines.Add(''+ FieldByName('H_DATE').AsString) ; // Logeintrag
            Post;
            DM.ADOT_Default_D_imp.Next;
          end;
        end;
      finally
    DM.pFIBTrans.Commit;
    end;
Shalom
Manfred

manfred_h 20. Nov 2006 15:01

Re: Import aus Access >> ThousandSeparator
 
Hallo nochmals

bin leider noch nicht weitergekommen
hier noch ein paar Info's:

In Access ist das feld als Text definiert.
In Firefox ist es als DECIMAL(18,2) definiert.

habe schon Stunden mit Google gesucht und unteranderem Diesen Code gefunden:

Delphi-Quellcode:
function TextToNumber(const Input: string): Extended;
{Remove all thousands separators from Input string and convert to a floating
point number}
var
  Num: string;
begin
  Result := 0;
  Num := Input;
  if Num = '' then Exit;
  while Pos(ThousandSeparator, Num) > 0 do
   Delete(Num, Pos(ThousandSeparator, Num), 1);
  try
   Result := StrToFloat(Num);
  except
   MessageDlg('Could not convert ' + Input + ' to a valid number.', mtError,
     [mbOK], 0);
  end;
end;
You can use it like this:
StrToFloat(TextToNumber('1,234.56'));

To format a floating point number to a string with thousands separators, use
FormatFloat or FloatToStrF. Example:
FormatFloat('#,##0.00', 1234.56);

aber irgendwie komme ich nicht weiter.
Kann mir jemand einen Ratschlag geben.

Shalom
Manfred

mkinzler 20. Nov 2006 15:04

Re: Import aus Access >> ThousandSeparator
 
Warum übergibst du die Werte als String?

manfred_h 20. Nov 2006 15:19

Re: Import aus Access >> ThousandSeparator
 
Zitat:

Zitat von mkinzler
Warum übergibst du die Werte als String?

Hallo mkinzler

das habe ich als erstes versucht. Da erhalte ich immer die Fehlermeldung:
Exception class EBcdException with message '7.111,15 is not a valid BCD value'

Manfred

mkinzler 20. Nov 2006 15:27

Re: Import aus Access >> ThousandSeparator
 
Wenn du ihn als Float (.AsFloat) übergibst dürfte der Fehler nicht auftreten.

manfred_h 20. Nov 2006 15:44

Re: Import aus Access >> ThousandSeparator
 
Zitat:

Zitat von mkinzler
Wenn du ihn als Float (.AsFloat) übergibst dürfte der Fehler nicht auftreten.

Jetzt erhalte ich die Meldung:

7.111,15 is not a valid floating point value

manfred_h 20. Nov 2006 17:38

Re: Import aus Access >> ThousandSeparator
 
Es läuft :lol:

wenn's interesiert:

Delphi-Quellcode:
function TextToNumber(const Input: string): Extended;
{Remove all thousands separators from Input string and convert to a floating
point number}
var
  Num: String;
begin
  Result := 0;
  Num := Input;
  if Num = '' then Exit;
  while Pos(ThousandSeparator, Num) > 0 do
   Delete(Num, Pos(ThousandSeparator, Num), 1);
  try
   Result := StrToFloat(Num);
  except

  end;
end;
Delphi-Quellcode:
    DM.DB_Gideons.Connected := True;
    DM.Default_D.Open;

            DecimalSeparator := ',';
            ThousandSeparator := '.';

    frm_main.log_window.Lines.Add('==================history=================');
    if not DM.Camps.Active then DM.Camps.Open;
      try
        DM.ADOT_Default_d_imp.Open;
        DM.ADOT_Default_d_imp.First;
        for i := 0 to DM.ADOT_Default_d_imp.RecordCount -1 do begin
          with DM.Default_D do
          begin
            Insert;
            FieldByName('ID').AsString         := DM.ADOT_default_d_imp.FieldByName('ID').AsString;
            FieldByName('C_NR').AsString       := DM.Camps.FieldByName('C_NR').AsString;
            FieldByName('U_NR').AsString       := DM.Camps.FieldByName('U_NR').AsString;
            FieldByName('ID_AREA').AsString    := DM.ADOT_default_d_imp.FieldByName('id_sparte').AsString;
            FieldByName('H_DATE').AsString     := DM.ADOT_default_d_imp.FieldByName('datum').AsString;
            FieldByName('H_KIND_SERVICE').AsString := DM.ADOT_default_d_imp.FieldByName('Art_Dienst').AsString;
            //
            H_DONATION := DM.ADOT_default_d_imp.FieldByName('Spende').AsVariant;
            Result := TextToNumber(H_DONATION);
            FieldByName('H_DONATION').AsVariant := Result;
            //
            FieldByName('H_G_SPEAKER').AsString := DM.ADOT_default_d_imp.FieldByName('Gideon_Sprecher').AsString;
            FieldByName('H_C_PERSON').AsString := DM.ADOT_default_d_imp.FieldByName('kontakt_herg_durch').AsString;
            FieldByName('H_NOTE').AsString     := DM.ADOT_default_d_imp.FieldByName('Bemerkung').AsString;
            FieldByName('L_UPDATE').AsString   := DM.ADOT_default_d_imp.FieldByName('letzte_Aktualisierung').AsString;
            frm_main.log_window.Lines.Add(''+ FieldByName('H_DATE').AsString) ; // Logeintrag
            Post;
            DM.ADOT_Default_D_imp.Next;
          end;
        end;
      finally
    DM.pFIBTrans.Commit;
    end;
Besten Dank mkinzler für deine Hilfe. :cheers:

Shalom
Manfred


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 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