PDA

View Full Version : CPF2479 bei der Anzeige einer MSG Subfile



Seiten : [1] 2

Hubert
25-05-21, 10:38
Guten Tag zusammen,

bei dem Versuch, eine MSG Subfile anzuzeigen, erhalte ich den Fehler CPF2479 (Aufrufstapeleintrag nicht gefunden.)

Die DDS Definition:

A R MSGSFL SFL
A SFLMSGRCD(24)
A MSGKEY SFLMSGKEY
A PGMQ SFLPGMQ
A*
A R MSGCTL SFLCTL(MSGSFL)
A OVERLAY
A SFLDSP
A SFLDSPCTL
A SFLINZ
A
A 30 SFLEND
A SFLSIZ(0003)
A SFLPAG(0001)
A PGMQ SFLPGMQ

Die Prozedurdefinition:

D sndpgmmsg PR ExtPgm('QMHSNDPM')
D MsgID 7A Const
D MsgFile 20A Const
D MsgData 256A Const
D MsgDtaLen 10I 0 Const
D MsgType 10A Const
D StackEntr 10A Const
D StackCoun 10I 0 Const
D MsgKey 4A Const
D ErrorCode 16A Const

der Aufruf:


sndpgmmsg( $MsgId
: $MsgFile
: $MsgDta
: %len( %trimr($MsgDta))
: '*INFO'
: '*'
: 1
: *blanks
: ErrorCode );
msg_sflend = *on;
write msgctl;

Im Joblog sind zu der gesendeten Nachricht diese Details zu finden:

Von Programm . . . . . . . . . : Q98924A551
Von Bibliothek . . . . . . . : QRPLOBJ
Von Modul . . . . . . . . . : SSTMON100R
Von Prozedur . . . . . . . . : SNDCSV
Von Anweisung . . . . . . . : 129900

An Programm . . . . . . . . . : Q98924A551
An Bibliothek . . . . . . . : QRPLOBJ
An Modul . . . . . . . . . . : SSTMON100R
An Prozedur . . . . . . . . : FAKDET_SFLPROCESS
An Anweisung . . . . . . . . : 109800

Vor dem Senden der Nachricht sieht der Aufrufstapel so aus:

Von Programm . . . . . . . . . : Q98924A551
Von Bibliothek . . . . . . . : QRPLOBJ
Von Modul . . . . . . . . . : SSTMON100R
Von Prozedur . . . . . . . . : SNDCSV
Von Anweisung . . . . . . . : 129900

An Programm . . . . . . . . . : Q98924A551
An Bibliothek . . . . . . . : QRPLOBJ
An Modul . . . . . . . . . . : SSTMON100R
An Prozedur . . . . . . . . : FAKDET_SFLPROCESS
An Anweisung . . . . . . . . : 109800
SSTMON100R WINTEST 129800 SNDCSV
QTEVIREF QSYS /0475
QTESTOPH QSYS _C_pep
QTESTOPH QSYS 200 main
QTENPTS QSYS 20 qtescren
QTENPTS QSYS 36 ProgramSource
QUIDSPP QSYS /00E4
QUIMGFLW QSYS /03C3
QUIEXFMT QSYS /0099
QUIINMGR QSYS /05C4
QWSGET QSYS /0667
QT3REQIO QSYS /0256

Wo habe ich da den Denkfehler?

Vielen Dank im Voraus für die Unterstützung.

Hubert

Fuerchau
25-05-21, 11:15
Das Problem bei ILE ist, dass jede Prozedur ein Stapelaufruf ist.
Du musst also beim Senden der Nachricht schauen, an welcher Stapelposition du deine Displayfile behandelst.

Ich würde i.Ü. nicht mit QRPLOBJ testen. Dies deutet auf ein ersetztes Programm hin und nicht auf das Aktive.

Robi
25-05-21, 11:16
Dein PGM läuft aus der QRPLOBJ ...

einfach mal alles beenden, und neu starten.

Hubert
25-05-21, 11:27
Nach einem Neustart sieht der Aufrufstapel jetzt so aus:


Art Programm Anweisung Prozedur
QCMD QSYS /04FA
STARTCL ALGM _CL_PEP
STARTCL ALGM 23700 STARTCL
1 QCMD QSYS /01C8
PDM LUEBBERS 1200 /0028
QUOCPP QPDA /075E
QUOMAIN QPDA /1158
2 QUOCMD QSYS /03B3
SSTMON100R WINTEST _QRNP_PEP_SSTMON100R
SSTMON100R WINTEST 20700 MAIN
SSTMON100R WINTEST 31200 VERARBEITUNG
SSTMON100R WINTEST 66900 TIME_SFLPROCESS
SSTMON100R WINTEST 110100 FAKDET_SFLPROCESS
SSTMON100R WINTEST 130100 SNDCSV
QTEVIREF QSYS /0475
QTESTOPH QSYS _C_pep
QTESTOPH QSYS 200 main
QTENPTS QSYS 20 qtescren
QTENPTS QSYS 36 ProgramSource
QUIDSPP QSYS /00E4
QUIMGFLW QSYS /03C3
QUIEXFMT QSYS /0099
QUIINMGR QSYS /05C4
QWSGET QSYS /0667
QT3REQIO QSYS /0256

Der Fehler bleibt der gleiche.

Die Prozedur, in der das Displayfile verarbeitet wird ist FAKDET_SFLPROCESS. Das sollte doch eigentlich gefunden werden.

Fuerchau
25-05-21, 11:47
Was ist die Prozedur SNDCSV? Diese zeigt den Bildschirm doch erst an.
Wenn du also an FAKDET_SFLPROCESS etwas sendest, ist das 1 Ebene zu hoch.
Allerdings nehme ich mal an, dass du in dieser Prozedur den SNDMSG machst und somit die Routine SNDCSV noch gar nicht aktiv ist.

Wenn du unbeding mit MSGSFL arbeiten möchstest, musst du deine Ebenen der Funktionsaufrufe Austauschen:

dcl-proc SNDDST
FAKDET_SFLPROCESS(..);
EXFMT ...

dcl-proc FAKDET_SFLPROCESS
// tuwas
SNDMSG

Hubert
25-05-21, 12:00
Die Prozedur SNDCSV wird aus FAKDET_SFLPROCESS aufgerufen, wenn dort F9 gedrückt wurde. Hier wird dann aus der angezeigten Subfile eine CSV Datei ins IFS geschrieben und per Email verschickt. Der Erfolg oder Misserfolg des Sendens soll dem Benutzer dann in der Prozedur FAKDET_SFLPROCESS angezeigt werden.
Im SNDCSV ist also keine Bildschirmaktivität.

B.Hauser
25-05-21, 12:21
Es sollte eigentlich genügen, wenn Du den StackCount um 1 (also auf 2) erhöhst.

Birgitta

Hubert
25-05-21, 12:32
Ich vergaß noch zu schreiben, dass die Fehlermeldung beim WRITE MSGCTL ausgegeben wird. Das Senden der Nachricht funktioniert ja.

Fuerchau
25-05-21, 12:42
Und auf welcher Ebene führst du WRITE MSGCTL aus?
Wird an diese Ebene die Nachricht gesendet?
Wenn du das wieder in einer Unterprozedur machst, können die Nachrichten da nicht ankommen.

Siehe noch mal in der Doku:
https://www.ibm.com/docs/en/i/7.2?topic=ssw_ibm_i_72/apis/QMHSNDPM.htm

Du musst die Nachricht an den Callstack-Eintrag schicken, der dann die nachricht verarbeiten soll.

Hubert
25-05-21, 12:49
Ich habe beides versucht. Wenn ich den Stackcount auf 0 setze, geht die Nachricht an SNDCSV. Mit 1 geht sie an FAKDET_SFLPROCESS. Das WRITE MSGCTL habe in die entsprechende Prozedur gesetzt, was aber keinen Erfolg brachte.