-
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
-
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.
-
 Zitat von Fuerchau
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
-
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.
-
 Zitat von Fuerchau
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
-
SFLPGMQ muss bei ILE anders verwendet werden, da sonst der Stapel nicht korrekt gefunden wird.:
SFLPGMQ (Subfile Program Message Queue) keyword for display files
-
 Zitat von Fuerchau
jetzt wird's spannend.
Habe im DSPF mein Queue-Feld geändert
Code:
A ZZPGM SFLPGMQ(276)
Im RPG steht
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
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????
-
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.
-
 Zitat von Fuerchau
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
-
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(&MSGID) MSGF(&MSGFL/&MSGF) +
MSGDTA(&PARM) [B]TOPGMQ(* (2)) [/B]+
MSGTYPE(*NOTIFY) KEYVAR(&MSGNBR)
Birgitta
-
 Zitat von B.Hauser
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(&MSGID) MSGF(&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
-
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(&MSGID) MSGF(&MSGFL/&MSGF) +
MSGDTA(&PARM) TOPGMQ(&MYPGM) +
MSGTYPE(*NOTIFY) KEYVAR(&MSGNBR)
Ich würde von der Programm-Status-Datenstruktur die Finger lassen und NICHT verändern.
Birgitta
Similar Threads
-
By timeless in forum IBM i Hauptforum
Antworten: 5
Letzter Beitrag: 11-01-07, 12:04
-
By Kurmas Zeschlon in forum IBM i Hauptforum
Antworten: 0
Letzter Beitrag: 27-06-05, 15:48
-
By Schnichels in forum IBM i Hauptforum
Antworten: 12
Letzter Beitrag: 27-05-04, 21:29
-
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
-
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