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

时间:2012-10-08 08:22:09

标签: message ibm-midrange

我有一个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命令中使用了字段值,并且该命令的失败(例如,未找到数据区域)将导致我上面描述的问题,即接收的消息只能是在短时间内瞥见然后消失。为什么会这样?

2 个答案:

答案 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'。 ç