Wenn es nur darum geht das rufende Programm zu ermitteln, sind 2 CL-Befehle ausreichend.

Beispiel:
PHP-Code:
          PGM        PARM(&CALLER           +                           
                          &
CALLED)                                      
/* ---------------------------------------------------------------*/    
          
DCL        VAR(&CALLERTYPE(*CHARLEN(10)                   
          
DCL        VAR(&CALLEDTYPE(*CHARLEN(10)                   
          
DCL        VAR(&MSGKEY)   TYPE(*CHARLEN(4)                  
          
DCL        VAR(&SENDER)   TYPE(*CHARLEN(80)                 
/* ---------------------------------------------------------------*/    
          
SNDPGMMSG  MSG('TEST')                                  +     
                     
TOPGMQ(*PRV (&CALLED))                       +     
                     
MSGTYPE(*RQS)                                +     
                     
KEYVAR(&MSGKEY)                                    
                                                                        
         
RCVMSG     PGMQ(*PRV (&CALLED))                         +      
                      
MSGKEY(&MSGKEY)                              +    
                      
SENDER(&SENDER)                                   
           
CHGVAR     VAR(&CALLERVALUE(%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