ILE RPG の中からメッセージを出力させる

System API を使った RPG のプログラムなどで、メッセージを出力したいことがあります。

今回は、そんな時に ILE RPG から SNDPGMMSG コマンドのようにメッセージを出す方法を見てみましょう。


今回は「ジョブの実行 SQL (可変長) とその状況およびジョブ実行状況の収集 (V5R4)」での ILE RPG プログラムを例にとって紹介してみたいと思います。

API のエラーに応じてメッセージを出したい場合は、エラーを受け取るためのデータ構造を利用できます。

ジョブの実行 SQL (可変長) とその状況およびジョブ実行状況の収集 (V5R4)」の ILE RPG プログラムで言えば、↓の部分にあたります。

     D ERRC0100        Ds                  Qualified                                                
     D  BytPro                       10i 0 Inz( %Size( ERRC0100 ))                                  
     D  BytAvl                       10i 0 Inz                                                      
     D  MsgId                         7a                                                            
     D                                1a                                                            
     D  MsgDta                      128a            

↑の戻りエラー用のデータ構造の内容を見て対応を取れば、CL プログラムでの MONMSG のようなことができるわけです。

SNDPGMMSG コマンドに相当するような System API もあります。

QMHSNDPM といいます。

↓のようにプロトタイプで登録して、

     D SndPgmMsg       PR                  EXTPGM('QMHSNDPM')                                       
     D  MsgID                         7a   Const                                                    
     D  QualMsgF                     20a   Const                                                    
     D  MsgDta                      256a   Const                                                    
     D  MsgDtaLen                    10i 0 Const                                                    
     D  MsgType                      10a   Const                                                    
     D  CallStkEntry                 10a   Const                                                    
     D  CallStkCount                 10i 0 Const                                                    
     D  MsgKey                        4a   Const                                                    
     D  ErrorCode                          like(ERRC0100)                                           
      *                                                                                             
     D MsgKey          S              4a                   

あたかも SNDPGMMSG コマンドのようにして使用できます。

              if ERRC0100.MsgId <> '' ;                                                             
                 SndPgmMsg( ERRC0100.msgid                                                          
                          : 'QCPFMSG   *LIBL'                                                       
                          : %trimR(%trim(ERRC0100.msgdta))                                          
                          : %len(%trimR(%trim(ERRC0100.msgdta)))                                    
                          : '*COMP'                                                                 
                          : '*EXT'                                                                  
                          : 1                                                                       
                          : MsgKey                                                                  
                          : ERRC0100 );                                                             
                 return ;                                                                           
              endif ;                                                                               

ただし、必ずしも事前に想像しているとおり(?!)にメッセージが出力されるとは限りませんので、考慮が必要になる場合はあります。

たとえば、ほとんどの場合、RPG プログラムはそれを呼び出す CL プログラムとセットになっていますね。
今回の「ジョブの実行 SQL (可変長) とその状況およびジョブ実行状況の収集 (V5R4)」の ILE RPG プログラムも同様です。

この CL プログラムにセットアップ/エラーチェックの役割を持たせるようにすれば、System API を使うプログラム側での負担が減るわけです。

実は、このエラーチェックが↓の処理なんです。

             DSPJOBLOG  JOB(&NBR/&USR/&JOB) OUTPUT(*PRINT)                      
             MONMSG     MSGID(CPF1070) EXEC(DO)                                 
             RCVMSG     MSGDTA(&MSGDTA)                                         
             SNDPGMMSG  MSGID(CPF1070) MSGF(QCPFMSG) MSGDTA(&MSGDTA)            
             GOTO       CMDLBL(RETURN)                                          
             ENDDO                                                              

System API でチェックする対象のジョブがそもそも存在していなかった場合、当然正しい結果は返ってきません。

System API の実行時にいきなりチェックして、RPG の中でエラー処理を行ったり、メッセージを出したりするよりは、せっかく CL プログラムから呼んでいるわけで、さらに言えばそうした処理は MONMSG コマンドや SNDPGMMSG コマンドなどのおかげで CL プログラムの方が得意なわけですから、そちらであらかじめチェックしておいた方が手間が省けますよね。

今回の「ジョブの実行 SQL (可変長) とその状況およびジョブ実行状況の収集 (V5R4)」の例で言えば、もともとジョブ情報を集めるためのツールなので、ジョブログを出力させておくのは特別不思議なことではありません。
ジョブの存在チェックも兼ねて、この処理を行っているんですね。

[Top Pageに戻る]

Ads by TOK2