[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Feb 2001
    Beiträge
    20.748
    Du musst die Funktion um deine Summe packen:
    dec(sum(...), 15, 7)

    Beachte dabei, dass das Ergebnis abgeschnitten wird, ggf. mach noch einen Round im Dec:
    dec(round(sum(...), 7), 15, 7)

    Beachte auch, dass es zu einem SQL-Fehler kommt, wenn das Ergebnisi > 8 Stellen vor dem Komma 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. #2
    Registriert seit
    Dec 2009
    Beiträge
    314
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Du musst die Funktion um deine Summe packen:
    dec(sum(...), 15, 7)

    Beachte dabei, dass das Ergebnis abgeschnitten wird, ggf. mach noch einen Round im Dec:
    dec(round(sum(...), 7), 15, 7)

    Beachte auch, dass es zu einem SQL-Fehler kommt, wenn das Ergebnisi > 8 Stellen vor dem Komma wird.
    ich habe das DEC(....), 8, 7) eingebaut, was mir folgende Einzelergebnisse vereinfacht dargestellt liefert:
    1. Berchnung 2. Berechnung 3.Berechung
    5.000.000,00 + 0,80 / 15.000.000,00
    wobei 1. Berechnung und 2. Berechung zusammen und 3.Berechnung alleine max. 99.999.999,99 ergeben können und 1 + 2 / 3 maximal 1,0000000

    und bekomme jetzt folgenden Fehler


    Nachrichten-ID . . . . : SQL0406 Bewertung . . . . . . : 30
    Nachrichtenart . . . . : Diagnose
    Sendedatum . . . . . . : 16.02.09 Sendezeit . . . . . . : 09:49:01

    Nachricht . . . : Umsetzungsfehler bei der Zuordnung zu Spalte LGD_COV.
    Ursache . . . . : Bei dem Versuch, Spalte LGD_COV mit einer Anweisung
    INSERT, UPDATE, ALTER TABLE oder REFRESH TABLE einen Wert zuzuordnen, ist
    ein Umsetzungsfehler der Art 1 aufgetreten. Wurde eine Vorkompilierung
    durchgeführt, ist der Fehler aufgetreten, als eine numerische Konstante in
    dieselben Attribute wie Spalte LGD_COV umgesetzt werden sollte. Mögliche
    Fehlerarten sind:
    -- Fehlerart 1 - Überlauf.
    -- Fehlerart 2 - Gleitkommaüberlauf.
    -- Fehlerart 3 - Gleitkommaunterlauf.
    -- Fehlerart 4 - Gleitkommaumsetzungsfehler.

    Wenn ich den Aufruf native ausführe bekomme ich für die Berechnung folgendes Ergebnis(auszugsweise):

    Ausdruck CASE
    2.512.556,6900000000000000
    289.699,7500000000000000
    91.641,2900000000000000
    3.894.073,4600000000000000
    360.586,9500000000000000
    5.436.586,2500000000000000
    2.633.054,1000000000000000
    10.516.225,7000000000000000
    16.044.414,2000000000000000
    2.674.854,3700000000000000
    4.499.917,6500000000000000

    und hier noch der aktuelle auszug aus dem sqlstatement
    dec(((decimal(dwht1.expeigcov * double(t67.lgdcov)/100, 13 , 2) +
    decimal(dwht1.expeigunco * double(t67.lgduncov)/100, 13 , 2)) /
    (dwht1.expeigcov + dwht1.expeigunco - dwht1.zussisum)), 8, 7),
    Last edited by nico1964; 09-02-16 at 10:51. Grund: Noch mehr Infos
    Andreas
    Ein AS/400 Dinosaurier since 1989

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.748
    dec(Ausdruck, 8, 7) = 8 Stellen, davon 7 Nachkomma
    deshalb
    dec(Ausdruck, 15, 7) = 15 Stellen, davon 7 Nachkomma, also 8 Vorkomma
    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

  4. #4
    Registriert seit
    Dec 2009
    Beiträge
    314
    Zitat Zitat von Fuerchau Beitrag anzeigen
    dec(Ausdruck, 8, 7) = 8 Stellen, davon 7 Nachkomma
    deshalb
    dec(Ausdruck, 15, 7) = 15 Stellen, davon 7 Nachkomma, also 8 Vorkomma
    geändert aber leider der selbe Fehler, bin kurz vor dem verzweifeln oder ich sehe den Wald vor lauter Bäumen nicht mehr
    Andreas
    Ein AS/400 Dinosaurier since 1989

  5. #5
    Registriert seit
    Aug 2006
    Beiträge
    2.115
    Dann geh doch mal überall auf 30,5 und schau mal ob es läuft.
    Sollte wirklich groß genug sein ;-)

    Vielleicht hast Du ja einen Ausreißer in den Zahlen.

    Alternativ mal ein Query und da die Summe berechnen lassen.

    GG

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.748
    Lass einfach mal das zwischendurch casten weg und erzwinge Nachkomma:

    select sum(((t67.lgdcov * 0,01 * expeigcov) +
    (t67.lgduncov * 0,01 * expeigunco)) /
    (expeigcov + expeigunco - zussisum))
    from lea/leadwht1, lea/leat67 t67

    Ein cast auf Double verliert Genauigkeit und erzwingt ein Runden oder abschneiden des Ergebnisses.
    Ggf. ersetze 0,01 mit 0.01, je nach Dezimalzeichen.
    Schau dir die Ergebnisse an.

    Ggf. brauchst du das Ergebnis wieder nicht zu casten sondern stellst dies in eine Hostvariable deines Formates. Mit einem NULL-Anzeiger erfährst du auf Satzebene (-2), wann der Wert nicht passt.
    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

  7. #7
    Registriert seit
    Dec 2009
    Beiträge
    314
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Lass einfach mal das zwischendurch casten weg und erzwinge Nachkomma:

    select sum(((t67.lgdcov * 0,01 * expeigcov) +
    (t67.lgduncov * 0,01 * expeigunco)) /
    (expeigcov + expeigunco - zussisum))
    from lea/leadwht1, lea/leat67 t67

    Ein cast auf Double verliert Genauigkeit und erzwingt ein Runden oder abschneiden des Ergebnisses.
    Ggf. ersetze 0,01 mit 0.01, je nach Dezimalzeichen.
    Schau dir die Ergebnisse an.

    Ggf. brauchst du das Ergebnis wieder nicht zu casten sondern stellst dies in eine Hostvariable deines Formates. Mit einem NULL-Anzeiger erfährst du auf Satzebene (-2), wann der Wert nicht passt.
    Danke Baldur perfekte Lösung.

    mfg
    Andreas
    Andreas
    Ein AS/400 Dinosaurier since 1989

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.748
    Wichtig bei den ganzen Rechnereien ist die Berechnung der Anzahl Nachkomma.
    Sind in der Formel (innerhalb einer Klammerebene) ausschließlich Ganzzahlen beteiligt, wird eine Ganzzahlenarithmetik verwendet. Diese ergibt niemals Nachkomma.
    Bei der Verwendung von Konstanten kann man Nachkomma erzwingen wenn man eben welche angibt.
    An Stelle also "/ 100" kodiert man "/ 100,00". Wenn man Multiplikation verwendet kann wird es eindeutiger und schneller (macht schon ein paar Nanos aus).
    Sind alle beteiligten Ganzzahlen reicht der cast einer einzigen Variablen.
    Statt also "a / b" dann eben "a / dec(b, 11, 2)".
    SQL berechnet dann eben die Anzahl Gesamtstellen bis halt hin zu dec(Ausdruck, 31, n) unter möglicher Beibehaltung der Genaugkeiten.
    Hier kann man (ähnlich wie in ILERPG) mit Zwischenrundungen und casts das Ergebnis beeinflussen:
    "dec(round(a / dec(b, 11, 2), 2), 11, 2"
    Round rundet nur kaufmännisch ohne das Format anzupassen, die Nachkomma werden also nicht gekürzt. Die Zwischenanpassung ist auch manchmal erforderlich, wenn SQL an seine Grenzen stößt und mehr als 31 Stellen benötigt werden. Dies kann man zwar mit SQL-Optionen auf 63 erhöhen, löst aber das Problem meist nicht.

    Nach Möglichkeit sollte man den cast auf Double vermeiden. Man kann damit bei 10^+/-308 rechnen aber die Genauigkeit bleibt bei 14 Stellen!
    Und gerade bei den Nachkommastellen fangen die Rundungsprobleme an, denn round(double(0,333), 2) ergibt leider ungefähr 0,33000000000012 und damit wird dann weiter gerechnet.
    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

  9. #9
    Registriert seit
    Mar 2002
    Beiträge
    5.379
    ... ist (leider) nur fast richtig:
    wichtig ist zuerst, ob SQL ganzahlig oder mit Nachkomma rechnet und das entscheidet sich an der ersten Rechenoperation im staement:
    select 1/3 + 4 from sysibm.sysdummy1 liefert 4
    select 1/3 + 4.0 ... immer noch 4
    select 1/3.0 + 4 ... jetzt 4.33333
    nachträglicher cast, round und Zuweisung an ein entsprechend dimensioniertes Feld hilft hier nix mehr (Zuweisung hat niedrigste Prio)
    Unangenehmer Nebeneffekt hier ist, dass die Reihenfolge der Rechenoperationen vo, Statement abhängen kann (Optimizer).

    Analoges gilt für Gleitkomma Berechnungen; da man hier nicht wirklich steuern kann wo die Genauigkeit hingelegt wird, sollte man das bei kaufmännischen Anwendungen immer meiden.

    Beim runden muss man noch im Auge haben, dass man vor Aggregation rundet, sonst sind die Summen auf verschiedenen Aggregationsstufen nicht konsitent!

    Dasselbe gilt bei Berechnungen, die auf Dreisatz beruhen (Menge mal Preis/Einheit etc.), sowie beim Aufschlag von Märchensteuer (ist hier kein SQL Phänomen).

    Literale in Berechnungen vermeiden, besser Werte aus einer Parameterdatei holen und dazu joinen, oder jedes Literal casten, damit man sicher den Datentyp kennt.

    D*B


    Zitat Zitat von Fuerchau Beitrag anzeigen
    Wichtig bei den ganzen Rechnereien ist die Berechnung der Anzahl Nachkomma.
    Sind in der Formel (innerhalb einer Klammerebene) ausschließlich Ganzzahlen beteiligt, wird eine Ganzzahlenarithmetik verwendet. Diese ergibt niemals Nachkomma.
    Bei der Verwendung von Konstanten kann man Nachkomma erzwingen wenn man eben welche angibt.
    An Stelle also "/ 100" kodiert man "/ 100,00". Wenn man Multiplikation verwendet kann wird es eindeutiger und schneller (macht schon ein paar Nanos aus).
    Sind alle beteiligten Ganzzahlen reicht der cast einer einzigen Variablen.
    Statt also "a / b" dann eben "a / dec(b, 11, 2)".
    SQL berechnet dann eben die Anzahl Gesamtstellen bis halt hin zu dec(Ausdruck, 31, n) unter möglicher Beibehaltung der Genaugkeiten.
    Hier kann man (ähnlich wie in ILERPG) mit Zwischenrundungen und casts das Ergebnis beeinflussen:
    "dec(round(a / dec(b, 11, 2), 2), 11, 2"
    Round rundet nur kaufmännisch ohne das Format anzupassen, die Nachkomma werden also nicht gekürzt. Die Zwischenanpassung ist auch manchmal erforderlich, wenn SQL an seine Grenzen stößt und mehr als 31 Stellen benötigt werden. Dies kann man zwar mit SQL-Optionen auf 63 erhöhen, löst aber das Problem meist nicht.

    Nach Möglichkeit sollte man den cast auf Double vermeiden. Man kann damit bei 10^+/-308 rechnen aber die Genauigkeit bleibt bei 14 Stellen!
    Und gerade bei den Nachkommastellen fangen die Rundungsprobleme an, denn round(double(0,333), 2) ergibt leider ungefähr 0,33000000000012 und damit wird dann weiter gerechnet.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.748
    Nur zur Erklärung:
    "(innerhalb einer Klammerebene)", damit meine ich auch implizite Klammern der Punkt- vor Strichrechnung.
    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

  11. #11
    Registriert seit
    Dec 2009
    Beiträge
    314
    Erst mal herzlichen Dank Baldur für die Hilfe gestern, das ist wieder mal ein Projekt, das Ergebnis schon vor einem Monat bekannt sein hätte sollen.

    Und dann nochmals danke an Dich und Dieter für die ausführliche Erklärung in euren letzten 2 Beiträgen, welche ich in meine Sammlung "So geht es richtig" kopiert habe.

    Ich hätte aber noch eine Frage. Kennt ihr jemanden der InHouse Schulungen anbietet zugeschnitten auf bestimmte Anforderungen. Ich hätte nämlich die Möglichkeit so was zu bewilligen lassen, wenn es sich um ein vernünftiges Preis-Leistungs-Verhältnis handelt . Wir würden dabei einen Anforderungskatalog zusammenstellen, was wir gerne vertiefen oder teilweise auch neu lernen würden.

    Unser Profil: mind. 2 max. 4 Personen wobei bei 4 ist eine Person dabei, welche mit SQL nicht so viel am Hut hat.
    Alle 4 so ca. 20 Jahre AS400 Erfahrung und keiner unter 50. Ich bin mit meinen fast 52 der Benjamin in der Abteilung aber auch der Chefprogrammierer.

    Ort wäre no na das wunderschöne Wien.

    Gruss aus dem verregneten Wien
    Andreas
    Andreas
    Ein AS/400 Dinosaurier since 1989

Similar Threads

  1. SQLXML select/insert
    By WalterB in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 22-11-15, 16:06
  2. SQL Update --> Berechnung mit &Var
    By sonicreducer in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 01-04-15, 16:27
  3. Berechnung SINUS/COSINUS
    By RolandScherieble in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 05-05-03, 21:00
  4. ILE RPG, Berechnung extern definieren
    By Bau in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 05-12-02, 17:43
  5. Suche Tool für Berechnung Zeitdifferenz
    By sho1 in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 04-12-02, 19:55

Berechtigungen

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