Entwickler-Ecke

Datenbanken - Firebird Trigger


landwehr - Fr 14.01.11 13:00
Titel: Firebird Trigger
Hallo,

kann ich in einem Trigger roundto einsetzen.

Hier der Trigger.

SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
begin
    if (new.Typ <> 'D'then begin
       if ((new.FAKTOR is Nullor (new.FAKTOR = 0)) then
          new.FAKTOR = 1;
       if ((new.MENGE is Nullor (new.MENGE = 0)) then

          new.MENGE = 1;
       New.GESAMTBETRAG = New.MENGE * new.FAKTOR * New.EINZELPREIS;
       if (new.STEUERSATZ is not nullthen
          new.STEUERBETRAG = new.GESAMTBETRAG * new.STEUERSATZ / 100;
       if (new.Steuersatz is not NULLand (New.LKZ = 'CH'THEN
          new.STEUERBETRAG = roundto((new.GESAMTBETRAG * new.STEUERSATZ / 100)*2,-1)/2 ; <- Um diese Zeile handelt es sich
    end
end


Für eine schnelle Antwort vielen Dank

Moderiert von user profile iconMartok: SQL-Tag gesetzt


Nersgatt - Fr 14.01.11 13:10

Hilft das?:
http://www.firebirdsql.org/refdocs/langrefupd21-intfunc-round.html

Auch unten den roten Kasten lesen.


landwehr - Fr 14.01.11 13:53

Nein nicht so richtig. Ich muß die MwSt in der Schweiz berechnen. In Delphi geht das so.

roundto((strtofloat(EINGABE))*2,-1)/2;

Walter


Nersgatt - Fr 14.01.11 14:02

Das heißt, Du musst auf 5 Rappen genau runden, wenn ich mich richtig errinner?

Trick 17: 1. Verdoppeln 2. Runden 3. halbieren:

SQL-Anweisung
1:
select round((cast(:wert as numeric(15,2)) * 2), 1) / 2 from rdb$database                    

also prinzipiell das selbe, wie in Deinem Codeschnippsel


landwehr - Fr 14.01.11 19:37

OK

Werde ich am Wochenende mal testen.

Gebe Feedback wenn OK.

Zunächst schon mal Danke.

Gruß Walter


landwehr - Di 18.01.11 19:07

Hallo,

habe es hinbekommen,

SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
begin
    if (new.Typ <> 'D'then begin
       if ((new.FAKTOR is Nullor (new.FAKTOR = 0)) then
          new.FAKTOR = 1;
       if ((new.MENGE is Nullor (new.MENGE = 0)) then
          new.MENGE = 1;
       New.GESAMTBETRAG = New.MENGE * new.FAKTOR * New.EINZELPREIS;
       if (new.STEUERSATZ is not nullthen
          new.STEUERBETRAG = new.GESAMTBETRAG * new.STEUERSATZ / 100;
       if (new.Lkz = 'CH'then
        begin
         new.STEUERBETRAG = new.GESAMTBETRAG * new.STEUERSATZ / 100;
        new.STEUERBETRAG = round((cast(new.STEUERBETRAG as numeric(15,2)) * 2), 1) / 2;
       end   
    end
end;
Vielen Dank

mfg
Walter

Moderiert von user profile iconNarses: SQL-Tags hinzugefügt


Nersgatt - Di 18.01.11 19:38

Den (cast(new.STEUERBETRAG as numeric(15,2)) kannst Du Dir an der Stelle sparen. Der war nur meinem Beispiel drin, damit der Parameter als Numeric behandelt wird. Schreib einfach new.STEUERBETRAG


Josef-B - Di 25.01.11 15:43

Aber bei roundto gibts meines Wissens die Problematik, dass roundto nicht kaufmännisch rundet sondern amerikanisch.

Deshalb mach ich dass immer mit Wert = trunc(wert*100+.5)/100, bei negativen Werten -0.5

Sonst gibts bei der MWST-Berechnung öfter Differenzen von 0,01 Euro

Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.