-
*srvpgm
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?
-
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.
-
Beispiel
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...
-
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
-
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?
-
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.
-
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
 Zitat von Xanas
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?
-
Tja Dieter, der Unfug ist eben, dass die alte Version aufgerufen wird und nicht die Neue
-
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.
-
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
 Zitat von Xanas
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.
-
Also ist das keine gute Idee, ein Servieprogramm mit einer neuen Export Procedure mit der gleichen Signatur wie vorher zu erstellen?
Ich ändere die Signatur nur dann, wenn ich bei schon vorhandenen Export Procedures die Parameter verändere.
Der Grund dafür war/ist, dass sich die Signatur nicht immer wie erwartet ändert. Zum Beispiel hab ich zum Test mal ein Alpha Parameter in ein Numeric Parameter geändert, nach kompilieren, war aber immer noch die selbe Signatur, des halb ich mir ein Tool geschrieben, in dem ich entscheiden kann wann die Signatur geändert werden soll.
-
 Zitat von Xanas
Also ist das keine gute Idee, ein Servieprogramm mit einer neuen Export Procedure mit der gleichen Signatur wie vorher zu erstellen?
1. Wird eine Prozedur hinzugefügt einem Service-Programm hinzugefügt, oder aus derm Service-Programm entfernt, ändert sich die Signatur.
2. Die Signatur kann sich ebenfalls ändern, wenn die Reihenfolge der exportierten Prozeduren verändert wird. Deshalb sollten neue exportierte Prozeduren immer am Ende der vorhandenen Quelle(n) eingefügt werden. Werden mehrere Module zu einem Service-Programm zusammengefaßt, sollte auch die Reihenfolge in der die Module aufgelistet werden beibehalten werden.
Auch wenn man mit Binder-Sprache arbeitet und die Signatur nicht erstellen läßt, sondern vorgibt, scheint intern eine andere Signatur verwendet zu werden.
3. Die Signatur kann sich ebenfalls verändern, wenn Parameter hinzugefügt oder entfernt werden.
 Zitat von Xanas
Der Grund dafür war/ist, dass sich die Signatur nicht immer wie erwartet ändert.
Wie bzw. wann erwartest Du denn, dass die Signatur sich ändert?
 Zitat von Xanas
Zum Beispiel hab ich zum Test mal ein Alpha Parameter in ein Numeric Parameter geändert, nach kompilieren, war aber immer noch die selbe Signatur, des halb ich mir ein Tool geschrieben, in dem ich entscheiden kann wann die Signatur geändert werden soll.
Wie änderst Du denn die Signatur?
Die beste Lösung (wenn man mehrere exportierte Prozeduren in einem Service-Programm zusammenfassen will) und nicht die Anwendung neu compilieren will, ist schon die Binder-Sprache zu verwenden. (Auch wenn Dieter das nicht so sieht!)
Es funktioniert, wenn man es korrekt macht!
Also:
1. Der alte Stand, also die zuvor exportierten Prozeduren als Previous sichern. Alle alten Stände sollten beibehalten werden.
2. Die Reihenfolge der exportierten Prozeduren sollte nicht verändert werden. Neue Prozeduren immer am Ende der Liste einfügen.
3. Da intern anscheinend sowieso eine andere Signatur verwendet wird, am besten die Signatur über das System erstellen lassen.
4. Level Check niemals auf *NO setzen
5. Die Binder-Quelle nur dann verändern, wenn eine Prozedur hinzugefügt wird.
Im Gegensatz zu vielen anderen, würde ich in einem Service-Programm nur genau 1 Modul registrieren. Neue Prozeduren immer in dieses Modul am Ende hinzufügen. Und lieber ein zusätzliches Service-Programm (z.B. mit einer Erweiterung im Namen MySrvPgm1) generieren.
Birgitta
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks