-
RTVJOBA im CL (&USRLIBL)
Hallo zusammen!
Ich möchte in einem CL nach Aufruf eines Programmes meine ursprüngliche LIBL wiederhaben.
Ich weiß, dass in dem aufgerufenen Programm ein CHGLIBL ist, also wird die USRLIBL geändert.
Ich habe nun folgendes CL
Code:
PGM
DCL VAR(&LIBL) TYPE(*CHAR) LEN(2750)
RTVJOBA USRLIBL(&LIBL)
CALL PGM /* hier erfolgt ein CHGLIBL */
CHGLIBL LIBL(&LIBL)
ENDPGM
Ich erhalte aber beim Aufruf die Meldung:
Nachricht . . . : (C D I R) CPF0001 von Prozedur CHECKLITE empfangen.
Ursache . . . . : Die ILE CL-Prozedur CHECKLITE in Modul CHECKLITE in
Programm CHECKLITE in Bibliothek GRUPPE20 stellte einen Fehler bei
Anweisungsnummer 0000001700 fest. Der Nachrichtentext für CPF0001 ist:
Fehler in Befehl CHGLIBL gefunden. Die Taste F10 (falls verfügbar) oder den
Befehl DSPJOBLOG (Jobprotokoll anzeigen) verwenden, um die Nachrichten im
Jobprotokoll aufzulisten und eine ausführlichere Beschreibung der
Fehlerursache zu erhalten. Kann das Problem trotzdem nicht gelöst werden,
den technischen Dienst verständigen.
Im Jobprotokoll finde ich dann:
1700 - CHGLIBL LIBL('QGPL LIB2 LIB3 LIB4 LIB5 ')
Wert 'QGPL ' als Name für Parameter LIBL ungültig.
Die erste Bibliothek in der Liste ist die QGPL - evtl. stören die Anführungszeichen, die ich gar nicht setze, sondern die automatisch kommen.
Ich hatte an einer anderen Stelle schon etwas mit der API QCMDEXC gefunden, aber auch das klappt nicht
Wie kann ich diese Anforderung lösen?
Danke schonmal im voraus!
-
Nimm' mal das Hochkomma vor QGPL und nach LIB5 weg.
Setz den CL-Befehl als String zusammen (ohne die Hochkommata) und führe den CL-Befehl dann über QCMDEXC aus.
Birgitta
-
also so:
CHGVAR VAR(&CMD) VALUE('CHGLIBL LIBL(' *CAT +
&USRLIBL *TCAT ') CURLIB(' *TCAT &CURL +
*TCAT ')')
CALL PGM(QCMDEXC) PARM(&CMD 2800)
Fillertext um auf 20 Zeichen zu kommen
der ILEMax
-
Hm, ich dachte, ich habe geschrieben, dass ich die Hochkommata gar nicht selber setze...wie soll ich sie dann also wegnehmen?
Meine Alternative sieht / sah so aus:
Code:
DCL VAR(&PARM1) TYPE(*CHAR) LEN(100)
DCL VAR(&PARM2) TYPE(*DEC) LEN(15 5)
...
CHGVAR VAR(&PARM1) VALUE('CHGLIBL LIBL(' *TCAT +
&LIBL *TCAT ')')
CHGVAR VAR(&PARM2) VALUE(200)
...
Pgroramm-Aufruf
...
CALL PGM(QCMDEXC) PARM(&PARM1 &PARM2)
Dann kommen aber "blöde" Fehler, weil scheinbar Sonderzeichen (von wo auch immer) hinten angehängt werden:
Code:
Zeichenfolge ' XÃ . ' enthält ein ungültiges Zeichen.
Zeichenfolge ' . ' enthält ein ungültiges Zeichen.
Zeichenfolge ' ' enthält ein ungültiges Zeichen.
Im DUMP sieht eigentlich alles korrekt aus:
Code:
&PARM1 *CHAR 100 'CHGLIBL LIBL(QGPL Q'
+26 'TEMP GRUPPE20 DATE'
+51 'NST20 DATENOM20 GRUPPES'
+76 '20) '
-
Dann kommen aber "blöde" Fehler, weil scheinbar Sonderzeichen (von wo auch immer) hinten angehängt werden:
das liegt daran das 200 das doppelte von 100 ist
der ILEMax
-
Hallo,
vor Urzeiten hatte ich dasselble Problem, ich hatte es so gelöst:
DCL VAR(&USRLBL) TYPE(*CHAR) LEN(275)
DCL VAR(&CURLIB) TYPE(*CHAR) LEN(10)
DCL VAR(&USRLIBL) TYPE(*CHAR) LEN(275)
DCL VAR(&CMD ) TYPE(*CHAR) LEN(800)
DCL VAR(&CMDLEN) TYPE(*DEC) LEN(15 5) VALUE(800)
RTVJOBA USRLIBL(&USRLIBL) CURLIB(&CURLIB)
IF COND(&CURLIB = *NONE) THEN(CHGVAR +
VAR(&CURLIB) VALUE(*CRTDFT))
CHGVAR VAR(&USRLBL) VALUE( +
%SST(&USRLIBL 01 10) !! ' ' !! +
%SST(&USRLIBL 12 10) !! ' ' !! +
%SST(&USRLIBL 23 10) !! ' ' !! +
%SST(&USRLIBL 34 10) !! ' ' !! +
%SST(&USRLIBL 45 10) !! ' ' !! +
%SST(&USRLIBL 56 10) !! ' ' !! +
%SST(&USRLIBL 67 10) !! ' ' !! +
%SST(&USRLIBL 78 10) !! ' ' !! +
%SST(&USRLIBL 89 10) !! ' ' !! +
%SST(&USRLIBL 100 10) !! ' ' !! +
%SST(&USRLIBL 111 10) !! ' ' !! +
%SST(&USRLIBL 122 10) !! ' ' !! +
%SST(&USRLIBL 133 10) !! ' ' !! +
%SST(&USRLIBL 144 10) !! ' ' !! +
%SST(&USRLIBL 155 10) !! ' ' !! +
%SST(&USRLIBL 166 10) !! ' ' !! +
%SST(&USRLIBL 177 10) !! ' ' !! +
%SST(&USRLIBL 188 10) !! ' ' !! +
%SST(&USRLIBL 199 10) !! ' ' !! +
%SST(&USRLIBL 210 10) !! ' ' !! +
%SST(&USRLIBL 221 10) !! ' ' !! +
%SST(&USRLIBL 232 10) !! ' ' !! +
%SST(&USRLIBL 243 10) !! ' ' !! +
%SST(&USRLIBL 254 10) !! ' ' !! +
%SST(&USRLIBL 265 10) )
...
/* alte Libl zurück */
CHGVAR VAR(&CMD) VALUE( +
'CHGLIBL LIBL(' !< &USRLBL !< ') CURLIB(' !< &CURLIB !< ')'
CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN)
Ich muss gestehen, dass ich nicht mehr genau weiß warum...
Und mittlerweile gibt es mehr als 25 Bibliotheken.
Aber vielleicht hilft das?
Gruß, Christian
-
Zitat von ILEMax
das liegt daran das 200 das doppelte von 100 ist
der ILEMax
Das war die (total logische, simple) Lösung...
Lag wohl daran, dass ich erst beides auf 200 hatte (vorher sogar auf 2800) und dann nur den einen Wert geändert habe. Aber auch beim Kopieren hierher ists nicht aufgefallen.
Wobei das ja eine Sache ist, die mich oft aufregt, dass das System sich wohl aus dem Speicher mehr als den vorgesehenen Bereich nimmt, um damit vermeintliche Leerstellen aufzufüllen.
Danke euch
PS: Die Lösung mit dem %SST hatte ich auch irgendwo gesehen - aber da dachte ich mir, dass das aus einer Zeit stammen müsste, wo es die "neue" Möglichkeit noch nicht gab.
...wobei ich die Syntax mit dem "'CHGLIBL LIBL(' !< &USRLBL !< ') CURLIB(' !< &CURLIB !< ')'" noch nicht kannte...
-
Das System nimmt nur soviel Speicher, wie ihm mitgeteilt wird, was er sich nehmen darf.
Erfordert ein Aufruf eine Längeninformation, so sollte die Länge zum bereitgestellten Speicher nun mal passen.
Der Speicher ist einfach "endlos" hintereinander, nur die Definition von Variablen beschränkt den Zugriff.
Ich kann durchaus eine Variable (HLL-Programme) von 16MB definieren und komme somit an vieles dran, was eigentlich nicht vorgesehen ist.
Durch VARLEN-Felder oder aber auch Längenparameter muss der programmtechnisch Zugriff eingeschränkt werden.
Bei Varlen-Feldern kann ich durch direkten Zugriff auf die Längeniformation auch hier blödsinn betreiben.
Dem System ist hier keine Schuld zu geben.
Einzig "neuere" Sprachen wie Java und .NET erlauben hier keine Manipulationen.
Nicht umsonst gibt es Viren (Stichwort Bufferintrusion), wo ich mittels C/C++ an nicht gewünschte Speicheradressen komme.
Auch gibt es halt immer wieder Programmfehler, die mitunter an unerwarteter Stelle auftreten weil Aufrufkonventionen nicht eingehalten werden.
-
Zitat von mahones
Wobei das ja eine Sache ist, die mich oft aufregt, dass das System sich wohl aus dem Speicher mehr als den vorgesehenen Bereich nimmt, um damit vermeintliche Leerstellen aufzufüllen.
... das "System" nimmt sich genau soviel, wie Du ihm selber gesagt hast. Wenn Dich das oft aufregt, solltest Du bei der Parameterdefinition etwas mehr Sorgfalt walten lassen.
D*B
-
Mit RTVJOBA USRLIBL() erhältst du alle Bibliotheken aus dem Benutzerteil der Bibliotheksliste in einem einzigen Parameter. Beim CHGLIBL LIBL(...) mußt du jede Bibliothek jedoch einzeln angeben.
Von IBM gibt's ein Beispiel am Ende dieser Seite.
-
Die ganzen %SST sind nicht nötig, da der von RTVJOBA USRLIBL() zurückgegebene Liste der Bibliotheken bereits die notwendigen Leerzeichen zwischen den einzelnen Bibliotheken umfaßt.
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