View Full Version : Programm aus QRPLOBJ wird dem echten Programm vorgezogen
dschroeder
30-01-17, 12:12
Hallo,
wir haben da ein seltsames Phänomen: Ein Serviceprogramm wurde geändert. Das neue Programmobjekt wurde einwandfrei erstellt. Mein Kollege kann aber machen, was er will (neue Sitzung öffen), er bekommt einfach das neue Programmobjekt nicht in den Zugriff. Der Programmstapel des Jobs zeigt immer, dass das alte Objekt aus der QRPLOBJ im Zugriff ist.
Hat jemand eine Erklärung?
Dieter
dschroeder
30-01-17, 12:18
Nachtrag: Es scheint etwas mit dem Debug-Dämon des RDi zu tun zu haben. Möglicherweise trat das Problem nur beim Debuggen auf.
In einer neuen Sitzung hat jetzt der Aufruf des neuen Objektes geklappt.
Aber ich sehe das doch richtig: Wenn ein neuer Aufruf stattfindet (also z.B. über eine neue Aktivation-Group) dürfte das alte PGM aus der QRPLOBJ nicht mehr gezogen werden, oder?
Das Problem kann dann auftreten, wenn irgendwelche Cache-Funktionen (z.B. SQL-Procedure/-Function) zuschlägt. Diese sind z.T. systemweit.
Es gibt irgendwelche API's/Calls QAQQINI-Optionen um Caches zu ignorieren bzw. zu löschen.
dschroeder
30-01-17, 12:43
Danke für die Antwort. Bei uns zeigte der Debugger des RDi immer an, dass der Source nicht zum Objekt passte. Im Job sah man dann, dass das Objekt aus der QRPLOBJ kam. Es scheint jetzt behoben zu sein, nachdem wir den RDi Debug Dämon neu gestartet haben.
Nun ja, Programmadressen (bzw. Adressen überhaupt) werden meist im Init-Vorgang des Aufrufers geladen.
D.h., du kannst z.B. einem Pointer per %Addr() auch als INZ(%ADDR(Irgendwas)) zuweisen.
Das hat aber mit ACTGRP's nichts zu tun, denn dies wird erst beim tatsächlichen Aufrufen bzw. Aktivieren des Programmes initialisiert.
Ein CALL 'PGMX' ist insofern statisch, da die Adresse von PGMX bereits beim Laden des Programmes ermittelt wird.
Beim CALL VARPGM wird intern ein Systempointer gefüllt, der erst beim 1. Call mit der Adresse gefüllt wird. Jeder weitere Call verwendet dann immer das selbe Objekt.
Die Adresse bekommt man erst weg, wenn man einen CALL VARPGM mit einem anderen Programm durchführt, wo dann der interne Pointer neu initialisiert wird.
Das ist beim CMD-CALL (CLP, Kommandozeile, QCMDEXC, ...) eben anders, da wird der Aufruf-Pointer immer neu initialisiert.