Autor Beitrag
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Do 14.09.06 15:54 
Wie rundest du?

_________________
Markus Kinzler.
Klabautermann Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Do 14.09.06 16:41 
Runde es doch manuell mit Trunc( wert*100+.5)/100;

_________________
Markus Kinzler.
Klabautermann Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 14.09.06 16:54 
Hallo,
user profile iconmkinzler 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Sa 16.09.06 11:26 
Ich gehe von der zugrundeliegende Datenmenge aus und will einen Wert mit 4 Nachkommastellen sehen :
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: 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:

ausblenden 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mi 21.02.07 22:02 
Du wirst doch jetzt nicht mit Gewalt versuchen, überall ein E0 dranzuhängen ? :shock: :roll:

ausblenden SQL-Anweisung
1:
select ID, CAST (953.756  as DECIMAL (15,2)) r2 FROM TableX WHERE ID = 4					


Das liefert die ID und die Zahl 953,76. Wie vorher schon gesagt. Ein E0 anzuhängen ? Es ist manchmal kaum zu fassen. :mrgreen:

_________________
Gruß
Hansa
jo-freaky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mi 21.02.07 22:33 
Überlege mal was hier wohl rauskommt :

ausblenden 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 ? :mrgreen:

_________________
Gruß
Hansa
jo-freaky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Mi 21.02.07 22:49 
:lol: - 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 8)

Grüße
jo-freaky
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Do 22.02.07 02:17 
user profile iconjo-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. 8)

Wegen anscheinend mangelnder Eigeninitiative, Umformulierung der Frage usw. nur noch das ohne Kommentar :

ausblenden 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 :

ausblenden 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