[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Sep 2005
    Beiträge
    15

    Question CMD / CL / RTNVAL(*YES)

    Hallo zusammen.

    Vielleicht könnte jemand mir bei den folgenden Problem helfen.

    Ich habe ein CL-Pgm, welches ein API aufruft, um bestimmte Informationen zu holen.
    Das CL-Pgm hat mehrere Parameter:
    - die ersten 5 sind die Eingabe-Parameter
    - der Rest sind die Rückgabe-Parameter
    Dieses Pgm möchte ich über einen Befehl aufrufen. In der Befehlsdefinition sind die Rückgabefelder mit RTNVAL(*YES) deklariert.
    Diesen Befehl nutze ich dann im weiteren CL-Pgm und fülle es entsprechend mit den CL-Variablen.
    Das Problem ist, dass ich nicht immer alle Rückgabeparameter benötige. D.h. ich fülle im Befehl z.B. nur die Rückgabeparameter 1, 4 und 6 mit Variablen aus und die anderen bleiben leer. Dadurch wird vom Befehl für die nicht gefüllte Felder "null pointer" an das CL-Pgm übergeben. Das verursacht wiederum einen Fehler MCH3601 sobald ich eine Aktion mit der jeweiligen Variable machen möchte (z.B. CHGVAR).

    Hat vielleicht jemand eine Idee wie ich die Übergabe von "null pointer" vermeiden kann bzw. wie ich die CL-Variablen im Pgm überprüfen könnte?

    Vielen Dank im Voraus & Gruß
    V_P

  2. #2
    Registriert seit
    Nov 2003
    Beiträge
    2.309
    Mit einem MONMSG MCH3601 direkt nach dem jeweiligen CHGVAR sollte das gehen.

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.254
    Wie gesagt, per MONMSG abfangen.
    Ansonsten als ILERPG statt CLP aufrufen, dann kann
    %ADDR(PARM) = *NULL
    geprüft werden.
    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
    Sep 2005
    Beiträge
    15
    Das mit %ADDR ist genau wonach ich gesucht habe. Klappt wunderbar.

    Vielen Dank!

    P.S. Die Alternative mit MONMSG war mir schon klar. Ich wollte es aber absichtlich nicht nutzen, da meiner Ansicht nach die Perfomance drunter leidet.

  5. #5
    Registriert seit
    Sep 2005
    Beiträge
    15

    Question

    Leider bin ich jetzt auf ein anderes Problem gestossen.

    Wenn das CL-Pgm eine Fehlernachricht CPFxxxx hat, kann ich das im RPG-Pgm abfangen. Ich kann aber nicht diesen Fehler an das aufrufende Pgm weiterleiten.

    Kann man im RPG sowas ähnliches wie SNDPGMMSG machen?

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.254
    Ja, dafür gibts das API QMHSNDPM.

    Aber Achtung:
    Wenn du ein ESC-Nachricht nach oben gibst musst du die korrekte Ebene berücksichtigen.
    Bei ILE ist das nicht so leicht, da noch Ebenen dazwischen liegen. Ausserdem zieht dann ein LR-Schalter nicht, da die Programmausführung vorzeitig abgebrochen wird (z.B. kein Close von Dateien).
    Eine saubere Bereinigung ist dann nicht möglich.

    Man kann sich aber auch hier mit einem Trick helfen, in dem zuerst ein CLP aufgerufen wird, dieses ruft das ILERPG auf mit zusätzlichen Parametern (z.B. ErrorID, ErrorData).

    Da Adressen in diesem Fall transparent durchgereicht werden tritt in diesem Fall auch kein Laufzeitfehler auf wenn NULL-Pointer weitergegeben werden.

    Nach Rückkehr kann man dann z.B. RCLRSC/RCLACTGRP oder ähnliches tun bevor dann per SNDPGMMSG die Abbruchnachricht gesendet wird.

    Das Gleiche gilt auch für andere Nachrichtenarten.
    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
    Sep 2005
    Beiträge
    15
    Danke für die Antwort. Werde mal beide Varianten (API / vorgeschaltetes CL) ausprobieren.

    Denn probieren geht über's Studieren.

  8. #8
    Registriert seit
    Sep 2005
    Beiträge
    15

    Thumbs up

    Jetzt klappt alles!

    Habe nun ein einziges RPG-pgm, welches QUSRSPLA und im Fehlerfall QMHSNDPM aufruft.

    Wenn man QMHSNDPM mit folgenden Parameter aufruft, wird der aufgetretene PGM-Fehler zum aufrufenden Pgm "weitergeleitet".
    Code:
    C                   Eval      QMHMSGID  = ErrId   
    C                   Eval      QMHMSGF   = 'QCPFMSG   *LIBL'     
    C                   Eval      QMHMSGDTA = ErrData
    C                   Eval      QMHMSGLEN = 132                   
    C                   Eval      QMHMSGTYP = '*ESCAPE'             
    C                   Eval      QMHMSGENT = '*PGMBDY'             
    C                   Eval      QMHMSGCTR = 1                     
    C                   CLEAR                   QUSEC               
    C                   CALL      'QMHSNDPM'             
    C                   PARM                    QMHMSGID 
    C                   PARM                    QMHMSGF  
    C                   PARM                    QMHMSGDTA
    C                   PARM                    QMHMSGLEN
    C                   PARM                    QMHMSGTYP
    C                   PARM                    QMHMSGENT
    C                   PARM                    QMHMSGCTR
    C                   PARM                    QMHMSGKEY
    C                   PARM                    QUSEC    
    *ALL: Nochmal Danke für alle Tips!

Similar Threads

  1. Dynamisches SQL in einem CL erstellen
    By Sony in forum IBM i Hauptforum
    Antworten: 27
    Letzter Beitrag: 20-07-09, 21:48
  2. Programmbibliothek in einem Cobol oder CL Programm ermitteln
    By schatte in forum NEWSboard Programmierung
    Antworten: 19
    Letzter Beitrag: 10-01-07, 11:32
  3. CMD pgmlib
    By ILEMax in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 26-07-06, 17:07
  4. Übergabeparameter im CL Script
    By bo1 in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 23-06-06, 15:00
  5. CMD Parameter im CL Programm
    By mk in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 25-09-04, 15:48

Berechtigungen

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