PDA

View Full Version : Aufrufendes Programm ermitteln



Seiten : [1] 2

harkne
27-03-14, 09:49
Hallo zusammen,

kann ich in einem RPG-Programm feststellen von welchem Programm es aufgerufen wurde ?

Viele Grüße Harald

Fuerchau
27-03-14, 09:53
Ja, per API.
Suche mal im Forum hier nach "Call Stack".

harkne
27-03-14, 10:03
ohne API geht dann wohl nicht ? Die darf ich mal wieder nicht benutzen.

B.Hauser
27-03-14, 10:59
Wenn es nur um Programme geht, geht das ganz einfach auch ohne API mit einem kleinen CL-Programm:


PGM PARM(&ParCALLER &ParCALLED)

DCL VAR(&ParCALLER) TYPE(*CHAR) LEN(10)
DCL VAR(&ParCALLED) TYPE(*CHAR) LEN(10)

DCL VAR(&MSGKEY) TYPE(*CHAR) LEN(4)
DCL VAR(&SENDER) TYPE(*CHAR) LEN(80)

SNDPGMMSG MSG('TEST') TOPGMQ(*PRV (&ParCALLED)) +
MSGTYPE(*RQS) KEYVAR(&MSGKEY)

RCVMSG PGMQ(*PRV (&ParCALLED)) MSGKEY(&MSGKEY) +
SENDER(&SENDER)

CHGVAR VAR(&ParCALLER) VALUE(%SST(&SENDER 56 10))
ENDE: ENDPGM

In Parameter 2: ParCalled wird der Name des aktuellen RPG-Programms übergeben.
In Parameter 1: ParCaller wird das rufende Programm zurückgegeben.

Birgitta

Fuerchau
27-03-14, 11:17
*PRV ist allerdings das Programm, dass das CLP aufruft.
Bei ILE sind auch noch einige Ebenen dazwischen.
SNDPGMMSG unerstützt keine "relative" Adressierung, wenn man nicht *PRV nehmen kann, muss man leider genau die Programm/Prozedurnamen kennen sonst schlägt der Befehl fehl.

Alternativ wäre allerdings ein "Wrapper":
- Originärer Programmname als CLP mit den Aufrufparametern
- obigen SNDPGMMSG ausführen
- das Ergebnis als zusätzlichen Parameter an das eigentliche Programm (neuer Name) durchreichen

B.Hauser
27-03-14, 11:32
*PRV geht eine Stufe zurück. Deshalb habe ich auch gesagt, solange nur Programme verwendet werden. Werden natürlich zwischenzeitlich Prozeduren aufgerufen oder das Programm aus einer Prozedur aufgerufen, klappt das nicht.

Ich gehen in diesem Fall jedoch davon aus, dass nur Programme aufgerufen werden.

Birgitta

Fuerchau
27-03-14, 12:02
*PRV liefert das aufrufende Programm:
CALL PGMA
CALL PGMB
Der Call des CLP's aus PGMB kann nur PGMB und nicht PGMA liefern.
Deshalb der "Wrapper".

BenderD
27-03-14, 12:28
ohne API geht dann wohl nicht ? Die darf ich mal wieder nicht benutzen.

... naja, da gibt es auch noch die Huddel-Variante mit DSPJOB OPTION(*PGMSTK) output(*print), oder einen Tick eleganter gehuddelt über QSH...

D*B

holgerscherer
27-03-14, 19:41
ohne API geht dann wohl nicht ? Die darf ich mal wieder nicht benutzen.

Gibt es denn eine gute Begründung, warum auf einer API-Maschine wie der AS400 keine APIs benutzt werden dürfen? :)

-h

BenderD
28-03-14, 05:46
Gibt es denn eine gute Begründung, warum auf einer API-Maschine wie der AS400 keine APIs benutzt werden dürfen? :)

-h

... die Begründung hat meist sogar einen Namen und ich sehe schon wieder Gesichter vor mir...