メッセージ・モニター (MONMSG)
実行可能場所:
|
パラメーター 例 エラー・メッセージ |
メッセージ・モニター(MONMSG)コマンドは,このコマンドが使用されているプログラムのプログラム・メッセージ待ち行列に送られるエスケープ・メッセージ,通知メッセージ,および状況メッセージをモニターするために使用されます。その他のメッセージ・タイプ(完了,診断など)はモニターできません。
MONMSGコマンドを制御言語(CL)プログラムでコンパイルする時に,指定されたメッセージの到着用モニターが確立されます。コマンドは,コマンドに指定された比較データによって指定された条件のメッセージをモニターします。その条件を満たすメッセージがメッセージ待ち行列に到着すると,MONMSGコマンドに指定されたCLコマンドが処理されます。
最大1000のMONMSGコマンドをプログラムに指定して,特定の条件または条件のグループのメッセージの到着をモニターすることができます。特定のメッセージID,または総称のメッセージIDをモニターすることができます。
MONMSGコマンドは,CLプログラムまたはILE CLプロシージャーのほとんどのコマンドの後にコーディングすることができます。プログラムの始めではない個所に入れたMONMSGコマンドは,その直前のコマンドにだけ適用され,これはコマンド・レベルのMONMSGコマンドと呼ばれます。コマンド・レベルのMONMSGコマンドはその前のコマンドによって送信されたメッセージだけをモニターします。そのコマンドによって送信されたメッセージがMONMSGコマンドに指定された条件を満たした場合には,同じMONMSGコマンドに指定された処置が取られます。100のMONMSGコマンドをあるコマンドの直後にコーディングして,そのコマンドが送信したメッセージをモニターすることができます。
MONMSGコマンドに指定された処置が実行されて,その処置がGOTOまたはRETURNコマンドで終了していない場合には,メッセージを送信したコマンドの後にあるプログラムのコマンドに制御が戻ります。その処置がGOTOコマンドで終了した場合には,GOTOコマンドに指定されたプログラムのコマンドに制御が分岐します。処置がRETURNコマンドで終了した場合には,MONMSGコマンドが入っているプログラムを呼び出したプログラムに制御が戻されます。
1つ以上のMONMSGコマンドがプログラムの始めの宣言コマンド,または宣言コマンドがないPGMコマンド,の直後に入れられた場合には,これらのコマンドは,プログラムのすべてのコマンド(最大100)によって送信されたメッセージをモニターします。これはプログラム・レベルのMONMSGコマンドと呼ばれます。そのプログラムのコマンドによって送信されたメッセージが,プログラム・レベルのMONMSGコマンドの1つに指定された条件を満たした場合には,同じコマンドに指定された対応の処置が取られます。
コマンド・レベルのMONMSGコマンドによって取られる処置は,プログラム・レベルのMONMSGコマンドを一時変更します。
プログラムの始めに入れられるMONMSGコマンドのEXECパラメーターに対して,コマンドをコーディングした場合には,使用可能となるのはGOTOコマンドだけであり,モニターされたメッセージが発生した場合に制御を移す先のコマンドのレベルを指定しなければなりません。プログラム・レベルMONMSGコマンドで指定するラベルは,サブルーチンに関連したラベルとすることはできません。GOTOコマンドがプログラム・レベルMONMSGに実行されると,次のサブルーチン呼び出し(CALLSUBR)コマンドでサブルーチン・スタックがリセットされます。
EXECパラメーターにコマンドがコーディングされない場合には,モニターされたメッセージは無視されます。
制約事項:
- このコマンドはCLプログラムまたはILE CLプロシージャー内でのみ有効です。
- これは,最後の宣言コマンドの後(宣言コマンドを使用する場合),プログラムを開始するPGMコマンドに続いてコーディングするか,CLプログラムまたはILE CLプロシージャーで使用できるコマンドに続いてコーディングすることができます。ただしDO, DOWHILE, DOUNTIL, DOFOR, ELSE, ENDDO, SELECT, WHEN, OTHERWISE, ENDSELECT, ENDPGM, CALLSUBR, SUBR, RTNSUBR, ENDSUBR, GOTO, IF,またはRETURNは除きます。別のプログラムがこのコマンドによってモニターされるメッセージを送信した場合には,そのプログラムに戻ることができないことに注意してください。
| 上 |
パラメーター
| キーワード | 記述 | 選択項目 | ノーツ |
|---|---|---|---|
| MSGID | メッセージID | 値 (最大 50 回の繰り返し): 名前 | 必須, 定位置 1 |
| CMPDTA | 比較データ | 文字値, *NONE | オプショナル, 定位置 2 |
| EXEC | 実行するコマンド | コマンド・ストリング | オプショナル, 定位置 3 |
| 上 |
メッセージID (MSGID)
このコマンドによりモニターする1つ以上のエスケープ・メッセージ,通知メッセージ,または状況メッセージのメッセージIDを指定します。1つのコマンドで,特定のメッセージIDまたは総称メッセージIDを最大50個まで指定することができます。
注: 多くのCLコマンドが多くの異なったエラー条件に対して1つのエスケープ・メッセージを出します。エラーまたは障害に関する詳細は,エスケープ・メッセージの前にある診断メッセージ中に指定されます。診断メッセージをモニターすることはできませんが,エスケープ・メッセージは,ユーザーのメッセージ・モニターが活動化された後に,ジョブの外部メッセージ待ち行列からこれを受信することができます。
メッセージIDの最初の3文字は,英字1文字と,これに続く2桁の英数字(英字または数字)で構成されたコードでなければなりません。最後の4文字は,10進数の0から9および文字AからFで構成することができます。
注: MCHコード(MCHNNNN)を使用するメッセージIDでは,最後の4桁に0から9の数値だけを使用します。
右端の2桁または4桁すべてにゼロを指定した(USRMM00など)場合には,総称メッセージIDが指定されます。例えば,CPF0000が指定された場合は,接頭部'CPF'を持つすべてのメッセージがモニターされます。総称メッセージIDは,コマンド・レベルのMONMSGステートメントとプロシージャー・レベルのMONMSGステートメントの両方に使用することができます。
メッセージがこのプログラムのメッセージ待ち行列に到着した時にモニターされる1から50のメッセージのメッセージIDを指定します。コマンドが出すエスケープ,通知,および状況メッセージのメッセージIDとメッセージ・テキストは,INFORMATION CENTERにある当該コマンドの資料に記載されています。もちろん,当該コマンドのオンライン・ヘルプにも入っています。CL変数を使用してメッセージIDを指定することはできません。
これは必須パラメーターです。
| 上 |
比較データ (CMPDTA)
プログラムのメッセージ待ち行列で受け取るモニター対象メッセージ(指定したメッセージIDのどれかに該当するもの)を,このコマンドにより処置するかどうかを決めるために使用する比較データを指定します。プログラム・メッセージ送出し(SNDPGMMSG)コマンドのMSGDTAパラメーターに指定されたメッセージ・データと,比較データが比較されます。メッセージ置き換え値の最初の部分(最初の28桁まで,またはそれ以下)が,指定された比較データと一致した場合には,このコマンドのEXECパラメーターに指定された処置が取られます。比較データが指定されていない場合にも処置が行われます。
- *NONE
- 比較データは指定されません。プログラムのメッセージ待ち行列のメッセージが,このコマンドがモニターしているコマンドからのものである場合で,さらに,指定されたIDがある場合には,実行するコマンド (EXEC)パラメーターに指定された処置が取られます。
- 比較データ
- 28文字以下の文字ストリングを,必要ならばアポストロフィで囲んで指定してください。指定した文字ストリングは,受信したメッセージに含まれるメッセージ・データの最初の文字以降の同数の文字と比較されます。比較データが受信したメッセージ・データの最初の部分と一致した場合には,このコマンドは,EXECパラメーターに指定された機能を実行します。比較データに対してCL変数を指定することはできません。
比較データは,プログラム変数表示(DSPPGMVAR)コマンドを使用して表示することができます。
| 上 |
実行するコマンド (EXEC)
プログラムのメッセージ待ち行列に送られてきたモニター対象メッセージが,このコマンドで指定した条件を満たしていた場合に処理されるCLコマンドを指定します。コマンドを指定しなかった場合には,モニター対象メッセージが待ち行列に送られてきても,そのメッセージは無視され,プログラム中の次のコマンドに制御が渡されます。
プログラムの始めにMONMSGコマンドがある場合には,EXECパラメーターでGOTOコマンドおよび制御権を受け取るコマンドを識別するラベルを指定しなければなりません。
このコマンドに指定された条件を満たすメッセージを受信した時に実行される,CLコマンドを,使用されるそのパラメーターも含めて指定します。受信したメッセージが指定された条件を満たしていない場合には,指定されたコマンドは実行されません。CLコマンドの代わりに,CL変数を指定することはできません。
注: EXECにDO, DOWHILE, DOUNTIL, DOFOR,またはSELECTコマンドが指定されている場合は,条件が満たされると,そのコマンドと関連したグループ全体が処理されます。
| 上 |
例
例1:任意のコマンドから送られてくるメッセージのモニター
PGM MONMSG MSGID(CPF0001 CPF1999) EXEC(GOTO EXIT2)
この例は,CLプロシージャーの始めに置かれて,メッセージCPF0001およびCPF1999をモニターするMONMSGコマンドを示しています。これらのメッセージは,プロシージャーの後の方で処理されるコマンドから送られてくる可能性があるものです。プロシージャーで実行中のいずれかのコマンドからどちらかのメッセージを受け取ると,ラベルEXIT2で識別されるコマンドに制御権が分岐します。
CPF0001は,メッセージ自身の中で識別されるコマンドでエラーが見つかったことを示すメッセージです。CPF1999は,多数のデバッグ・コマンド(CHGPGMVARなど)から送られてくる可能性があるメッセージで,コマンドでエラーが発生したが,メッセージの中ではコマンドを識別しないことを示すものです。
例2:単一のコマンドから送られてくるメッセージのモニター
CHGVAR VAR(&A) VALUE(&A / &B) MONMSG MSGID(MCH1211) EXEC(CHGVAR VAR(&A) VALUE(1))
この例では,MONMSGコマンドは変数変更(CHGVAR)コマンドの後にあるので,CHGVARコマンドから送られてくるメッセージのみをモニターします。ゼロによる除算が試みられると,エスケープ・メッセージMCH1211がこのプログラムのメッセージ待ち行列に送られます。MSGID(MCH1211)が指定されているので,MONMSGコマンドはこの条件をモニターし,メッセージを受け取ると,2番目のCHGVARコマンドが処理されます。この例では,変数&Aの値は1に設定されます。
| 上 |
エラー・メッセージ
なし
| 上 |