0

我有一个 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命令中使用了字段值,而这个命令的失败(例如data area not found)会导致我上面描述的问题,就是接收到的消息只能在一个短时间然后消失。为什么会发生这种情况?

4

2 回答 2

1

典型的顺序是

write msgctl
write bottom
exfmt main

确保在消息子文件之后显示的任何记录格式都指定了 OVERLAY。如果没有 OVERLAY,'bottom' 将擦除消息子文件,而 'main' 将擦除 'bottom'。

应用显示编程是一个古老但有用的参考。

编辑在看到 CL 和 DDS 之后。

我相信这个问题是由于SNDPGMMSG MSGTYPE(*STATUS). 状态消息是特殊的,通常不会进入子文件消息队列。信息中心的消息部分包含有关不同消息类型的更多信息。

在 CL PGMB 中,将 SNDPMMSG 更改为MSGTYPE(*DIAG) TOPGMQ(*PRV). 这会将异常消息作为诊断消息抛出给调用者(给 PGMA)。仔细检查您在需要它的 DDS 中是否有 OVERLAY - 我上面的示例将是底部和主要。

于 2012-10-09T16:23:22.153 回答
-1

该序列起作用并在屏幕上显示消息子文件的消息

典型的顺序是

write msgctl
write bottom
exfmt main

确保在消息子文件之后显示的任何记录格式都指定了 OVERLAY。如果没有 OVERLAY,'bottom' 将擦除消息子文件,而 'main' 将擦除 'bottom'。C

于 2013-11-08T20:25:53.643 回答