2012-10-08 175 views
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命令中找到記錄並使用字段值,並且此命令失敗(例如未找到數據區域)將導致我上面描述的問題,即接收到的消息只能在短時間內瞥見,然後消失。爲什麼會發生?

+0

請發佈顯示文件的代碼。 –

回答

1

的典型順序是

write msgctl 
write bottom 
exfmt main 

確保信息子文件具有指定OVERLAY之後的任何記錄格式顯示。沒有OVERLAY,'底部'將刪除消息子文件,'main'將刪除'底部'。

Application Display Programming是一個古老而有用的參考。

編輯看到CL和DDS後。

我認爲這個問題是由於SNDPGMMSG MSGTYPE(*STATUS)。狀態消息是特殊的,通常不會進入子文件消息隊列。 Infocenter中的Messages部分提供了有關不同消息類型的更多信息。

在CL PGMB中,將SNDPGMMSG更改爲MSGTYPE(*DIAG) TOPGMQ(*PRV)。這會將異常消息作爲診斷消息發送給調用者(至PGMA)。仔細檢查你的DDS中是否有OVERLAY,在你需要它的地方 - 我上面的例子將會是底層和主要的。

+0

我已經對該程序做了更多的測試,問題比我想象的更復雜。我已經更新了這個問題。請看一下。 –

+0

顯示文件DDS張貼。請檢查。 –

-1

這個序列工作,並在屏幕

上顯示消息的子文件的消息的典型順序是

write msgctl 
write bottom 
exfmt main 

確保信息子文件具有指定OVERLAY之後的任何記錄格式顯示。沒有OVERLAY,'底部'將刪除消息子文件,'main'將刪除'底部'。 c