PDA

View Full Version : MSGSFL mit RPGIII / IV



Seiten : [1] 2

ebschubert
15-10-08, 11:32
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.

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

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

Fuerchau
15-10-08, 13:33
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.

ebschubert
15-10-08, 14:13
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

Fuerchau
15-10-08, 14:31
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.

ebschubert
15-10-08, 14:39
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

Fuerchau
15-10-08, 14:47
SFLPGMQ muss bei ILE anders verwendet werden, da sonst der Stapel nicht korrekt gefunden wird.:
SFLPGMQ (Subfile Program Message Queue) keyword for display files (http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/rzakc/rzakcmstdfsfpmq.htm?resultof=%22%73%66%6c%70%67%6d %71%22%20)

ebschubert
15-10-08, 15:23
SFLPGMQ muss bei ILE anders verwendet werden, da sonst der Stapel nicht korrekt gefunden wird.:
SFLPGMQ (Subfile Program Message Queue) keyword for display files (http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/rzakc/rzakcmstdfsfpmq.htm?resultof=%22%73%66%6c%70%67%6d %71%22%20)

jetzt wird's spannend.
Habe im DSPF mein Queue-Feld geändert

A ZZPGM SFLPGMQ(276)
Im RPG steht

D ZZPGM *proc
Wenn ich das so kompilieren bekomme ich :
*RNF6033 30 1 Länge des extern beschriebenen Felds stimmt nicht mit einer
vorherigen Definition überein; die Bestimmung wird ignorier
Definiere ich hingegen

D ZZPGM 1 276
bekomme ich beim Aufruf:

Aufrufstapeleintrag nicht gefunden.
Funktionsprüfung. CPF247A nicht überwacht durch QSFMQDSP bei Anweisung *N,Wo ist der Hase da im Pfeffer????

Fuerchau
15-10-08, 17:17
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.

ebschubert
16-10-08, 07:33
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

B.Hauser
16-10-08, 07:52
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:


SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFL/&MSGF) +
MSGDTA(&PARM) TOPGMQ(* (2)) +
MSGTYPE(*NOTIFY) KEYVAR(&MSGNBR)


Birgitta