0

RPG プログラム A と CL プログラム B があります。A は表示ファイルからユーザー入力を受け取り、それを 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 コマンドで使用された場合、このコマンドの失敗 (データ領域が見つからないなど) により、上で説明した問題が発生します。短時間で消えます。なぜこれが起こるのですか?

4

2 に答える 2

1

典型的なシーケンスは

write msgctl
write bottom
exfmt main

メッセージ・サブファイルの後に表示されるレコード様式に OVERLAY が指定されていることを確認してください。OVERLAY がない場合、'bottom' はメッセージ サブファイルを消去し、'main' は 'bottom' を消去します。

Application Display Programmingは古いものですが、役に立つリファレンスです。

EDIT CLとDDSを見た後。

問題の原因はSNDPGMMSG MSGTYPE(*STATUS). 状況メッセージは特殊で、通常はサブファイル・メッセージ待ち行列に入りません。Infocenter のMessagesセクションには、さまざまなメッセージ タイプに関する詳細情報があります。

CL PGMB で、SNDPGMMSG を に変更しMSGTYPE(*DIAG) TOPGMQ(*PRV)ます。これにより、呼び出し元 (PGMA) に診断メッセージとして例外メッセージがスローされます。DDS の必要な場所に OVERLAY があることを再確認してください。上記の例は、一番下とメインになります。

于 2012-10-09T16:23:22.153 に答える