Seite 1 von 1

[gelöst]Seltsames Problem mit QtSql und Firebird

Verfasst: 21. November 2007 22:51
von vileda
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....

Verfasst: 22. November 2007 09:06
von upsala
Wie es scheint, verwendest du double/float in deiner Anwendung, ist das überhaupt der richtige Datentyp für ein Kassenbuch?

Verfasst: 22. November 2007 19:47
von vileda
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?

Verfasst: 22. November 2007 21:54
von upsala
Welchen Datentyp Qt verwendet, weis dein QVariant. Frag ihn einfach mal...

Einen double/float würde ich trotzdem nicht bei einem Kassenbuch verwenden sondern einen int...

Verfasst: 22. November 2007 22:30
von vileda
einen int für dezimale zahlen? bitte was?

Verfasst: 23. November 2007 01:24
von dhcase
Ja, int als Typ für dezimale Zahlen würde ich bei Geldwerten auch nehmen... 110 Cent sind doch 1,10 Euro :wink:

Verfasst: 23. November 2007 02:22
von vileda
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.

Verfasst: 23. November 2007 09:08
von upsala
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.

Verfasst: 23. November 2007 09:36
von Christian81
Geld rechnet man immer mit Ganzzahlen weil Fliesskommzahlen, wie Du schon gemerkt hast, Rundungsfehler aufweisen können.

Verfasst: 23. November 2007 17:48
von vileda
Vielen Dank für die reichlichen Erklärungen, ihr habt mich überzeugt ;)
Ich werde das dann so umsetzen.