CL

153. 本当のメッセージを表示するには

CLPでエラーが発生したときにエラー・メッセージをRCVMSGで取得しい
エンド・ユーザーに表示する処理はよくあることである。

例えば

ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) KEYVAR(&MSGKEY) +    
                         MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +
                         SNDMSGFLIB(&MSGFLIB)                       

のようにしてエラー・メッセージを取得して

            SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + 
                         MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) +  
                         MSGTYPE(&MSGTYPE)                  

のようにしてメッセージを表示するようにすることが多い。
ところが

 CRTCLPGM QTROBJ/ANS001CD SRCFILE(QTRSRC/QCLSRC AUT(*ALL)

という存在しないメンバー: ANS001CD のコンパイルを実行しようとすると

「プログラム ANS001CD は作成されなかった。」
というメッセージが出力されてしまいます。
そこで F10キーを押してロー・レベル・メッセージを探すと

メンバー ANS001CD を含むファイル QCLSRC がライブラリー QTRSRCに見つからない。

というメッセージが最初のほうに見つかり、実はこれが最初のメッセージである。

  1. 「メンバー ANS001CD を含むファイル QCLSRC がライブラリー QTRSRCに見つからない。」
:

2. 「プログラム ANS001CD は作成されなかった。」

という順序でメッセージは出力されている。

多くの IBM iのメッセージ出力では最後のメッセージだけが
結果として表示されてしまうのでF10キーを押してロー・レベル・メッセージを
検索する作業がいつも必要になっている。
実は多くのサンプルCLPでは

 RCVMSG     MSGTYPE(*LAST)

と最後のメッセージ、つまりこの場合で言えば

 「プログラム ANS001CD は作成されなかった。」

というメッセージを取得するような処理となってしまってたいるので
本当の原因となるメッセージを探るためにF10キーを押すといあう操作が
必要となってしまう。
これを

  RCVMSG     MSGTYPE(*FIRST)

としておけば取得されるメッセージは

 メンバー ANS001CD を含むファイル QCLSRC がライブラリー QTRSRCに見つからない。

とういうメッセージが取得されて表示される。
社内のCLPも RCVMSG MSGTYPE(*LAST) ではなく MSGTYPE(*FIRST)
めっせーじを受取るようにすれば真の原因となっているメッセージが
いつも表示されるようになるはずある。
もちろんエラーのときだけでなく成功したときのメッセージの受取りも *FIRST でよい。