Anmelden

View Full Version : CMD / CL / RTNVAL(*YES)



V_P
09-11-06, 15:11
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

Pikachu
09-11-06, 16:38
Mit einem MONMSG MCH3601 direkt nach dem jeweiligen CHGVAR sollte das gehen.

Fuerchau
09-11-06, 16:51
Wie gesagt, per MONMSG abfangen.
Ansonsten als ILERPG statt CLP aufrufen, dann kann
%ADDR(PARM) = *NULL
geprüft werden.

V_P
10-11-06, 10:25
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.

V_P
10-11-06, 13:06
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?

Fuerchau
10-11-06, 13:29
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.

V_P
10-11-06, 14:39
Danke für die Antwort. Werde mal beide Varianten (API / vorgeschaltetes CL) ausprobieren.

Denn probieren geht über's Studieren. :rolleyes:

V_P
14-11-06, 10:42
Jetzt klappt alles! :D

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".

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! :)