Message 如何防止消息在消息子文件中消失?

Message 如何防止消息在消息子文件中消失?,message,ibm-midrange,Message,Ibm Midrange,我有一个RPG程序a和一个CL程序B。a接受显示文件中的一些用户输入,并将其用作B的输入参数。B处理输入参数,如果出现错误,B将接收并重新发送消息,以便使用消息子文件将其显示在显示文件的底部。此消息显示机制工作正常,但并不完全正常,因为发送的消息只能在很短的时间内浏览,然后它就从显示文件中消失了。这个问题的原因是什么?如何阻止邮件消失 以下是程序B中的示例代码: DCLF FILE(ECSWIFP1) MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))

我有一个RPG程序a和一个CL程序B。a接受显示文件中的一些用户输入,并将其用作B的输入参数。B处理输入参数,如果出现错误,B将接收并重新发送消息,以便使用消息子文件将其显示在显示文件的底部。此消息显示机制工作正常,但并不完全正常,因为发送的消息只能在很短的时间内浏览,然后它就从显示文件中消失了。这个问题的原因是什么?如何阻止邮件消失

以下是程序B中的示例代码:

DCLF FILE(ECSWIFP1)
MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))

OVRDBF FILE(ECSWIFP1) TOFILE(ECSWIFP1) SHARE(*YES)
OPNQRYF FILE(ECSWIFP1) QRYSLT(&QRYSTR)
RCVF 
CLOF FILE(ECSWIFP1)
DLTOVR FILE(ECSWIFP1)

RTVDTAARA DTAARA(&E4LIBN/&E4OBJN) RTNVAR(&DTARVAL)
GOTO CMDLBL(END)

ERROR:
CLOF FILE(ECSWIFP1)
MONMSG MSGID(CPF4520)
DLTOVR FILE(ECSWIFP1)
MONMSG MSGID(CPF9841)

MSG:
RCVMSG MSGTYPE(*ANY) MSGDTA(&MSGDTA) MSGID(&MSGID)
IF COMD(%SST(&MSGID 1 3)) *NE 'CPF') THEN(GOTO CMDLBL(MSG))
SNDPGMMSG MSGID(&MSGID) MSGF(QCPFMSG) MSGDTA(&MSGDTA) MSGTYPE(*STATUS) TOPGMQ(*EXT)

END:
ENDPGM
以下是显示信息的显示文件DDS的一部分:

 A          R MSG                       SFL
 A                                      SFLMSGRCD(24)
 A            S0MSGK                    SFLMSGKEY
 A            S0PGMQ                    SFLPGMQ
 A          R MSGCTL                    SFLCTL(MSG)
 A                                      OVERLAY
 A                                      SFLDSP
 A                                      SFLINZ
 A                                      SFLSIZ(0005)
 A                                      SFLPAG(0001)
 A            S0PGMQ                    SFLPGMQ
假设没有基于查询字符串的匹配记录,则RCVF导致发送CPF0864,并且该消息可以毫无问题地显示在屏幕上


但如果在RTVDTAARA命令中找到记录并使用字段值,且该命令失败(例如,未找到数据区)将导致上述问题,即接收到的消息只能在短时间内瞥见,然后消失。为什么会发生这种情况?

典型的顺序是

write msgctl
write bottom
exfmt main
write msgctl
write bottom
exfmt main
确保已指定消息子文件后显示的任何记录格式。如果没有覆盖,“bottom”将删除消息子文件,“main”将删除“bottom”

是一个古老但有用的参考资料

查看CL和DDS后进行编辑

我认为问题是由于
SNDPGMMSG MSGTYPE(*状态)
造成的。状态消息是特殊的,通常不会进入子文件消息队列。信息中心中的部分提供了有关不同消息类型的更多信息


在CL PGMB中,将SNDPGMMSG更改为
MSGTYPE(*DIAG)TOPGMQ(*PRV)
。这将把异常消息作为诊断消息抛出给调用方(到PGMA)。仔细检查DDS中需要覆盖的地方是否有覆盖-我上面的示例是底部和主要部分。

此顺序起作用,并在屏幕上显示消息子文件的消息


典型的序列是

write msgctl
write bottom
exfmt main
write msgctl
write bottom
exfmt main
确保已指定消息子文件后显示的任何记录格式。如果没有覆盖,“bottom”将删除消息子文件,“main”将删除“bottom”。
c

我对程序做了更多的测试,问题比我想象的要复杂。我已经更新了问题。请看一下。显示文件DDS已发布。请检查。请张贴显示文件的代码。