Anmelden

View Full Version : Großes Problem mit dem Aufrufstapel



Winnilein
18-10-05, 11:30
Liebe Leute, ich bin am Verzweifeln.
Folgendes Problem liegt mir schwer im Magen.
Ich habe ein Menüprogramm MEN001, in welchen je nach Auswahl weitere Programme gecallt werden.
Stapel nach Auswahl AFA210:
Programm
Rqs oder
Lvl Prozedur Bibliothek Anweisung Instruktion
QCMD QSYS 0476
STARTST1 STGOBJ 15400 01AF
< PEP_MEN001 STGOBJ
MEN001 STGOBJ 0000000263
AFA210 STGOBJ .DRVRX01 4EA4
QWSGET QSYS 05A4
QT3REQIO QSYS 018B

Nun Verlasse ich das Programm AFA210
und stelle eine geänderte Version von AFA210 in eine Bibliothek AAA000000, die lt. Bibliotheksliste vor der STGOBJ eingetragen ist, und
Wähle erneut AFA210 zur Verarbeitung aus:
Programm
Rqs oder
Lvl Prozedur Bibliothek Anweisung Instruktion
QCMD QSYS 0476
STARTST1 STGOBJ 15400 01AF
< PEP_MEN001 STGOBJ
MEN001 STGOBJ 0000000263
AFA210 STGOBJ .DRVRX01 613A
QWSGET QSYS 05A4
QT3REQIO QSYS 018B

Wie man sieht, wird immer noch das alte Objekt aus der STGOBJ herangezogen.

Und nun zur allgemeinen Verwirrung noch der Oberhammer...

Wähle ich nun in meinem Menüprogramm ein anderes Programm aus, beende dieses und Rufe wieder AFA210 auf, wird jetzt das Objekt aus der richtigen Bibliothek gezogen:
Programm
Rqs oder
Lvl Prozedur Bibliothek Anweisung Instruktion
QCMD QSYS 0476
STARTST1 STGOBJ 15400 01AF
< PEP_MEN001 STGOBJ
MEN001 STGOBJ 0000000263
AFA210 AAA000000 .DRVRX01 613A
QWSGET QSYS 05A4
QT3REQIO QSYS 018B
.. jetzt verlasse ich wieder AFA210 und benenne das Objekt AFA210 in AFA210XY in der Bibliothek AAA000000 um!
Danach rufe ich wieder AFA210 auf:
Programm
Rqs oder
Lvl Prozedur Bibliothek Anweisung Instruktion
QCMD QSYS 0476
STARTST1 STGOBJ 15400 01AF
< PEP_MEN001 STGOBJ
MEN001 STGOBJ 0000000263
AFA210XY AAA000000 .DRVRX01 613A
QWSGET QSYS 05A4
QT3REQIO QSYS 018B

Im Menüprogramm MEN001 wird aber immer AFA210 gecallt?????

Wer weis, wie ich vor jedem Call den Aufrufstapel sauberkriege?
RCLRSC funktioniert nicht! Auch ein Call auf ein Dummy-Programm im Menüprogramm nach Call auf das Ausgewählte PGM bringt nichts.
Das Problem tritt sowohl unter V4R4 wie auch unter V5R2 auf.

Wer weis Rat?

Fuerchau
18-10-05, 11:42
Wenn du ein Programm aus RPG aufrufst, merkt sich das Programm die Adresse. Solange also das Hauptprogramm nicht beendet wird, wird immer die zuletzt aufgerufene Version verwendet.
Um dieses zu umgehen gibt es 2 Möglichkeitn:

a) CANCEL 'MYPROG'
b) Aufruf eines CLP's mit Parameter, dieses ruft dann das Programm auf (kann auch per TFRCTL erfolgen).

Dieses "Problem" gibt es seit ich die AS/400 kenne.

Winnilein
18-10-05, 12:00
Wenn ich zwischenzeitlich ein anderes PGM aus dem Menüeprogramm aufrufe, funktioniert es ja. Wenn ich aber in mein Menüprogramm folgenden Abschnitt reinbaue füntioniert es trotzdem nicht??
C move *blanks #CALL 10
C movel SFPGM #CALL
C call #CALL 50
C move *blanks #CALL
C movel 'Dummy' #CALL
C call #CALL 50
SFPGM = Programmname aus dem Subfile.In konkreten Fall AFA210.
DUMMY = Ein Programm, das nur nen Chain auf ne x-Belibige datei Macht(zwegs Test)

Fuerchau
18-10-05, 12:51
Dies ist korrekt !
Der Variablen wird intern ein Systemzeiger auf das Programmobjekt zugewiesen. Erst wenn tatsächlich ein CALL auf die Variable durchgeführt wird, prüft RPG ob sich der Inhalt zum letzten CALL geändert hat. Ist dies der Fall wird der Systemzeiger erneuert.
Nur durch das Init der Variablen wird der interne Zeiger nicht zerstört.

Dein Weg eines Dummy-Calls kann durchaus so bleiben. Das Programm braucht nichts zu tun ausser einem RETRN.

Der Zeiger wird auch zurückgesetzt per "FREE MYVAR" (CANCEL gilt für COBOL).

Winnilein
18-10-05, 13:03
Der Dummy-Call funktiniert! Ich hatte leider im RPG-Programm den Movel 'Dummy' eingebaut, das Programm heisst aber DUMMY.

*sick*

Gruß
Winni