ILE CL が通知および状況メッセージを監視する際の問題

ILE RPG プロシージャーが同一活動化グループ内の ILE CL プロシージャーに よって呼び出される時に、呼び出し元が状況メッセージまたは通知メッセージについて 監視している場合には、ILE CL の呼び出し元は、この ILE RPG プロシージャー が無視しようとしていた通知メッセージまたは状況メッセージにより、 制御権を得る場合があります。

例えば、ILE RPG プロシージャーがプリンター・ファイルにレコードを書き込む ときに、実際のプリンター・ファイルのレコード長が、RPG プロシージャーで 宣言された短いレコード長である場合には、通知メッセージ CPF4906 が RPG プロシージャーに送られます。 RPG 例外処理はこのメッセージをパーコレートするため、 デフォルト応答の 'I' がこのメッセージを無視します。 これを使用すると、出力操作が正常に続行され、 RPG プロシージャーが次の命令に進みます。

ただし、ILE CL MONMSG が制御を得ると、制御は、MONMSG の処置 または ILE CL プロシージャーの次のステートメントにただちに渡されます。

注:
この問題が生じる場合、メッセージを監視しているプロシージャーが、 RPG プロシージャーの直接の呼び出し元である必要はありません。

この問題は、多くの場合 ILE CL 呼び出し元の MONMSG で発生しますが、 CEEHDLR を使用して使用可能になっている ILE 条件処理プログラムを 使用する ILE RPG を含めて、通知メッセージと状況メッセージを 監視できる、他の ILE 言語でも生じる可能性があります。

この問題が検出される場合、これを避けるには次の 2 つの方法があります。

  1. 呼び出し元が ILE RPG プロシージャーとは異なる活動化グループに あるようにする。
  2. RPG プロシージャーで ILE 条件処理プログラムを使用可能にする。 処理プログラムでは、無視したいメッセージであれば、このメッセージを 処理するように指定してください。 そうでない場合には、パーコレートを指定します。

    この処理プログラムの汎用性を高めて、重大度 0 (通知) と重大度 1 (警告) の メッセージをすべて無視するようにすることもできます。

    図 141 は、CPF4906 を無視する ILE 条件処理プログラムの 例を示します。

    図 141. CPF4906 を無視する ILE 条件処理プログラム
          *----------------------------------------------------------------
          * 処理プログラム定義
          *----------------------------------------------------------------
         D Action          S             10I 0
         D Token           DS
         D   MsgSev                       5I 0
         D   MsgNo                        2A
         D                                1A
         D   Prefix                       3A
         D                                4A
          *----------------------------------------------------------------
          * 処置
          *----------------------------------------------------------------
         D Handle          C                   10
         D Percolate       C                   20
          *----------------------------------------------------------------
          * 重大度
          *----------------------------------------------------------------
         D Info            C                   0
         D Warning         C                   1
         D Error           C                   2
         D Severe          C                   3
         D Critical        C                   4
         C     *ENTRY        PLIST
         C                   PARM                    Token
         C                   PARM                    dummy             1
         C                   PARM                    Action
          *----------------------------------------------------------------
          * これが CPF4906 であれば通知メッセージを処理、それ以外は
          * パーコレート
          *----------------------------------------------------------------
         C                   IF        Prefix = 'CPF' AND
         C                             MsgNo = X'4906'
         C                   EVAL      Action = Handle
         C                   ELSE
         C                   EVAL      Action = Percolate
         C                   ENDIF
         C                   RETURN

    図 142 は、すべての状況および通知メッセージを無視する場合に 演算をコーディングする方法を示します。 エスケープ・メッセージおよびファンクション・チェックは 重大度 2 以上になります。

    図 142. 状況および通知メッセージを無視する方法
          *----------------------------------------------------------------
          * 情報メッセージまたは警告メッセージを処理、それ以外は
          * パーコレート
          *----------------------------------------------------------------
         C                   IF        MsgSev <= Warning
         C                   EVAL      Action = Handle
         C                   ELSE
         C                   EVAL      Action = Percolate
         C                   ENDIF
         C                   RETURN