ZEOS entfernt den Dezimaltrenner

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
no1likeyou
Beiträge: 13
Registriert: Mi 9. Mär 2011, 12:28
OS, Lazarus, FPC: Winux (L 1.0.12 FPC 2.6.2)
CPU-Target: 64Bit

ZEOS entfernt den Dezimaltrenner

Beitrag von no1likeyou »

Tach zusammen,

ich habe ein seltsames Phänomen:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender : TObject);
var
  tmpfloat: double;
begin
  ZConnection1.Connected := true;
  ZQuery1.SQL.Add('INSERT INTO db.tabelle (d) values (1.234)');
  ZQuery1.ExecSQL;
  ZQuery1.SQL.Clear;
  ZQuery1.sql.Add('select * from db.tabelle');
  ZQuery1.Open;
  tmpfloat := ZQuery1.FieldByName('d').AsFloat;
  ShowMessage(FloatToStr(tmpfloat));
end;
Der Wert 1.234 wird sauber in die Datenbank geschrieben, wenn ich ihn wieder auslese erhalte ich 1234 ohne Trennzeichen!

Ich verwnde Lazarus 0.9.28.2 mit FPC 2.2.4 unter Windows Vista mit Zeos 6.6.6
Wenn ich mir die Tabelle mit HeidiSql anschaue bekomme ich den korrekten Wert angezeigt.
Auf einem anderen Rechner mit Delphi und Zeos 6.6.5 funktioniert es.

Hat jemand einen Rat an welcher Stelle ich da suchen muss?


Gruß no1
Zuletzt geändert von Lori am Mo 26. Mär 2012, 18:01, insgesamt 1-mal geändert.
Grund: Highlighter

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: ZEOS entfernt den Dezimaltrenner

Beitrag von DiBo33 »

IMHO liegt das am Dezimaltrenner des Systems
http://www.lazarusforum.de/viewtopic.php?f=10&t=2304" onclick="window.open(this.href);return false;

no1likeyou
Beiträge: 13
Registriert: Mi 9. Mär 2011, 12:28
OS, Lazarus, FPC: Winux (L 1.0.12 FPC 2.6.2)
CPU-Target: 64Bit

Re: ZEOS entfernt den Dezimaltrenner

Beitrag von no1likeyou »

Tach DiBo,

ja das war zuerst auch meine Vermutung ... den Dezimaltrenner und das Tausender-Trennzeichen hatte ich schon mal
umgestellt. Brachte nur keinen Erfolg.

Gruß no1

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: ZEOS entfernt den Dezimaltrenner

Beitrag von DiBo33 »

Was anderes fällt mir auch nicht ein, zumal ich auch weder mit Windows noch mit Zeos arbeite.

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: ZEOS entfernt den Dezimaltrenner

Beitrag von Antrepolit »

Nicht den Dezimalseparator des Systems umstellen, sondern den derzeitigen in Lazarus festlegen.

Einfach

Code: Alles auswählen

System.Decimalseparator = '.';
sollte genügen.
Nach dem Auslesen aber wieder auf den alten Wert zurückstellen. ;-)
Grüße, Antrepolit

care only if your os is really burning

no1likeyou
Beiträge: 13
Registriert: Mi 9. Mär 2011, 12:28
OS, Lazarus, FPC: Winux (L 1.0.12 FPC 2.6.2)
CPU-Target: 64Bit

Re: ZEOS entfernt den Dezimaltrenner

Beitrag von no1likeyou »

Sorry ... war Unterwegs,

Code: Alles auswählen

System.Decimalseparator = '.';
funktioniert leider nicht, unter System kennt er die Eigenschaft >> Decimalseparator << gar nicht.

unit1.pas(44,27) Error: Identifier not found "Decimalseparator"

hier mal das vollständige Beispielprogramm:

Code: Alles auswählen

unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, ZConnection, ZDataset;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1 : TButton;
    ZConnection1 : TZConnection;
    ZQuery1 : TZQuery;
    procedure Button1Click(Sender : TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
var
  Form1 : TForm1; 
 
implementation
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender : TObject);
var
  tmpfloat        : double;
  // NewFormat       : TFormatSettings;
 
begin
  // NewFormat := DefaultFormatSettings;
  // NewFormat.DecimalSeparator := '.';
  // NewFormat.ThousandSeparator := '#';
 
  System.Decimalseparator = '.';
 
  ZConnection1.Connected := true;
 
  ZQuery1.SQL.Add('INSERT INTO vogl.tabelle (d) values (1.234)');
 
  ZQuery1.ExecSQL;
 
  ZQuery1.SQL.Clear;
  ZQuery1.sql.Add('select * from vogl.tabelle');
  ZQuery1.Open;
  tmpfloat := ZQuery1.FieldByName('d').AsFloat;
 
  ShowMessage(FloatToStr(tmpfloat));
 
  // NewFormat.ThousandSeparator := '.';
  // NewFormat.DecimalSeparator := ',';
end;
 
initialization
  {$I unit1.lrs}
end.


fehlt mir vielleicht eine Unit, die ich noch einbinden muss?


Gruß no1

no1likeyou
Beiträge: 13
Registriert: Mi 9. Mär 2011, 12:28
OS, Lazarus, FPC: Winux (L 1.0.12 FPC 2.6.2)
CPU-Target: 64Bit

Re: ZEOS entfernt den Dezimaltrenner

Beitrag von no1likeyou »

Tach zusammen,

Lösung gefunden:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender : TObject);
var
  tmpfloat        : double;
 
begin
 
  if (SysUtils.DecimalSeparator = ',') then begin
    SysUtils.DecimalSeparator := '.';
    SysUtils.ThousandSeparator := ',';
  end;
 
  ZConnection1.Connected := true;
 
  ZQuery1.SQL.Add('INSERT INTO vogl.tabelle (d) values (1.234)');
 
  ZQuery1.ExecSQL;
 
  ZQuery1.SQL.Clear;
  ZQuery1.sql.Add('select * from vogl.tabelle');
  ZQuery1.Open;
  tmpfloat := ZQuery1.FieldByName('d').AsFloat;
 
  SysUtils.DecimalSeparator := ',';
  SysUtils.ThousandSeparator := '.';
 
  ShowMessage(FloatToStr(tmpfloat));
 
end;
So functioniert es, das ganze muss dann noch in einen try except oder finaly Block damit die Trennzeichen
wieder sauber auf den Ursprungswert gestellt werden.

Gruß no1

Antworten