ILE CL が通知および状況メッセージを監視する際の問題
ILE RPG プロシージャーが同一活動化グループ内の ILE CL プロシージャーに よって呼び出される時に、呼び出し元が状況メッセージまたは通知メッセージについて 監視している場合には、ILE CL の呼び出し元は、この ILE RPG プロシージャー が無視しようとしていた通知メッセージまたは状況メッセージにより、 制御権を得る場合があります。
例えば、ILE RPG プロシージャーがプリンター・ファイルにレコードを書き込む ときに、実際のプリンター・ファイルのレコード長が、RPG プロシージャーで 宣言された短いレコード長である場合には、通知メッセージ CPF4906 が RPG プロシージャーに送られます。 RPG 例外処理はこのメッセージをパーコレートするため、 デフォルト応答の 'I' がこのメッセージを無視します。 これを使用すると、出力操作が正常に続行され、 RPG プロシージャーが次の命令に進みます。
この問題は、多くの場合 ILE CL 呼び出し元の MONMSG で発生しますが、 CEEHDLR を使用して使用可能になっている ILE 条件処理プログラムを 使用する ILE RPG を含めて、通知メッセージと状況メッセージを 監視できる、他の ILE 言語でも生じる可能性があります。
- 呼び出し元が ILE RPG プロシージャーとは異なる活動化グループに あるようにする。
- RPG プロシージャーで ILE 条件処理プログラムを使用可能にする。 処理プログラムでは、無視したいメッセージであれば、このメッセージを処理するように指定してください。 そうでない場合には、パーコレートを指定します。
この処理プログラムの汎用性を高めて、重大度 0 (通知) と重大度 1 (警告) の メッセージをすべて無視するようにすることもできます。
図 1 は、CPF4906 を無視する ILE 条件処理プログラムの 例を示します。
図 1. 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図 2 は、すべての状況および通知メッセージを無視する場合に 演算をコーディングする方法を示します。 エスケープ・メッセージおよびファンクション・チェックは 重大度 2 以上になります。
図 2. 状況および通知メッセージを無視する方法*---------------------------------------------------------------- * 情報メッセージまたは警告メッセージを処理、それ以外は * パーコレート *---------------------------------------------------------------- C IF MsgSev <= Warning C EVAL Action = Handle C ELSE C EVAL Action = Percolate C ENDIF C RETURN