Autor |
Beitrag |
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Do 14.09.06 15:35
Hallo,
ich habe hier ein DBGrid an einer Firebird Tabelle, welche wiederrum an einer Firebird Tabelle hängt (wober das Phänomen auch bei einer MemoryTabe auftrat). Unter anderen wird auch ein Fließkommerwert ausgegeben, welcher in der Anzeige auf zwei nachkommastellen begrenzt ist.
Nun fällt auf, dass die Werte in diesem Feld nicht korreckt gerundet werden.
Am Beispiel:
Quelltext 1: 2:
| 1,225 => 1,22 1,226 => 1,23 |
Da die Edetiermöglichkeit erhalten bleiben muss kann ich kein AutoCalcField verwenden in dem ich das runden selber übernehme.
Kenn jemand eine möglichkeit wie ich es hinbekomme, das der angezeigte Werd "korreckt" Kaufmännisch gerundet wird und ich die volle Editierfähigkeit behalte?
Danke im vooraus
Klabautermann
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 14.09.06 15:50
Wie begrenzt du denn auf zwei Stellen?
Hast du schonmal versucht, das mit einem TEdit oder TDBEdit zu machen und die Formatierung per Hand durchzuführen? Erstmal nur, um zu sehen, wo die Ursache steckt. Es könnte ja auch das DBGrid sein, bzw. der Einsatz persistenter Felder. Ich vermute, dass du darüber die Formatierung gemacht hast.
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Do 14.09.06 15:54
Wie rundest du?
_________________ Markus Kinzler.
|
|
Klabautermann 
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Do 14.09.06 16:36
Hallo,
sorry war gerade am Rotieren, deshalbt die "schnelle" und dammit unvollständige Frage.
Also es wird lediglich per tField.DisplayFormat := '#.##' die anzeige auf 2 Nachkommastellen beschnitten.
Ich hbae das eben mit einer TJvMemoryData rekonstruieren können da es eigendlich das Projekt eines Kollegen ist und ich keinen zugriff auf die Originalen Quelltexte habe.
Nach diesem Experriment ist aber ziemlich eindeutig dass es am Bankes Round zu liegen scheind. Ich habe mal das kleine Testprogramm angehängt, für Leute bei denen die Jedi-VCL nicht installiert ist liegt es auch als EXE bei.
Wenn man hier unter Betrag einmal den Wert 1024,225 eingibt, so wird dieser zu 1024,22 gemacht, gibt man hingegen 1023,225 ein so wird ein 1023,23 dabei herraus. Es verhält sich also so, wie es wahrscheinlich in den USA erwünscht ist, hier benötigen wir abder das gute alte Kaufmännische runden, also ab ,5 soll aufgerundet werden.
Kann ich dem tField irgendwie beibringen, dass es nach "lokalen Standards" runden soll?
Gruß
Klabautermann
Einloggen, um Attachments anzusehen!
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Do 14.09.06 16:41
Runde es doch manuell mit Trunc( wert*100+.5)/100;
_________________ Markus Kinzler.
|
|
Klabautermann 
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Do 14.09.06 16:54
Hallo,
mkinzler hat folgendes geschrieben: | Runde es doch manuell mit Trunc( wert*100+.5)/100; |
das Problem ist, das der ungerundete Wert in derDatanbank gespeichert werden muss, der Gerundete aber angezeigt werden soll und ähnlich wie im Beispielprogramm ist auch in der richtigen Anwendung möglich den Wert wieder zu editieren daher kann ich auch keine ausgabe per AutoCalc-Field machen, denn dieses währe ja readonly  .
Gruß
Klabautermann
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Sa 16.09.06 11:26
Ich gehe von der zugrundeliegende Datenmenge aus und will einen Wert mit 4 Nachkommastellen sehen :
SQL-Anweisung 1:
| select r, CAST (r as DECIMAL (15,2)) r2 FROM Bla |
Das r würde den Wert so anzeigen, wie in der DB definiert und das zweite (r2) einen Wert, der auf 2 Nachkommastellen gerundet ist. Wird da jetzt nicht kaufmännisch gerundet, dann steht es Dir auch frei das mit trunc etc. richtig einzubauen.
_________________ Gruß
Hansa
|
|
jo-freaky
      
Beiträge: 24
|
Verfasst: Mi 21.02.07 21:41
Titel: Select Cast Befehl
Hi,
ich habe in diesem PDF-File www.firebirdsql.org/...s.152_09_deutsch.pdf
etwas dazu gefunden.(Seite 9 + 10)
Wenn ich mit IBExpert versuche zu casten, dann dachte ich mir das in etwa so:
Quelltext 1:
| select resumme, CAST (RESUMME as DECIMAL (15,2)) FROM RECHNUNGEN WHERE RENR = '22' |
Bei diesem Cast schneidet er einfach die letzte Stelle ab.
Schreibe ich die zu rundende Zahl gefolgt von einem E0 direkt in die Cast-Anweisung, dann wird richtig gerundet und nich nur abgeschnitten.
Quelltext 1:
| select resumme, CAST (953.756E0 as DECIMAL (15,2)) FROM RECHNUNGEN WHERE RENR = '22' |
ergibt: 953.76
Wie bekommen ich es also hin, an den Wert von RESUMME noch das E0 anzuhängen??
Danke im Vorraus!!!
Grüße
jo-freaky
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mi 21.02.07 22:02
_________________ Gruß
Hansa
|
|
jo-freaky
      
Beiträge: 24
|
Verfasst: Mi 21.02.07 22:22
Ok - war blöd!!
Da in IBExpert gerundet angezeigt wird, habe ich meinen Denkfehler erst jetzt bemerkt - sorry!
Bsp:
5986,57468359375 --> 5986,575 --> Das Wollte ich noch casten, logischerweise kommt dann nicht 5986,58 sondern 5986,57 raus, weil er mit dem genauen Wert und nicht dem gerundet angezeigten Wert rechnet.
Hab leider noch eine Frage: Habe ich eine Möglichkeit die Genauigkeit des Float Datenfeldes einzuschränken?
Thx!
Grüße
jo-freaky
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mi 21.02.07 22:33
Überlege mal was hier wohl rauskommt :
SQL-Anweisung 1:
| select ID, CAST (953.45626 as DECIMAL (15,4)) r2 FROM ADRESSEN WHERE ID = 4 |
Ich sags Dir : die letzte Zahl ist eine 3. Warum wohl ? 
_________________ Gruß
Hansa
|
|
jo-freaky
      
Beiträge: 24
|
Verfasst: Mi 21.02.07 22:49
 - weil du auf 4 Stellen rundest und die fünfte eine 6 ist.
Ich meinte aber nicht das casten.
Ich meinte ob beim definieren des Datentyps FLOAT eines Datenfeldes in FB eingeschränkt werden kann, mit wie viel Stellen Genauigkeit gerechnet werden soll.
So wird ja der gesamte Datenbereich (glaube 11 Nachkommastellen) zur Berechnung genutzt.
Was ist, wenn ich gar nicht so genau rechnen möchte? (Grund außen vor gelassen)
(ist aber nicht so wichtig - mich würde nur interessieren ob das möglich ist)
Thx 4 Help @hansa
Grüße
jo-freaky
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Do 22.02.07 02:17
jo-freaky hat folgendes geschrieben: | Ich meinte aber nicht das casten.
Ich meinte ob beim definieren des Datentyps FLOAT eines Datenfeldes in FB eingeschränkt werden kann, mit wie viel Stellen Genauigkeit gerechnet werden soll.
... |
Es ging hier aber ums Casten.
Wegen anscheinend mangelnder Eigeninitiative, Umformulierung der Frage usw. nur noch das ohne Kommentar :
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.Button1Click(Sender: TObject); begin DS.Close; DS.SelectSQL.Clear; DS.SelectSQL.Add ('SELECT * FROM TableX WHERE ID = 4'); DS.Open; DS.Edit; DS.FieldByName('REALFELD').AsFloat := 123.456; DS.Post; Transaction.Commit; end; |
In der DB ist das so definiert :
SQL-Anweisung 1:
| REALFELD DECIMAL(10,2) |
Versuche so was hinzukriegen und guck in IBExpert, was dabei rauskommt. Weiter oben steht alles, was man wissen muss.
_________________ Gruß
Hansa
|
|