[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Dec 2005
    Beiträge
    131

    Post 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!

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    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
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  3. #3
    Registriert seit
    Sep 2005
    Beiträge
    393
    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

  4. #4
    Registriert seit
    Dec 2005
    Beiträge
    131
    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)                      '

  5. #5
    Registriert seit
    Sep 2005
    Beiträge
    393
    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

  6. #6
    cbe is offline [professional_User]
    Registriert seit
    May 2005
    Beiträge
    392
    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

  7. #7
    Registriert seit
    Dec 2005
    Beiträge
    131
    Zitat Zitat von ILEMax Beitrag anzeigen
    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...

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  9. #9
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Zitat Zitat von mahones Beitrag anzeigen
    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
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  10. #10
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    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.

  11. #11
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    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
  •