[gelöst]Seltsames Problem mit QtSql und Firebird
[gelöst]Seltsames Problem mit QtSql und Firebird
Ich habe eine kleine Kassenbuch Anwendung geschrieben, nichts besonderes, ein TableView und ein paar mapped LineEdits.
Ich entwickle unter Linux, aber die Zielplattform ist WinXP, soweit alles auch kein Problem.
Für Win kompiliere ich unter Linux mit MinGw.
Die Anwendung läuft auf beiden Plattformen wunderbar, wäre da nicht ein ganz gemeines Problem unter Win.
Und zwar, wenn ich einen Ganzzahligen Wert in das Einnnahme oder
Ausgabe Feld schreibe wird auf die nächst kleinere Dezimalzahl abgerundet, also bei 18 kommt z.B. 17.9999 raus, auch wenn man 18.00 eingibt.
Das Feld in der Datenbank hat den Typ DECIMAL(18,4).
Unter Linux mit der selben Datenbank Datei tritt dieser Fehler nicht auf.
Sehr kurios das ganze.
Ich habe auch geschaut was passiert wenn ich mit IBExpert unter Windows einen Wert eintrage, da tritt der Fehler auch nicht auf,
er tritt also nur unter Windows auf wenn ich ihn über den TableView oder das gemappte LineEdit eintrage.
Wenn man einen "richtigen" dezimalen Wert einträgt kommt der Fehler nicht zum vorschein.
Hat vielleicht jemand eine Ahnung woran das liegen könnte, oder ist vielleicht sogar ein Bugreport an Trolltech notwendig?
An Firebird selber kann es eigentlich nicht liegen da ich mit IBExpert über die selbe Client dll auf die DB zugreife, wo der Fehler ja nicht auftritt.
Gruß,
vileda
EDIT:
*schäm* Ich hätte besser mal vorher im Tracker bei Trolltech gucken sollen: http://trolltech.com/developer/task-tra ... &id=185482
Dann muss ich wohl auf 4.4 warten....
Ich entwickle unter Linux, aber die Zielplattform ist WinXP, soweit alles auch kein Problem.
Für Win kompiliere ich unter Linux mit MinGw.
Die Anwendung läuft auf beiden Plattformen wunderbar, wäre da nicht ein ganz gemeines Problem unter Win.
Und zwar, wenn ich einen Ganzzahligen Wert in das Einnnahme oder
Ausgabe Feld schreibe wird auf die nächst kleinere Dezimalzahl abgerundet, also bei 18 kommt z.B. 17.9999 raus, auch wenn man 18.00 eingibt.
Das Feld in der Datenbank hat den Typ DECIMAL(18,4).
Unter Linux mit der selben Datenbank Datei tritt dieser Fehler nicht auf.
Sehr kurios das ganze.
Ich habe auch geschaut was passiert wenn ich mit IBExpert unter Windows einen Wert eintrage, da tritt der Fehler auch nicht auf,
er tritt also nur unter Windows auf wenn ich ihn über den TableView oder das gemappte LineEdit eintrage.
Wenn man einen "richtigen" dezimalen Wert einträgt kommt der Fehler nicht zum vorschein.
Hat vielleicht jemand eine Ahnung woran das liegen könnte, oder ist vielleicht sogar ein Bugreport an Trolltech notwendig?
An Firebird selber kann es eigentlich nicht liegen da ich mit IBExpert über die selbe Client dll auf die DB zugreife, wo der Fehler ja nicht auftritt.
Gruß,
vileda
EDIT:
*schäm* Ich hätte besser mal vorher im Tracker bei Trolltech gucken sollen: http://trolltech.com/developer/task-tra ... &id=185482
Dann muss ich wohl auf 4.4 warten....
Zuletzt geändert von vileda am 23. November 2007 17:48, insgesamt 1-mal geändert.
Also den Datentyp den Firebird verwendet sollte O.k sein, habe aus den aus der Dokumenation übernommen, DECIMAL(18,4) für Geld Werte.
Welchen Typ Qt dann genau dafür benutzt weiss ich garnicht, wenn ich ein Feld aus dem Model auslese bekomm ich ja ein QVariant, aber Qt erkennt den DB Typ anscheinend, mehr als 4 Nachkomma Stellen kann ich nämlich nicht angeben, brauche ja eh nur 2.
Ein Rundungs Fehler dürfte da ja dann nicht auftreten.
Weiss einer mehr dazu welchen Typ Qt dann dafür einsetzt?
Und welcher Typ wären denn der passende um einen Geld Wert zu speichern?
Welchen Typ Qt dann genau dafür benutzt weiss ich garnicht, wenn ich ein Feld aus dem Model auslese bekomm ich ja ein QVariant, aber Qt erkennt den DB Typ anscheinend, mehr als 4 Nachkomma Stellen kann ich nämlich nicht angeben, brauche ja eh nur 2.
Ein Rundungs Fehler dürfte da ja dann nicht auftreten.
Weiss einer mehr dazu welchen Typ Qt dann dafür einsetzt?
Und welcher Typ wären denn der passende um einen Geld Wert zu speichern?
Ja ok, das stimmt wohl, aber dann muss ich bei der Anzeige trozdem immer wieder umrechnen. Ich will ja z.B. nicht 12453 cent anzeigen sondern 124,53 ¤.
Fände diese Lösung sehr komisch.
Ich speichere die Werte in der DB ja schon als Dezimalzahl, das ist ja auch ok denke ich da die Dokumentation das so empfiehlt. Warum dann umrechnen wenn das Framework einen Fehler hat. Wäre eher ein workaround, aber der wäre schon recht aufwendig zu implementieren denke ich. An den Daten die ich im TableView habe mache ich ja nix, die kommen aus meinem Model das direkt an der Datenbank Tabelle hängt.
Fände diese Lösung sehr komisch.
Ich speichere die Werte in der DB ja schon als Dezimalzahl, das ist ja auch ok denke ich da die Dokumentation das so empfiehlt. Warum dann umrechnen wenn das Framework einen Fehler hat. Wäre eher ein workaround, aber der wäre schon recht aufwendig zu implementieren denke ich. An den Daten die ich im TableView habe mache ich ja nix, die kommen aus meinem Model das direkt an der Datenbank Tabelle hängt.
Warum denkst du eigentlich, daß die Datenbankhersteller einen speziellen Datentyp für Währungen anbieten? Und wenn C++ keinen direkten Ersatz dafür hat, dann muß man halt einen verwenden, der diesem sehr nahe kommt und daß ist halt je nach Zahlenbereich ein (long/big/long long/...)int.
Und für die Anzeige wird nicht umgerechnet, sondern richtig formatiert.
Und für die Anzeige wird nicht umgerechnet, sondern richtig formatiert.
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten: