Hallo KM,


Zitat Zitat von KM
Hallo,

ich habe ein Verständnisproblem bzgl. ACTGRPs. Wir haben ein Programm PGMA (*PGM) mit der ACTGRP = PGMA. Dieses ruft PGMB auf (*SRVPGM) mit der ACTGRP = PGMB. Wenn man wieder zu PGMA zurückkommt und dann RCLACTGRP PGMB durchführt und danach nochmal PGMB aufruft, kommt immer der Fehler

Es wurde versucht, auf ein nicht mehr vorhandenes Objekt oder Teile des Objekts Bezug zu nehmen.
Funktionsprüfung. MCH3402 nicht überwacht durch PGMB bei Anweisung *N,
Instruktion X'0000'.

Ich dachte, dass eine ACTGRP immer wieder neu angelegt wird, wenn sie nicht existiert. Durch den RCLACTGRP wurde sie doch wieder freigegeben und hätte wieder neu erstellt werden müssen. Oder sehe ich das falsch ? Wenn ich dann noch RCLACTGRP PGMA durchführe, dann funktioniert wieder alles ganz normal. Gibt es denn eine Verknüpfung dieser beiden ACTGRPs ?

KM
Hier muss man die Erstellung einer Activation Group (= Ablaufkontext eines Programms) und die Aktivierung eines Programmes auseinanderhalten.
Programme werden inklusive aller gebundenen Bestandteile, auch der Service Programme beim ersten Aufruf komplett geladen und alle Referenzen auf Module in Service Programmen werden aufgelöst und an Procedure Pointer zugewiesen. Soweit bei diesem Vorgang Activation Groups nicht vorhanden sind, werden sie neu erstellt.
Dein RCLACTGRP PGMB schmeißt das SRVPGM aus dem Speicher, tangiert aber die Aktivierung von PGMA nicht, sodass die Procedure Pointer, die auf Module aus dem Service Programm verwiesen haben, ins Nirvana zeigen.
Nach dem RCLACTGRP auf PGMA wird PGMA aus dem Speicher entfernt und bei erneutem Aufruf inklusive des gebuindenen Service Programmes neu aktiviert und damit gibt es auch wieder gültige Procedure Pointer.


Zitat Zitat von KM
Noch ein seltsamer Fall. Wenn ich nun das Serviceprogramm PGMB durch ein *PGM ersetze, dann wird nach Programmende von PGMB die ACTGRP wieder freigegeben, obwohl kein RCLACTGRP durchgeführt wurde. Ich dachte eigentlich, dass benannte ACTGRPs immer entweder durch Jobende oder durch RCLACTGRP beendet werden.

Gruß,
KM
Hier handelt es sich um eine falsche Beobachtung. Lediglich ACTGRP(*NEW) wird automatisch gelöscht.
Diese ganzen Schmutzeffekte sind vermeidbar durch dynamisches Binden zur aufzeit, sprich durch Aktivierung und Zuweisung der Procedure Pointer durch API Aufruf. (siehe auch PROCP4NAME auf meiner Open Source Seite).

mfg

Dieter Bender

@Baldur Mit *INLR hat das alles nix zu tun und es ist durchaus möglich (u.U. sogar sinnvoll) Module in einem ServiceProgram zu haben, das auch gleichzeitig Programm ist.