[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Feb 2008
    Beiträge
    109

    MSGSFL mit RPGIII / IV

    Hallo an Alle

    ich habe folgendes Problem:
    Habe eine alte RPG3-Quelle mit DSPF und eigener MSGF mittels CVTRPGSRC auf RPG4 konvertiert.

    Die DDS für das DSPF ist dabei die gleiche geblieben.

    Das Fehlerhandling in der alten Quelle ist im DSPF über SFLMSG und SFLCTL gesteuert.
    Code:
     A          R MSGRCD                    SFL                     
     A*%%TS  SD  19960410  142335  AS          REL-V2R3M0  5738-PW1 
     A                                      SFLMSGRCD(24)           
     A            MSGKEY                    SFLMSGKEY               
     A            ZZPGM                     SFLPGMQ                 
     A*                                                             
     A          R MSGCTL                    SFLCTL(MSGRCD)          
     A*%%TS  SD  19960410  142335  AS          REL-V2R3M0  5738-PW1 
     A                                      OVERLAY                 
     A  30                                  SFLDSP                  
     A  30                                  SFLDSPCTL               
     A  30                                  SFLINZ                  
     A                                      SFLSIZ(0003)            
     A                                      SFLPAG(0001)            
     A            ZZPGM                     SFLPGMQ                 
      *
    Im RPG3 rufe ich dazu ein CL-PGM,
    das die MSG mit
    Code:
    SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFL/&MSGF) +
                 MSGDTA(&PARM) TOPGMQ(*PRV) +    
                 MSGTYPE(*NOTIFY) KEYVAR(&MSGNBR)
    reinstellt.
    Das RPG3-Programm funktioniert!!!

    Nach der Konvertierung auf RPG4 erscheinen aber meine Fehlernachrichten nicht mehr!!!!

    Hat jemand eine Ahnung woran das liegen könnte?

    Grüße und vielen Dank vorab

    Andreas

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Das hat mit den Aufrufebenen zu tun.
    ILERPG hat da noch ein paar Ebenen mehr.
    Beim SNDPGMMSG muss genau der Aufrufstapel angegeben werden, der die DSPF eröffnet hat.
    Halte dein CLP mal im Debugger an und schau dir den Call-Stack dann an.

    Wenn dein CLP allerdings auch von OPM's noch aufgerufen wird, benötigst du ein neues.

    Oder du nimmst statt dessen das API QMHSNDPM.
    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
    Feb 2008
    Beiträge
    109
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Das hat mit den Aufrufebenen zu tun.
    ILERPG hat da noch ein paar Ebenen mehr.
    Beim SNDPGMMSG muss genau der Aufrufstapel angegeben werden, der die DSPF eröffnet hat.
    Halte dein CLP mal im Debugger an und schau dir den Call-Stack dann an.

    Wenn dein CLP allerdings auch von OPM's noch aufgerufen wird, benötigst du ein neues.

    Oder du nimmst statt dessen das API QMHSNDPM.
    Hallo Herr Fuerchau,

    das DSPF enthält ein SFL für Daten.
    Wenn ich im DSPF nur mit einem normal RECORD arbeite, funktionierts.
    Mit dem SLF dagegen wird nichts angezeigt.

    Grüsse

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Das ist ja auch korrekt.
    Eine SFLMSG erwartet die Nachrichten im aktuellen Aufrufstapel.
    Dein CLP sendet Nachrichten an eine bestimmte PGMMSGQ, nämlich *PRV.
    Da nun jeder Stapeleintrag eine eigene PGMQ hat, und sich bei ILE die Stapeleinträge vermehren, stimmt einfach diese Aufrufebene nicht mehr.

    Dein CLP sendet also die Nachrichten nun nicht mehr an den Stapeleintrag, der die Nachrichten verarbeiten soll.
    Also ist das CLP so zu ändern, dass die korrekte PGMQ angesprochen 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

  5. #5
    Registriert seit
    Feb 2008
    Beiträge
    109
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Das ist ja auch korrekt.
    Eine SFLMSG erwartet die Nachrichten im aktuellen Aufrufstapel.
    Dein CLP sendet Nachrichten an eine bestimmte PGMMSGQ, nämlich *PRV.
    Da nun jeder Stapeleintrag eine eigene PGMQ hat, und sich bei ILE die Stapeleinträge vermehren, stimmt einfach diese Aufrufebene nicht mehr.

    Dein CLP sendet also die Nachrichten nun nicht mehr an den Stapeleintrag, der die Nachrichten verarbeiten soll.
    Also ist das CLP so zu ändern, dass die korrekte PGMQ angesprochen wird.
    Habe das jetzt auf QMHSNDPM
    und QMHRMVPM geändert - der Effekt ist der gleiche...

    Eine Anmerkung dazu...
    Im DSPJOBLOG sehe ich im PGM, das nur einen RECORD im DSPF ausgibt, meine Nachrichten.
    Bei dem PGM, das SFL bedient, erscheint im DSPJOBLOG auch keine Nachricht!!!!

    Grüsse und Danke

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    SFLPGMQ muss bei ILE anders verwendet werden, da sonst der Stapel nicht korrekt gefunden wird.:
    SFLPGMQ (Subfile Program Message Queue) keyword for display files
    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

  7. #7
    Registriert seit
    Feb 2008
    Beiträge
    109
    Zitat Zitat von Fuerchau Beitrag anzeigen
    SFLPGMQ muss bei ILE anders verwendet werden, da sonst der Stapel nicht korrekt gefunden wird.:
    SFLPGMQ (Subfile Program Message Queue) keyword for display files
    jetzt wird's spannend.
    Habe im DSPF mein Queue-Feld geändert
    Code:
      A            ZZPGM                     SFLPGMQ(276)
    Im RPG steht
    Code:
    D  ZZPGM            *proc
    Wenn ich das so kompilieren bekomme ich :
    Code:
    *RNF6033 30      1 Länge des extern beschriebenen Felds stimmt nicht mit einer
                       vorherigen Definition überein; die Bestimmung wird ignorier
    Definiere ich hingegen
    Code:
    D  ZZPGM            1    276
    bekomme ich beim Aufruf:
    Code:
     Aufrufstapeleintrag nicht gefunden.                                       
     Funktionsprüfung. CPF247A nicht überwacht durch QSFMQDSP bei Anweisung *N,
    Wo ist der Hase da im Pfeffer????

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Das ist ja das Problem bei ILE.
    Du musst erst feststellen, wie dein Aufrufstapeleintrag genau heißt!
    Diesen Namen musst du dann (siehe Link) in die Variable ZZPGM in dem korrekten Format einstellen.

    Ansonsten lass das Programm halt auf OPM.
    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
    Feb 2008
    Beiträge
    109
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Das ist ja das Problem bei ILE.
    Du musst erst feststellen, wie dein Aufrufstapeleintrag genau heißt!
    Diesen Namen musst du dann (siehe Link) in die Variable ZZPGM in dem korrekten Format einstellen.

    Ansonsten lass das Programm halt auf OPM.
    Guten Morgen

    Wenn es denn schon nicht in SDS *PROC ist, gibts es einen Weg, sowas zur Laufzeit zu ermitteln?

    Grüsse

  10. #10
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Hallo,

    es ist zwar schon eine Weile her, dass ich mich mit MSGSFLs auseinandergesetzt habe, da ich die Nachrichten immer direkt an die externe Message Queue schicke und mir damit keine Gedanken um einen Aufrufstapel machen muss.

    Wenn ich micht recht erinnere ist es bei ILE 1 Stufe mehr als bei OPM, da die Funktion gewrappt wird.
    Langer Rede kurzer Sinn versuch's doch einfach mal mit:

    PHP-Code:
    SNDPGMMSG MSGID(&MSGIDMSGF(&MSGFL/&MSGF)  +
              
    MSGDTA(&PARM) [B]TOPGMQ(* (2)) [/B]+       
              
    MSGTYPE(*NOTIFY)  KEYVAR(&MSGNBR
    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

  11. #11
    Registriert seit
    Feb 2008
    Beiträge
    109

    Thumbs up

    Zitat Zitat von B.Hauser Beitrag anzeigen
    Hallo,

    es ist zwar schon eine Weile her, dass ich mich mit MSGSFLs auseinandergesetzt habe, da ich die Nachrichten immer direkt an die externe Message Queue schicke und mir damit keine Gedanken um einen Aufrufstapel machen muss.

    Wenn ich micht recht erinnere ist es bei ILE 1 Stufe mehr als bei OPM, da die Funktion gewrappt wird.
    Langer Rede kurzer Sinn versuch's doch einfach mal mit:

    PHP-Code:
    SNDPGMMSG MSGID(&MSGIDMSGF(&MSGFL/&MSGF)  +
              
    MSGDTA(&PARM) [b]TOPGMQ(* (2)) [/b]+       
              
    MSGTYPE(*NOTIFY)  KEYVAR(&MSGNBR
    Birgitta
    Vielen Dank

    .... aber es geht noch einfacher !!!!!

    aus dem Link
    http://publib.boulder.ibm.com/infoce...mstdfsfpmq.htm
    Special value

    The SFLPGMQ field can contain a special value, * (asterisk), instead of a program message queue name. If the program moves an asterisk to the SFLPGMQ field, the i5/OS operating system uses the message queue of the program issuing the output operation. You cannot use an asterisk if your program is a CL program.
    Habe den SDS *PROC-Bereich wie folgt definiert
    Code:
     D PGMDS          SDS              
     d  ZZPGM                  1    276
     d  ZZPG1                  1    256
     d  ZZPG2                257    266
     d  ZZPG3                267    276
     ** ZZPGM            *proc
    und dann einfach folgendes gemacht
    Code:
     
    c                   movel(p)  '*'           zzpg1
    c                   move      *blanks       zzpg2
    c                   move      *blanks       zzpg3
    ... und es funxt!!!!!!!!!!


    Trotzdem vielen Dank...

    Grüsse
    Andreas

  12. #12
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Ich wollte Dir gerade noch die folgende Lösung vorschlagen:

    Der Programm-Name in Deinem Anzeige-Programm ist bekannt (Programm-Status-Datenstruktur Stelle 1-10).
    Übergib diesen Programm-Namen an Dein CL-Programm und schicke die Message direkt an diese Programm-Queue.

    PHP-Code:
    SNDPGMMSG MSGID(&MSGIDMSGF(&MSGFL/&MSGF)  +
              
    MSGDTA(&PARMTOPGMQ(&MYPGM) +       
              
    MSGTYPE(*NOTIFY)  KEYVAR(&MSGNBR
    Ich würde von der Programm-Status-Datenstruktur die Finger lassen und NICHT verändern.

    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

Similar Threads

  1. Bibliotheksliste in RPG IV abfragen
    By timeless in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 11-01-07, 12:04
  2. SSL API in RPG IV
    By Kurmas Zeschlon in forum IBM i Hauptforum
    Antworten: 0
    Letzter Beitrag: 27-06-05, 15:48
  3. RPGII, RPGIII, RPG400, RPGIV, ILE Was ist was?
    By Schnichels in forum IBM i Hauptforum
    Antworten: 12
    Letzter Beitrag: 27-05-04, 21:29
  4. RPGII auf RPGIII umstellen
    By becama in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 14-08-02, 07:31

Berechtigungen

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