我有一个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命令中使用了字段值,并且该命令的失败(例如,未找到数据区域)将导致我上面描述的问题,即接收的消息只能是在短时间内瞥见然后消失。为什么会这样?
答案 0 :(得分:1)
典型的序列是
write msgctl
write bottom
exfmt main
确保在消息子文件之后显示的任何记录格式都指定了OVERLAY。如果没有OVERLAY,'bottom'将删除消息子文件,'main'将删除'bottom'。
Application Display Programming是一个古老但有用的参考资料。
编辑看到CL和DDS后。
我认为问题归因于SNDPGMMSG MSGTYPE(*STATUS)
。状态消息是特殊的,通常不会进入子文件消息队列。信息中心的Messages部分提供了有关不同消息类型的更多信息。
在CL PGMB中,将SNDPGMMSG更改为MSGTYPE(*DIAG) TOPGMQ(*PRV)
。这会将异常消息作为诊断消息抛给调用者(到PGMA)。仔细检查你在DDS中你需要它的OVERLAY - 我上面的例子是底部和主要的。
答案 1 :(得分:-1)
此序列有效,并在屏幕上显示message-subfile的消息
典型的序列是
write msgctl
write bottom
exfmt main
确保在消息子文件之后显示的任何记录格式都指定了OVERLAY。如果没有OVERLAY,'bottom'将删除消息子文件,'main'将删除'bottom'。 ç