Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Rundungsproblem (https://www.delphipraxis.net/138505-rundungsproblem.html)

khh 11. Aug 2009 15:44

Datenbank: firebird • Version: 2.1 • Zugriff über: Zeos

Rundungsproblem
 
hallo zusammen,
ich habe ein Variable "Bruttopreis" die aus nettopreis + mwst besteht( nettopreis und mwstsatz wird aus der db gefüllt. mwst mit dem mwstsatz berechnet).
In der Variable Bruttopreis von typ currency habe so ich z.B 8496 stehen
mit roundcurrency wird der Wert kaufmännisch richtig auf 8500 gerundet (als 0,85 € )

nun möchte ich diesen berechneten Wert auch in einem db grid anzeigen.
da hier nur der mwstsatz und nicht die mwst als Wert vorhanden ist habe ich dazu die Query folgendermassen ergänzt:
SQL-Code:
round(nettopreis + (nettopreis/100 * CAST(:mwstsatz AS NUMERIC(15,2))),2) as bruttopreis
wobei der mwstsatz aus einer anderen tabelle gelesen und als ParamByName('mwstsatz').Ascurrency übergeben wird.
Leider wird so nicht richtig gerundet und ich erhalte als Ergebnis 84 anstatt 85

Wie kann ich in der query richtig runden?

danke euch

gruss KH

mkinzler 11. Aug 2009 15:54

Re: Rundungsproblem
 
SQL-Code:
TRUNC(nettopreis + (nettopreis/100 * CAST(:mwstsatz AS NUMERIC(15,2))) +0.5) as bruttopreis

khh 11. Aug 2009 15:56

Re: Rundungsproblem
 
Zitat:

Zitat von mkinzler
SQL-Code:
TRUNC(nettopreis + (nettopreis/100 * CAST(:mwstsatz AS NUMERIC(15,2))) +0.5) as bruttopreis

danke dir für die schnelle antwort, werd ich morgen ausprobieren, muss jetzt leider weg.

Gruss KH

khh 12. Aug 2009 08:42

Re: Rundungsproblem
 
Zitat:

Zitat von khh
Zitat:

Zitat von mkinzler
SQL-Code:
TRUNC(nettopreis + (nettopreis/100 * CAST(:mwstsatz AS NUMERIC(15,2))) +0.5) as bruttopreis

danke dir für die schnelle antwort, werd ich morgen ausprobieren, muss jetzt leider weg.

Gruss KH

funktioniert so leider nicht da kommt 1 raus :-(

mkinzler 12. Aug 2009 08:48

Re: Rundungsproblem
 
Mein Code "rundet" auf ganze Stellen um entsprechende Nachkommastellen zu erhalen muss man entsprechend "Verschieben"
SQL-Code:
TRUNC((nettopreis + (nettopreis/100 * CAST(:mwstsatz AS NUMERIC(15,2))) +0.5) * 100) / 100 as bruttopreis

khh 12. Aug 2009 09:27

Re: Rundungsproblem
 
Zitat:

Zitat von mkinzler
Mein Code "rundet" auf ganze Stellen um entsprechende Nachkommastellen zu erhalen muss man entsprechend "Verschieben"
SQL-Code:
TRUNC((nettopreis + (nettopreis/100 * CAST(:mwstsatz AS NUMERIC(15,2))) +0.5) * 100) / 100 as bruttopreis

sorry ich steh heute aufm Schlauch, was meinst mit verschieben?
was macht das +0.5 ?

mkinzler 12. Aug 2009 09:34

Re: Rundungsproblem
 
- Trunc() schneidet alle Nachkommastellen ab
0,85 -> 0
- +0,5 bewirkt dass ab ,5 aufgerundet wird
0,4 + 0,5 -> 0,9 -> 0
0,5 + 0,5 -> 1 -> 1

khh 12. Aug 2009 09:47

Re: Rundungsproblem
 
Zitat:

Zitat von mkinzler
- Trunc() schneidet alle Nachkommastellen ab
0,85 -> 0
- +0,5 bewirkt dass ab ,5 aufgerundet wird
0,4 + 0,5 -> 0,9 -> 0
0,5 + 0,5 -> 1 -> 1

ok, soweit hab ich das jetzt kapiert,

ich brauche aber die funktion so, dass aus 0,849 auf 0,85 gerundet wird, und das klappt so leider nicht :-(
edit:
also ich muss z.B. auf netto 0,794 7% dazu rechnen, was 0,849 ergibt und dieses kaufmännisch runden

mkinzler 12. Aug 2009 09:51

Re: Rundungsproblem
 
Dann müsstest du das Komma temporär um 3 Stellen ( * 1000 / 1000) verschieben

p80286 12. Aug 2009 10:01

Re: Rundungsproblem
 
Hallo KH

dann addiere doch 0,005!

Allerdings hab ich ein leichtes Problem mit Deiner Vorgehensweise. Ich würde so viel wie möglich "in der DB" erledigen und dann den Rest mit Delphi, oder aber nur die Rohdaten aus der DB holen und dann in Delphi rechnen.
Deine Lösung mit der HinundherCasterei sehe ich mit leichtem Unbehagen, da ich mit den unterschiedlichen Typen (Oracle/Delphi) in einem ähnlichen Fall auf die Nase gefallen bin.

Gruß K-H

khh 12. Aug 2009 10:04

Re: Rundungsproblem
 
Zitat:

Zitat von mkinzler
Dann müsstest du das Komma temporär um 3 Stellen ( * 1000 / 1000) verschieben

ok so funktionierts
mit:
TRUNC(((nettopreis *1000) + (nettopreis* 1000/100 * CAST(:mwstsatz AS NUMERIC(15,2))) +0.5) ) as bruttopreis
habe ich richtig gerundet das 1000 fache.
bekomme ich das jetzt noch innerhalb des statements wieder durch 1000 geteilt in bruttopreis, oder geht das nicht ?

mkinzler 12. Aug 2009 10:09

Re: Rundungsproblem
 
Delphi-Quellcode:
<Ausdruck> := Trunc( <Ausdruck> * 10 ^<Stellen>) / 10 ^<Stellen>;

khh 12. Aug 2009 10:14

Re: Rundungsproblem
 
Zitat:

Zitat von mkinzler
Delphi-Quellcode:
<Ausdruck> := Trunc( <Ausdruck> * 10 ^<Stellen>) / 10 ^<Stellen>;

ich meinte innerhalb des sqlstatements.

'select artikel_id,artikelpreis_id, bezeichnung, gilt_abmenge, nettopreis, TRUNC(((nettopreis *1000) + (nettopreis* 1000/100 * CAST(:mwstsatz AS NUMERIC(15,2))) +0.5) ) as bruttopreis from artikelpreise ............');
so hab ich jetzt in bruttopreis das richtig gerundete aber 1000 fache Eergebnis :-(

mkinzler 12. Aug 2009 10:28

Re: Rundungsproblem
 
Einfach nach dem Trunc durch 1000 teilen

khh 12. Aug 2009 10:59

Re: Rundungsproblem
 
Zitat:

Zitat von mkinzler
Einfach nach dem Trunc durch 1000 teilen

so hatte ich mir das auch gedacht,leider funktioniert das nicht, weiss der Teufel warum.
wenn ich _nicht_ teile steht im currency-feld 8500000, also das tausendfache was ich brauche
teile ich durch 10 steht im currency-feld 850000
teile ich durch 100 steht im currency-feld 80000
teile ich durch 1000 steht im currency-feld 0


was läuft da schief?

:-(
EDIT: sieht für mich so aus als würde das TRUNC erst nach den Rechenoperationen ausgeführt, oder?

mkinzler 12. Aug 2009 11:47

Re: Rundungsproblem
 
Zitat:

EDIT: sieht für mich so aus als würde das TRUNC erst nach den Rechenoperationen ausgeführt, oder?
Ja natürlich, ist ja eine Funktion

khh 12. Aug 2009 12:12

Re: Rundungsproblem
 
Zitat:

Zitat von mkinzler
Zitat:

EDIT: sieht für mich so aus als würde das TRUNC erst nach den Rechenoperationen ausgeführt, oder?
Ja natürlich, ist ja eine Funktion

tja und was mach ich dann, damit ich das Funktionsergebnis teilen kann?
so:
(TRUNC(((nettopreis *1000) + (nettopreis* 1000/100 * CAST(:mwstsatz AS NUMERIC(15,2))) +0.5) ))/1000 as bruttopreis

funktionierts ja nicht :-(

mkinzler 12. Aug 2009 12:15

Re: Rundungsproblem
 
Und warum nicht?

khh 12. Aug 2009 13:15

Re: Rundungsproblem
 
Zitat:

Zitat von mkinzler
Und warum nicht?

weil so das rauskommst was ich in #15 beschrieben habe.

khh 12. Aug 2009 13:19

Re: Rundungsproblem
 
Zitat:

Zitat von p80286
Hallo KH

dann addiere doch 0,005!

Allerdings hab ich ein leichtes Problem mit Deiner Vorgehensweise. Ich würde so viel wie möglich "in der DB" erledigen und dann den Rest mit Delphi, oder aber nur die Rohdaten aus der DB holen und dann in Delphi rechnen.
Deine Lösung mit der HinundherCasterei sehe ich mit leichtem Unbehagen, da ich mit den unterschiedlichen Typen (Oracle/Delphi) in einem ähnlichen Fall auf die Nase gefallen bin.

Gruß K-H

im Programm zu rechnen htte ich ja erst auch gedacht, aber wie krieg ich die Werte dann ins Datengrid?
im Moment mach ich das ja so:
TColumn(self.Columns[3]).Field:= FpreiseQuery.FieldByName('bruttopreis');

Olli73 14. Aug 2009 14:58

Re: Rundungsproblem
 
Zitat:

Zitat von khh
Zitat:

Zitat von mkinzler
Einfach nach dem Trunc durch 1000 teilen

so hatte ich mir das auch gedacht,leider funktioniert das nicht, weiss der Teufel warum.
wenn ich _nicht_ teile steht im currency-feld 8500000, also das tausendfache was ich brauche
teile ich durch 10 steht im currency-feld 850000
teile ich durch 100 steht im currency-feld 80000
teile ich durch 1000 steht im currency-feld 0

was läuft da schief?

Teile mal durch 1000.00
Bei Integer/Integer kommt in Firebird Integer raus (Nachkommastellen abgeschnitten).
Zur Veranschaulichung teste mal:
SQL-Code:
select 1, 3/4 from rdb$database
union all
select 2, 3/4.0 from rdb$database
union all
select 3, 3/4.00 from rdb$database
union all
select 4, 3.0/4 from rdb$database
union all
select 5, 3.00/4 from rdb$database
union all
select 6, 3.0/4.0 from rdb$database


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz