[gelöst]Seltsames Problem mit QtSql und Firebird

Alles rund um die Programmierung mit Qt
Antworten
vileda
Beiträge: 7
Registriert: 12. November 2007 21:47

[gelöst]Seltsames Problem mit QtSql und Firebird

Beitrag 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....
Zuletzt geändert von vileda am 23. November 2007 17:48, insgesamt 1-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Wie es scheint, verwendest du double/float in deiner Anwendung, ist das überhaupt der richtige Datentyp für ein Kassenbuch?
vileda
Beiträge: 7
Registriert: 12. November 2007 21:47

Beitrag 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?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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...
vileda
Beiträge: 7
Registriert: 12. November 2007 21:47

Beitrag von vileda »

einen int für dezimale zahlen? bitte was?
dhcase
Beiträge: 132
Registriert: 10. Juni 2006 20:38

Beitrag 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:
vileda
Beiträge: 7
Registriert: 12. November 2007 21:47

Beitrag 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.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Geld rechnet man immer mit Ganzzahlen weil Fliesskommzahlen, wie Du schon gemerkt hast, Rundungsfehler aufweisen können.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
vileda
Beiträge: 7
Registriert: 12. November 2007 21:47

Beitrag von vileda »

Vielen Dank für die reichlichen Erklärungen, ihr habt mich überzeugt ;)
Ich werde das dann so umsetzen.
Antworten