[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jun 2003
    Beiträge
    7

    Unhappy EVAL-Statement ->Ergebnisfeld zu klein

    Hallo RPG-Spezialisten!
    Habe das Probelm, daß nach einem EVAL-Statement mit Berechnung der Fehler "RNQ0103" = "Ergebnis ist für das Ziel zu groß" ausgelöst wird. Was kann ich da machen? Kann ich das abfangen, sodaß es zu keinem Absturz kommt?
    Bin für jede Antwort dankbar!

  2. #2
    Registriert seit
    Jun 2001
    Beiträge
    2.044
    Wir haben dafür ne procedur, die heisst rechne

    empfang numerisch 30,6 (die rechnung)
    empfang nmerisch 2 0 vorkommastellen des zielfeldes
    empfang numerisch 1 0 nachkommastellen ...,
    empfang Rundungskennzeichen (auf, ab, kaufm.) wahlweise
    empfang rnd genauigkeit wahlweisr


    aufruf :

    eval feld=rechne(die wildeste formel die mann sich vorstellen
    kann:9:2:1(=aufrunden):0,1)

    die procedur gibt Hival zurück bei feldüberlauf

    Gruß Robi

  3. #3
    Registriert seit
    Jun 2003
    Beiträge
    7

    Question

    Danke, aber genau das ist ja mein Problem; wie behandelt denn die Procedure den Überlauf? Wie kann ich das abfangen?
    Bitte noch einen Tipp, dank!

  4. #4
    Registriert seit
    Jun 2001
    Beiträge
    2.044
    Die procedur empfängt 30,6.
    Das läuft nicht über

    und sie kennt die größe des ergebnissfeldes
    also wird anzahl kommagerecht verglichen

    (über alpha felder und %substr), mit null überschreiben ...


    hilft das
    Robi

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    2.928

    Feldüberlauf abfangen

    Hallo,

    wenn Du bereits auf Release V5R1M0 oder höher bist, kannst Du den Feldüberlauf mit einer Monitor-Group handeln.

    Beispiel:
    PHP-Code:
    /Free
        Monitor
    ;
             
    Ergebnis FeldA Feldb / (FeldC 2**10);
        
    On-Error  103;              //Feldüberlauf
             
    Ergebnis = *HiVal;
        
    On-Error  102;              //Division durch Null
             
    Ergebnis = *Zeros;
        
    On-Error;                       //sonstige Fehler
             
    Ergebnis = *Zeros;
        
    EndMon;    
    /
    End-Free 
    Mit der Monitor-Group kann jeder Fehler, in einem Statement, Programm, Prozedur abgefangen werden.
    Die Monitor-Group kann auch anstatt der (E)-Erweiterung bzw. der mittleren Bezugszahl verwendet werden.

    Vor Release V5R1M0 musst Du einen Feldüberlauf über eine If-Abfrage abfangen:

    Beispiel:
    PHP-Code:
    D Erg             S              5  2 inz(*Zeros)                  
    D MaxErg          S                   like(Erginz(*HiVal)                   
                                                                       
    D Fakt1           S              5  2 inz(999,99)                  
    D Fakt2           S              3  0 inz(999)  

    C                   if        MaxErg     > %abs(%float(Fakt1 Fakt2))
    C                   eval       Erg        Fakt1 Fakt2              
    C                   
    else
    C                   eval       Erg        = *HiVal                       
    C                   
    endif 
    Birgitta
    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

  6. #6
    Registriert seit
    Jun 2003
    Beiträge
    7

    Thumbs up

    Herzlichen Dank für alles !!!
    Das hat geholfen.

  7. #7
    Registriert seit
    Jun 2001
    Beiträge
    2.044
    Ich schätze du hast meine Lösung nicht verstanden
    macht nix,
    Überleg die nur,
    ob du in jedem PGM die Monitorgroup oder den Vergleich codieren willst oder es einmalig in einem *srvpgm hinterlegen willst
    Robi

  8. #8
    Registriert seit
    Jul 2003
    Beiträge
    338

    Talking

    Ich finde es ja schlimm, dass die in den letzten Jahren eingeführten RPG-Erweiterungen teilweise zwingen, umständliche Prüfungen vorzunehmen.
    Ein paar Mal habe ich auch unliebsame Erfahrungen mit Feldüberlauf beim EVAL (Programmabbruch) gmacht, und zwar in Fällen, in den der Überlauf gewollt war.

    In diesen speziellen Fällen helfe ich mir jetzt folgendermassen:
    a) Ergebisfeld als möglichst großes Feld definieren
    b) anschl. mit dem guten alten Z-ADD den Wert übertragen in
    das eigentliche Ergebnisfeld.


    Nicht alles, was man heute im RPG IV nicht mehr verwenden sollte, war schlecht.

    mfg. Ludger

  9. #9
    Registriert seit
    Aug 2001
    Beiträge
    2.928

    Feldüberlauf

    Hallo Ludger,

    mir persönlich ist es lieber, wenn ein Programm abbricht und einen sauberein Rollback macht, als wenn eine führende Ziffer in einem Feld abgeschnitten wird.

    Kaum beim nächsten Monatsabschluss und ein paar 10.000 Euro später holt einem das Ganze ein!
    Und der Zeitaufwand, um den Fehler zu finden und das Desaster dann zu bereinigen ist erheblich!

    Deshalb ist die erste Devise sowieso, ein Feld so gross zu definieren, dass der Maximal-Wert aufgenommen werden kann.
    Werden Summen oder Produkte ermittelt, kann man das Ergebnis-Feld in den D-Bestimmungen über Schlüssel-Wort LIKE erstellen und vorsichtshalber 1 oder 2 Stellen zufügen.
    (Mit *LIKE DEFINE in den C-Bestimmungen kann der gleiche Effekt erzielt werden. Da die Definition in den C-Bestimmungen im RPG-Free-Format nicht mehr unterstützt wird, sollten alle Felddefinitionen in den D-Bestimmungen erfolgen.)

    Und, nimm's mir nicht übel Ludger, ein gewollter Feldüberlauf ist für mich keine saubere Programmierung sondern Mauschelei um nicht zu sagen Pfusch!

    Birgitta
    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

  10. #10
    Registriert seit
    Jul 2003
    Beiträge
    338

    Cool

    Hallo Birgitta,

    Einen Feldüberlauf zu programmieren kann sehr wohl gewollt sein, es kommt auf die Art der Anwendung an. Natürlich darf so etwas z.B. nicht in der Finanzbuchhaltung vorkommen.

    Im techn. Bereich kann es durchaus Bereiche geben, wo dieses gewollt ist. Bevor man dann zu so was unsaubere Programmierung, Mauschelei bzw. Pfusch sagen würde, sollte man doch ein bißchen vorsichtiger sein, vor allem dann, wenn man keine Ahnung hat, um was es sich handelt.

    Ludger

Similar Threads

  1. Rpg-Free-Format // Anfänger fragen (braucht man noch eval? usw.)
    By kr1s in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 08-08-06, 14:16
  2. VARPG - Excel starten
    By Spoldo in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 19-04-05, 15:32
  3. Empfängerwert zu klein
    By mmaschke in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 06-04-05, 08:53
  4. Embedded SQL - Datenbankoptionen in VARPG
    By woki in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 13-04-04, 12:09
  5. RPG: Variablen Inhalt "ab584" in "AB584" wandeln??
    By JonnyRico in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 03-04-03, 10:48

Berechtigungen

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