PDA

View Full Version : *srvpgm



Seiten : [1] 2

Xanas
06-01-06, 09:35
Hallo,

Wann müssen Programme, die Seviceprogramme verwenden neu kompiliert werden?

Eins ist mit klar, dann wenn sich die Signatur des Serviceprogramms geändert hat. Aber manches mal machen Programme die Prozeduren aus Serviceprogramm verwenden, die geändert wurden riesen Unsinn. Woran liegt das?

Fuerchau
06-01-06, 10:47
Wenn Serviceprogramme noch aktiv sind während sie geändert wurden.
In diesem Fall arbeitet das Programm ggf. noch mit der alten Version, die in QRPLOBJ verschoben wurde.
Beim UPDPGM/CRTxxxPGM sollte darauf geachtet werden, dass das Programm tatsächlich nicht in Benutzung ist.
Vielleicht sollte man geänderte Module per UPDPGM einbringen, das wird verhindert wenn das Programm in Benutzung ist.
CRTPGM verschiebt das alte in QRPLOBJ und erstellt dann das neue.

Xanas
06-01-06, 10:55
pgmA verwendet Prozeduren aus srvpgmB
srvpgmB wurde geändert und neu kompiliert, hat aber keine neu Signatur bekommen.

pgmA war nicht wärend der Kompilierung aktiv. Jetzt rufe ich pgmA auf und es macht unsinn.

pgmA auch mal kompiliert und schon klappts. Das kann ich mir irgendwie nicht erklären...

B.Hauser
06-01-06, 14:38
Ein Programm oder Service-Programm muss nicht unbedingt laufen, um aktiviert zu sein. Ein Programm oder Service- Programm ist solange aktiv, solange die Aktivierungs-Gruppe in der es läuft aktiv ist.

Wir gehen davon aus, dass Du innerhalb Deines Jobs bereits folgende Programme aufgerufen hast:
1. Programm A --> Procedure aus SrvPgm X --> Aktivierungs-Gruppe A
2. Programm B --> Procedure aus SrvPgm X --> Default-Aktivierungs-Gruppe
3. Programm C --> Procedure aus SrvPgm X --> Aktivierungs-Gruppe *NEW

Das Service-Programm wird neu erstellt.

Beim erneuten Aufruf von Programm A und B, kann es zu Problemen kommen, da die alte Version von SrvPgm X verwendet wurde. Die Aktivierungs-Gruppen wurden nicht beendet.
Programm C dagegen wird ohne Probleme mit der neuen Prozedur arbeiten. Bei Aktivierungs-Gruppe *New wird bei jedem Programm-Aufruf eine neue Aktivierungs-Gruppe verwendet. Bei Programm-Ende wird die Aktivierungs-Gruppe gelöscht und der Speicher bereinigt.

Werden nach der Erstellung des Service Programms alle Aktivierungs-Gruppen mit RCLACTGRP *ELIGIBLE geschlossen, ergibt sich folgende Situation:
Programm A und C werden ohne Probleme mit der neuen Version des Service-Programms arbeiten. Programm B dagegen, wird mit der alten Version arbeiten, da Default-Aktivierungs-Gruppen nur durch normales oder abnormales Jobende geschlossen werden. RCLRSC hilft übrigens bei ILE Programmen und Service-Programmen, die in der Default-Aktivierungs-Gruppe laufen nicht. Die Programme / Service-Programme werden nicht beendet bzw. nicht deaktiveirt, sondern der reservierte Speicher wird lediglich initialisiert.

Deshalb ist es immer am Besten, wenn Programme oder Prozeduren verändert wurden, die Anwender aufzufordern ab- und wieder anzumelden.

Wird in einer sauberen ILE-Umgebung (also ohne Verwendung der Default-Aktivierungs-Gruppe) gearbeitet, sollte man die betroffenen Aktivierungs-Gruppen entweder gezielt, oder mit RCLACTGRP *ELIGIBLE alle beenden. Und erst anschließend testen.

Birgitta

Xanas
09-01-06, 07:06
Bei uns haben die Programme benannte Aktivierungsgruppen oder *caller.

Aber wenn ich das jetzt richtig verstanden habe, heißt das, dass sich alle User neu anmelden müssen, damit keine Fehler passieren? Das schlimme ist ja, dass die Programm nicht einmal abbrechen, sonndern irgenwie weiterlaufen.

Programme, die aber noch laufen, arbeiten doch mit dem Objekt in der QRPLOBJ sprich mit der alten version oder?

Das heißst im Menü könnte man RCLACTGRP *ELIGIBLE einbauen um ein Neuanmelden zu umgehen?

Fuerchau
09-01-06, 08:14
Dies wird nicht ganz reichen (siehe DFTACTGRP) !
Benannten ACTGRP's sind OK, aber wenn *CALLER-PGM'e aus OPM's aufgerufen werden, bleiben diese eben über die Joblaufzeit aktiv.

BenderD
10-01-06, 09:00
Hallo,

solange man kein RCLACTGRP macht und die Objekte alle mit Replace (yes) erstellt und sich keine Signaturen geändert haben, läuft da schlicht die alte Version, wenn es vorher aktiviert war und die neue, wenn es später aktiviert wird. Was verstehst du denn unter "großem Unfug", der da bei euch passiert???

mfg

Dieter Bender


Bei uns haben die Programme benannte Aktivierungsgruppen oder *caller.

Aber wenn ich das jetzt richtig verstanden habe, heißt das, dass sich alle User neu anmelden müssen, damit keine Fehler passieren? Das schlimme ist ja, dass die Programm nicht einmal abbrechen, sonndern irgenwie weiterlaufen.

Programme, die aber noch laufen, arbeiten doch mit dem Objekt in der QRPLOBJ sprich mit der alten version oder?

Das heißst im Menü könnte man RCLACTGRP *ELIGIBLE einbauen um ein Neuanmelden zu umgehen?

Fuerchau
10-01-06, 09:28
Tja Dieter, der Unfug ist eben, dass die alte Version aufgerufen wird und nicht die Neue ;)

Xanas
10-01-06, 09:36
Das ist ne gute Frage, wenn ich das wüsste, ich hatte z.B mal eine zusätzliche Procedure in ein Servicprogramm eingebaut und das Serviceprogramm neu erstellt. Das Programm was das Serviceprogramm verwendet, hatte dann bei einer Procedure (nicht die neue Procedure) lauter Schrott in den Parametern übergeben. Dann hab ich das Programm einfach noch mal kompiliert und alles war wieder in Ordnung. Das Problem ist mir aber schon öffters aufgefallen, war also kein Einzelfall, kann aber nicht nachvollzeihen, was die Ursache ist.

BenderD
10-01-06, 09:50
Hallo,

wenn die zusätzliche Prozedur exportiert wird, dann ändert sich die Signatur des Service Programms und dann ist eine Neu kompilieren des Programmes der sinnvollste Weg das erforderliche zu veranlassen; alle Spielereien mit Binder Language und ähnlicher Unfug, haben genau die Probleme als Nebenwirkung, die du benennst. Lässt man diesen unnötigen Quatsch, dann stirbt das Programm sofort beim Aufruf, oder es tut genau das, was es soll (zumindest das, was in der Quelle programmiert wurde).

mfg

Dieter Bender


Das ist ne gute Frage, wenn ich das wüsste, ich hatte z.B mal eine zusätzliche Procedure in ein Servicprogramm eingebaut und das Serviceprogramm neu erstellt. Das Programm was das Serviceprogramm verwendet, hatte dann bei einer Procedure (nicht die neue Procedure) lauter Schrott in den Parametern übergeben. Dann hab ich das Programm einfach noch mal kompiliert und alles war wieder in Ordnung. Das Problem ist mir aber schon öffters aufgefallen, war also kein Einzelfall, kann aber nicht nachvollzeihen, was die Ursache ist.