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