Entwickler-Ecke

Datenbanken - Problem mit Dezimalfeldern vom Delphi nach Firebird


Anateus - Mo 27.09.10 11:58
Titel: Problem mit Dezimalfeldern vom Delphi nach Firebird
Hallo,
ich programmiere mit Delphi 7 und nutze dbExpress, um auf die Firebird 2.0 zuzugreifen. Ich habe folgende Tabelle definiert:

SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
CREATE TABLE WAEHRUNG
(
WANR CHAR(3NOT NULL,
WFAKTOR DECIMAL(12,7NOT NULL,
WABEZ VARCHAR(40),

PRIMARY KEY(WANR)
);


Ich erfasse jetzt in einem Delphi-Formular in einer TextBox den Wert "1,99583".
Gespeichert wird aber "199583".
Erst wenn ich in die TextBox den Wert "1.95583" eingebe, dann
wird auch der Wert "1,99583" in die Firebird-Datenbank geschrieben.
Wie kann ich also den SQLConnector so einstellen, dass er als Dezimal-Trenner das Komma und nicht den Punkt nimmt?
Gruß
Anateus

Moderiert von user profile iconMartok: SQL-Tags gesetzt


Nersgatt - Mo 27.09.10 12:02

Hallo und willkommen!

Zeig mal etwas Code, wie Du den Wert an die Datenbank übergibst.


Anateus - Mo 27.09.10 12:10

Hallo Jens,
hier die Einstellung vom SQLConnector:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
DriverName=Interbase
Database=d:\datenbanken\firebird\wws.fdb
RoleName=RoleName
User_Name=seg
Password=seg
ServerCharSet=
SQLDialect=3
ErrorResourceFile=
LocaleCode=0000
BlobSize=-1
CommitRetain=False
WaitOnLocks=True
Interbase TransIsolation=ReadCommited
Trim Char=False


hier etwas Source:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
procedure TWaehr.SpeichernClick(Sender: TObject);
var TD : TTransactionDesc;
begin
  // Währung speichern
  If Nummer.Text = '' then
  begin
    MessageDlg('Bitte eine Währung angeben! ',
               mtError, [mbOk], 0);
    exit;
  end;

  TD.TransactionID := getNextTransactionID;
  TD.IsolationLevel := xilREADCOMMITTED;
  DM4_SEG.SQLConnection1.StartTransaction(TD);
 try
  if WaehrungVorhanden then
  begin
     // updaten
     DB_Versorgen;
     DM4_SEG.UWaehrung.ExecSQL;
  end
  else
  begin
     // insert
     DB_Versorgen;
     DM4_SEG.IWaehrung.ExecSQL;
  end;
  // Durch die Commit-Steuerung werden die Änderungen in der DB resistend
  DM4_SEG.SQLConnection1.Commit(TD);

 except
  // Fehler aufgetreten - es erfolgen keine Änderungen in der DB
  DM4_SEG.SQLConnection1.Rollback(TD);
 end;

  Nummer.SetFocus;
  { Bildschirm löschen }
  Leeren;
end;

function TWaehr.DB_Versorgen : Boolean;
begin
   if WaehrungVorhanden then
   begin
      // Für Update
      with DM4_SEG.UWaehrung do
      begin
         Params[00].asString := DateToStr8(BDatum);
         Params[01].asString := Faktor.text;
         Params[02].asString := Bez.text;
         Params[03].asString := Nummer.Text;
      end;
   end
   else
   begin
      // Für Insert
      with DM4_SEG.IWaehrung do
      begin
         Params[00].asString := Nummer.Text;
         Params[01].asString := DateToStr8(BDatum);
         Params[02].asString := Faktor.text;
         Params[03].asString := Bez.text;
      end;
   end
end;


Gruß
Anateus

Moderiert von user profile iconMartok: Delphi-Tags gesetzt


Nersgatt - Mo 27.09.10 12:29

Du darfst die Parameter nicht als String übergeben (asString), weil dann die DB davon ausgeht, dass das amerikanische Format verwendet wird. Da ist das , das Tausendertrennzeichen und der . das Dezimaltrennzeichen.

Übergib die Werte als Float (asFloat) und mach die Umwandlung selbst:

Delphi-Quelltext
1:
Params[02].asFloat := StrToFloat(Faktor.text);                    


Anateus - Mo 27.09.10 13:03

Hallo Jens,
super, es hat funktioniert!
Ich bedanke mich für Deine Hilfe.
Gruß
Anateus