[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte

Hybrid View

  1. #1
    Registriert seit
    Jun 2012
    Beiträge
    5

    RCVMSG aus einer ILE RPG Prozedur

    Hallo Forum,

    ich nutze ein CL-PGM um Nachrichten aus einem RPG-PGM abzurufen.

    In meinem Beispiel ist dies ein PGM welches aus anderen RPGs aufgerufen wird, wenn eine Satzsperre besteht, um per RCVMSG den sperrenden Job zu ermitteln und dem User so eine Nachricht überstellen zu können.

    Befindet sich der READ/CHAIN allerdings in einem ILE-RPG in einer Prozedur funktioniert dies nicht (Die erhaltene Nachricht ist leer.)

    Wie kann ich in dem RCVMSG-Befehl mitteilen, dass die Nachricht aus der MSGQ der Unterprozedur geholt werden soll?

    Hier der Befehl wie er momentan aussieht:
    Code:
    RCVMSG PGMQ(*SAME (&PGRM)) MSGQ(*PGMQ) MSGTYPE(*PRV) MSGKEY(*NONE) WAIT(2) RMV(*NO) KEYVAR(&MKEY) MSG(&NACHR)

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Du kannst nur dann Nachrichten der Prozedur empfangen, wenn diese dies selber durchführt.
    Also die Prozedur muss dein RCVMSG-Prog aufrufen.
    Ist die Prozedur verlassen, gibt es den Call-Stack ja nicht mehr, dann steht die Nachricht nur noch im Joblog und dafür gibts dann andere API's.
    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

  3. #3
    Registriert seit
    Jun 2012
    Beiträge
    5
    So habe ich es auch umgesetzt. Also die Prozedur ruft das CL per CALL auf, sobald eine Satzsperre festgestellt wird. Der Call-Stack sollte also noch vorhanden sein.

    Bitte entschuldige, wenn meine erste Beschreibung nicht präzise genug war.

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    OK, dann debugge dein CLP und halte vor dem RCVMSG an.
    Schau dir dann den Callstack an.
    Du musst den Prozedurnamen genau (ggf. casesensitive) spezifizieren.

    Dann prüfe auch, an wen die Nachricht, die du abholen willst gesendet wurde (F1->F9).

    Welche Nachricht willst du überhaupt lesen ?
    Bei Datei-Fehlern steht doch ggf. alles in der SDS bzw. INFDS.
    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

  5. #5
    Registriert seit
    Jun 2012
    Beiträge
    5
    Guten Morgen und vielen Dank für die schnelle Hilfe.

    Ich habe nun die Variante mit dem SDS getestet und tatsächlich meine gewünschte Nachricht gefunden:

    "Satz 1 wird von Job 323053/DFOCKEN/DV37956#BI benutzt."

    Diese wurde sonst per RCVMSG abgerufen, um daraus den String nach den Jobinformationen zu durchsuchen. Vermutlich nicht die eleganteste Lösung aber ich wollte lieber den bestehenden Weg anpassen als etwas komplett neues zu entwickeln.

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    wie verhält es sich eigentlich bei Satz-Sperre mit (N)?
    bekomme ich genau so die gewünschte Nachricht welcher job sperrt?

    Wann darf/soll ich eigentlich CHAIN(N) oder (E) nehmen?
    Die Erweiterung (N) bzw. der OpCode UNLOCK funktionieren nur, wenn die Verarbeitung nicht unter Commitment Control erfolgt.
    Sofern ein Datensatz gesperrt ist und mit nur (E) abgefangen wird, wird der Satz (soweit ich mich erinnern kann) nicht empfangen.
    Sofern ein Datensatz gesperrt ist und mit (N) abgefangen ist, wird er nach dem Einlesen freigegeben, unabhängig, ob er gesperrt war oder nicht.
    Wurde ein Datensatz mit (N) oder Unlock freigegeben, kann er ohne erneutes Einlesen nicht fortgeschrieben werden.

    Birgitta
    Birgitta Hauser

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

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Ein Chain(n) liest die Daten immer ohne Sperre (bei Update-Dateien, bei Input-Dateien gibts einen Compilerwarning).

    Ist der Satz gesperrt bzw. unter Commit-Steuerung geändert erhält man den Inhalt trotzdem (bezeichnet als sog. Schmutzdaten).
    Leider kann man sich dann auf die Daten nicht verlassen, sollte die ändernde Applikation einen Rollback veranlassen.
    Das liegt halt so am Konzept.

    Mittels Chain(e) wird halt %error() beim Lock ausgelöst (nach Satzwartezeit) und es werden keine Daten bereitgestellt.
    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

  8. #8
    Registriert seit
    Apr 2012
    Beiträge
    360
    Code:
    D  MsgText               91    170    
    D  MsgTextKurz           91    140    
    
    Monitor;                                 
      CHAIN(NE) (PENR:ARTN) FILE;     
    ON-Error *ALL;                           
      EXSR SubChain;                  
    EndMon;    
    
    BEGSR SubChain;                                 
      If %status = 1218; // Satz gelockt                   
         //Window  MsgTextKurz;                              
         Par_RtnCode = 'L';                                
      ElseIf %error; // sonstiger Fehler                   
         Par_RtnCode = 'E';                                
      ElseIf Not %Found(FILE); //Nicht gefunden         
         Par_RtnCode  = 'N';                               
      Else; // Satz vorhanden + frei                       
         Par_RtnCode = ' ';                                
      endIf;                                               
    EndSr;
    Also ich habe leider wie immer nicht ganz den Durchblick, aber bekomme ich die Satzsperre so angezeigt wie im Code oberhalb?

  9. #9
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Dadurch, dass Du den Fehler über die Erweiterung (E) abgefangen hast, kommst Du nie in den ON-ERROR-Zweig.

    Monitor ist außerdem eine Stufe über dem %ERROR, d.h. eine die Fehlermeldung "Satzsperre" kann mit %ERROR abgefangen werden. Bei der Monitor-Group wird der Fehler intern um ein Level weitergereicht und eine andere Meldung ausgegeben.

    Code:
      Monitor;
        Chain MyKey MyFileF;
      On-Error 1218  // Record Lock
         Unlock MyFile;   //entspricht (N)
         //Mach was immer Du willst
      On-Error *ALL;
         //Alle anderen Fehler
      EndMon;
    Birgitta
    Birgitta Hauser

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

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Allerdings muss dann "CHAIN(E)" ausgeführt werden da CHAIN(N) keine Sperre verlangt und somit der Satz gelesen wird.
    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

  11. #11
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    ... warum brauchst Du überhaupt einen RcvMsg, warum nimmst Du die Fehlermeldung nicht aus der Programm-Status-Datenstruktur (Position 91-170)?

    Wenn Du die Satz-Sperre mit (E) abfängst und ggf. noch auf %Status 1218 prüfst, hast Du den Nachrichten Text in der Programm-Status-Datenstruktur.

    Code:
    D PGMSDS         SDS                             Qualified
    D   MsgTxt                            91   170
     /Free
          ...
          Chain(E) (MyKey1: MyKey2) MyUpdF;
          If %Error();
             Dsply PGMSDS.MsgTxt;
         EndIf;
        ...
     /End-Free
    Funktioniert beim Read natürlich genauso.

    Birgitta
    Birgitta Hauser

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

  12. #12
    Registriert seit
    Apr 2012
    Beiträge
    360
    Morgen Birgitta,

    wie verhält es sich eigentlich bei Satz-Sperre mit (N)?
    bekomme ich genau so die gewünschte Nachricht welcher job sperrt?

    Wann darf/soll ich eigentlich CHAIN(N) oder (E) nehmen?

    Gruß

    Tarki

Similar Threads

  1. ILE RPG / SQL Füllen einer Feldgruppe
    By homue in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 18-07-07, 16:47
  2. Problem mit Java-Methoden Aufruf aus ILE RPG?
    By Stoeberl in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 10-01-07, 10:58
  3. DDS in ILE RPG
    By Squall in forum IBM i Hauptforum
    Antworten: 82
    Letzter Beitrag: 19-10-06, 15:37
  4. Return ILE RPG
    By Squall in forum IBM i Hauptforum
    Antworten: 31
    Letzter Beitrag: 28-09-06, 17:53
  5. Rechnen mit Datumsfeldern in ILE RPG
    By Angela in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 22-08-06, 10:11

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •