[NEWSboard IBMi Forum]
Seite 2 von 2 Erste 1 2
  1. #13
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    SQL kennt natürlich auch noch den Typ Decimal für die Arithmetik, da Float ja Fließkomma ist.
    SQL versucht halt, bei Zwischenergebnissen so viele Nachkommastellen wie möglich zu verwenden, was bei Divisionen schon mal knapp werden kann. Das führt auch schon mal dazu, dass mit decimal(31, 29) gerechnet wird und in der Folge sogar zu Dezimalfeldüberlauf.
    Wenn dann auch noch aggregiert wird, muss u.U. das maximum herausgeholt werden.
    Aus sum(dec(11,2)) wird dann auch schon mal ein dec(31, 18).
    Eine tatsächliche Regel daraus abzuleiten habe ich mir abgewöhnt und rechne nun z.T. mit Zwischenergebnissen, gerade um Integerarithmetik zu vermeiden.

    select sum(1,25), dec( sum(1,25 / 100,00 ), 15, 4) * 19,00 from datei where uniquekey in(1, 2)

    Wobei der Zwangscast ab und an auch leider ignoriert wird.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  2. #14
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Warum verweigerst du dich der Angabe von Nachkommata bei 100 und 19?
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #15
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    Zitat Zitat von ILEMax Beitrag anzeigen
    so nochwas versucht

    select 2,5/100*19 from Datei --> 0,47500000
    select sum(1,25)/100*19 from uniqueDatei where uniqueKey in(1, 2) --> 2 Sätze --> 0,38

    Was habt ihr probiert?
    die erste oder die 2. version?
    ... beide, wobei bei der sum Variante, die Anzahl der erwarteten Sätze in die Berechnung eingeht. Erwartet die Query engine sehr viele Sätze, könnte das Ergebnis sehr groß werden und es verzichtet eher auf Nachkommastellen - was hier eine Rolle spielen könnte (insofern bin ich nicht bei Baldur).
    Wenn es hier um kaufmännisches rechnen geht, ist der Ansatz eh verkehrt, da muss man Rundung erzwingen und sich um overflow/underflow kümmern.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  4. #16
    Registriert seit
    Sep 2005
    Beiträge
    425
    @Baldur
    ich verweigere mich nicht
    Die 19 hat (im Orginal) sowieso 2 NK Stellen

    Interaktiv im STRSQL bringt

    select sum(1,25)/100,00*19,00 from uniqueDatei where uniqueKey in(1, 2) --> 2 Sätze

    das Ergebnis 0,00! Was ich noch weniger verstehe

    Im RPG haben wir uns angewöhnt mit eval(RH) zu arbeiten.
    Das übersetzen wir mit: 'Bitte rechne richtig'
    (oder mit einer Funktion, die das Runden, den Überlauf und die Fehlermeldung händelt)

    Wenn SQL das bei Dieter und Birgitta richtig macht, fehlt uns irgend etwas, oder ist schlecht eingestellt.
    Das wüsste ich gerne!

  5. #17
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    Zitat Zitat von ILEMax Beitrag anzeigen
    @Baldur
    ich verweigere mich nicht
    Die 19 hat (im Orginal) sowieso 2 NK Stellen

    Interaktiv im STRSQL bringt

    select sum(1,25)/100,00*19,00 from uniqueDatei where uniqueKey in(1, 2) --> 2 Sätze

    das Ergebnis 0,00! Was ich noch weniger verstehe

    Im RPG haben wir uns angewöhnt mit eval(RH) zu arbeiten.
    Das übersetzen wir mit: 'Bitte rechne richtig'
    (oder mit einer Funktion, die das Runden, den Überlauf und die Fehlermeldung händelt)

    Wenn SQL das bei Dieter und Birgitta richtig macht, fehlt uns irgend etwas, oder ist schlecht eingestellt.
    Das wüsste ich gerne!
    ... Fehlermeldung => PTF
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  6. #18
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Es passiert folgendes, da nichts gecastet wird, wird das Ergebnis der Summe mit als Dec(31, 2) ausgegeben. Da durch ein Integerwert dividiert wird, der ja keine Dezimal-Positionen hat, wird das Ergebnis der Division ebenfalls mit Dec(31, 2) ausgegeben und dann weitergerechnet. Allerdings ist das Ergebnis 2,5/100 = 0,025. Die 5 wird abgeschnitten (also 0,02) und dann mit 19 multipliziert ergibt ,038.

    Das andere kann ich nicht erklären.
    Warum das so ist ... wie Dieter sagt, bei der IBM nachfragen.

    Aber nachwie vor ist die Regel: Zuerst multiplizeren und dann dividieren!!!
    ... und auch die komplette Berechnung in sum() integrieren.
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  7. #19
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    Zitat Zitat von ILEMax Beitrag anzeigen
    @Baldur
    ich verweigere mich nicht
    Die 19 hat (im Orginal) sowieso 2 NK Stellen

    Interaktiv im STRSQL bringt

    select sum(1,25)/100,00*19,00 from uniqueDatei where uniqueKey in(1, 2) --> 2 Sätze

    das Ergebnis 0,00! Was ich noch weniger verstehe

    Im RPG haben wir uns angewöhnt mit eval(RH) zu arbeiten.
    Das übersetzen wir mit: 'Bitte rechne richtig'
    (oder mit einer Funktion, die das Runden, den Überlauf und die Fehlermeldung händelt)

    Wenn SQL das bei Dieter und Birgitta richtig macht, fehlt uns irgend etwas, oder ist schlecht eingestellt.
    Das wüsste ich gerne!
    ...l welche Variante hast du denn nun?
    select sum(1,25)/100,00*19,00 from ...
    oder
    select sum(1,25/100)*19,00 ?
    bei der ersten kommt der sum als dec mit 2 nachkommastellen und die Division durch 100 lässt Stellen verschwinden.
    Kommt der Wert aus einer Datei, nimmt er die Nachkommas mit und macht das Feld vor dem Komma größer (wg. sum)

    Besser ist es ohnehin, die Division zu dem MwSt Satz zu nehmen:
    select sum(...) * MwSt / 100

    Macht man jetzt noch einen cast auf das erste Feld und gibt ihm 2 Nachkommas mehr und rundet auf 2 Nachkommastellen am Schluss, sollte das stabil sein!

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  8. #20
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Manchmal hilft auch ein * 0,01 statt ein / 100.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. Antworten: 0
    Letzter Beitrag: 09-02-10, 08:38
  2. Kleine Fesplatte mit grosse ersetzen
    By gugli in forum NEWSboard Server & Hardware Markt
    Antworten: 1
    Letzter Beitrag: 30-09-09, 20:30
  3. Antworten: 0
    Letzter Beitrag: 17-12-08, 08:56
  4. Löst die Spielkonsole die i5 ab???
    By Brownie in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 02-12-06, 09:02
  5. Zwei Felder zusammenfügen - Aber nur die Werte, nicht die Blanks
    By svente in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 30-03-06, 11:45

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •