Wenn es nur darum geht das rufende Programm zu ermitteln, sind 2 CL-Befehle ausreichend.
Beispiel:
PHP-Code:
PGM PARM(&CALLER +
&CALLED)
/* ---------------------------------------------------------------*/
DCL VAR(&CALLER) TYPE(*CHAR) LEN(10)
DCL VAR(&CALLED) TYPE(*CHAR) LEN(10)
DCL VAR(&MSGKEY) TYPE(*CHAR) LEN(4)
DCL VAR(&SENDER) TYPE(*CHAR) LEN(80)
/* ---------------------------------------------------------------*/
SNDPGMMSG MSG('TEST') +
TOPGMQ(*PRV (&CALLED)) +
MSGTYPE(*RQS) +
KEYVAR(&MSGKEY)
RCVMSG PGMQ(*PRV (&CALLED)) +
MSGKEY(&MSGKEY) +
SENDER(&SENDER)
CHGVAR VAR(&CALLER) VALUE(%SST(&SENDER 56 10))
ENDE: ENDPGM
Bei CALLED übergibst Du das aktuelle Programm und in CALLER bekommst Du das rufende Programm zurück.
Jetzt brauchst Du nur noch eine Schleife darum zu bauen, und jeweils immer den CALLER als CALLED übergeben, solange, bis Du entweder Dein Programm findest (Rekursiver Aufruf) oder bis Du am Anfang des CALL-Stack bist.
Ansonsten ist es auch möglich RPGIV-Programme rekursiv aufzurufen. Sie benötigen lediglich Aktivierungsgruppe *NEW.
Birgitta
Bookmarks