%TARGET (プログラムまたはプロシージャー (program-or-procedure) { : offset } )
%TARGET は、 SND-MSG 操作の第 3 オペランドとして使用されます。 %TARGET は値を返しません。また、 SND-MSG 操作以外の場所に値を指定することはできません。
%TARGET は、メッセージのターゲット・プログラムまたはプロシージャーを指定します。
- *SELF。 これは、通知メッセージのデフォルトです。 メッセージは現行プロシージャーに送られます。
- *CALLER。 これは、エスケープ・メッセージ、完了メッセージ、診断メッセージ、通知メッセージ、または状況メッセージのデフォルトです。 メッセージは現行プロシージャーの呼び出し元に送られます。
- *CTLBDY。 これは制御境界を表し、 SND-MSG 操作を含む手続きと同じ活性化グループに属するコールスタック上の手続き群の最初の処理です。
例えば、次のプログラムスタックを考えてみましょう。 PROC1 が PROC2 を呼び出し、それが PROC3 を呼び出し、以下同様です。 PROC5 が %TARGET(*CTLBDY) を含むメッセージを送信した場合、メッセージは PROC3 に送信されます。これは、アクティベーショングループ AG1 に属する連続したグループの最初の処理手順であるためです。 手順 PROC1 はアクティベーショングループ AG1 にも含まれますが、手順 PROC2 は別のアクティベーショングループに属しているため、 PROC1 は PROC5 の管理境界を決定する際に考慮されません。
手順 活動化グループ PROC1 AG1 PROC2 AG2 PROC3 AG1 PROC4 AG1 PROC5 AG1 - *EXT。 これは、外部メッセージ・キューを表します。 メッセージ・タイプが *STATUSの場合、メッセージは画面の下部に表示されます。 例については、 メッセージ・タイプ *STATUS および %TARGET (*EXT) の画面の下部に進行状況メッセージを表示する例 を参照してください。 *EXT は、 SND-MSG のメッセージ・タイプ・オペランドが *ESCAPEの場合は指定できません。
- *PGMBDY。 これはプログラム境界を表し、 SND-MSG 操作を含む手続きと同じプログラムまたはサービスプログラムにあるコールスタック上の手続き群の最初のプロシージャです。
例えば、次のプログラムスタックを考えてみましょう。 PROC1 が PROC2 を呼び出し、それが PROC3 を呼び出し、以下同様です。 PROC5 が %TARGET(*PGMBDY) を含むメッセージを送信した場合、メッセージは PROC3 に送信されます。これは、 PGM1 および PROC5 と同じプログラムまたはサービスプログラム内の連続した手順群における最初の処理手順であるためです。 手順 PROC1 はプログラムまたはサービスプログラム PGM1 にも含まれますが、手順 PROC2 は別のプログラムであるため、 PROC1 は PROC5 のプログラム境界を決定する際に考慮されません。
手順 プログラムまたはサービスプログラム PROC1 PGM1 PROC2 PGM2 PROC3 PGM1 PROC4 PGM1 PROC5 PGM1 - プログラム・スタック上のプログラムまたはプロシージャーの名前。 これはジョブ CCSID の文字値でなければなりません。注: プログラムまたはプロシージャーは、現行プロシージャーより前に呼び出され、その呼び出しからまだ戻っていない場合、プログラム・スタック上にあります。
- これはオプションです。 指定しない場合は、デフォルトのゼロが使用されます。
- 第 1 オペランドに *EXT が指定されている場合には, これを使用することはできません。
- 小数点以下の桁数がゼロの数値でなければなりません。 値を負の値にすることはできません。
現行プロシージャーがプログラムのメイン・プロシージャーではなく、メッセージをプログラムの呼び出し側に送信したい場合は、 %TARGET の第 1 オペランドに *PGMBDY を指定し、第 2 オペランドに値 1 を指定します。
呼び出しスタック上の別のプロシージャーにメッセージを送信する %TARGET の例
以下の例では、RPG プログラマーのアプリケーションで、CL プログラム MYCLPGM が RPG プログラム RPGMAINを呼び出し、このプログラムが RPG プログラム RPGSUB1を呼び出します。 RPGSUB1内で、メイン・プロシージャーは subProc2を呼び出す subProc1を呼び出します。 プロシージャー subProc2 は、 subProc3を呼び出す RPG プログラム RPGSUBPGM2 を呼び出します。 プログラム RPGMAIN は活動化グループ AG1 にあり、その他のプログラムは活動化グループ ACTGRP2にあります。
subProc3 が実行されている場合、以下はジョブの呼び出しスタックを表します。 呼び出しスタックは、パラメーター OPTION (*PGMSTK)を指定した DSPJOB コマンドを使用して確認できます。
| プログラム | ライブラリー | 手順 | 活動化グループ |
|---|---|---|---|
| MYCLPGM (プログラム名) | MYLIB | ||
| RPGMAIN (R) | MYLIB | QRNP_PEP_RPGMAIN | AG1 |
| RPGMAIN (R) | MYLIB | RPGMAIN (R) | AG1 |
| RPGSUB1 | MYLIB | _QRNP_PEP_RPGSUB1 | ACTGRP2 |
| RPGSUB1 | MYLIB | RPGSUB1 | ACTGRP2 |
| RPGSUB1 | MYLIB | subProc1 | ACTGRP2 |
| RPGSUB1 | MYLIB | subProc2 | ACTGRP2 |
| RPGSUBPGM2 | MYLIB | _QRNP_PEP_RPGSUBPGM2 | ACTGRP2 |
| RPGSUBPGM2 | MYLIB | RPGSUBPGM2 | ACTGRP2 |
| RPGSUBPGM2 | MYLIB | subProc3 | ACTGRP2 |
プロシージャー subProc2 には、いくつかの SND-MSG 操作があります。
- メッセージ・タイプが指定されておらず、 %TARGET も指定されていません。 省略時のメッセージ・タイプは *INFO なので, 通知メッセージが送られます。 通知メッセージのデフォルトのターゲット・プロシージャーは、現行のプロシージャーです。 メッセージは subProc2 からそれ自体に送信されます。
SND-MSG 'Msg 1'; - SND-MSG 操作は前の操作と同じですが、メッセージ・タイプとターゲットが明示的に指定されています。 メッセージは subProc2 からそれ自体に送信されます。
SND-MSG *INFO 'Msg 2' %TARGET(*SELF); - SND-MSG 命令は前の命令と似ていますが、ターゲット・プロシージャーは現行プロシージャーの呼び出し元です。 メッセージは subProc2 から subProc1に送信されます。
ND-MSG 'Msg 3' %TARGET(*CALLER); - メッセージ・タイプは *ESCAPEであるため、例外メッセージが送信されます。 例外メッセージのデフォルトのターゲット・プロシージャーは、現行プロシージャーの呼び出し元です。 メッセージは、 subProc2 からその呼び出し元 subProc1に送信されます。
SND-MSG *ESCAPE 'Msg 4'; - SND-MSG 命令は前の命令と似ていますが、 %TARGET の 2 番目のオペランドが 1 に設定されています。これは、ターゲット・プロシージャーが %TARGETの第 1 オペランドで指定されたプロシージャーの呼び出し元であることを示しています。 メッセージは、 subProc2 からその呼び出し側の呼び出し側 RPGSUB1に送信されます。
SND-MSG *ESCAPE 'Msg 5' %TARGET(*CALLER : 1); - SND-MSG 命令は前のオペランドと似ていますが、 %TARGET の 2 番目のオペランドは 2 に設定されています。これは、ターゲット・プロシージャーが、 %TARGETの第 1 オペランドで指定されたプロシージャーより上の 2 つの呼び出しレベルであることを示しています。 メッセージは subProc2 から _QRNP_PEP_RPGSUB1に送信されます。 RPGMAIN が意図したターゲット・プロシージャーである場合は、プログラム・スタック上にプログラム入力プロシージャー _QRNP_PEP_RPGSUB1 が存在することを考慮して、スタック・オフセットに値 3 を指定する必要があります。
SND-MSG *ESCAPE 'Msg 6' %TARGET(*CALLER : 2); - SND-MSG 命令は、 RPGMAIN プログラムを呼び出すプログラムまたはプロシージャーを対象としています。 しかし、呼び出しスタックは、 RPGMAIN の呼び出し側がプログラム _QRNP_PEP_RPGMAINのプログラム入り口プロシージャー (PEP) であることを示しています。 %TARGET のオフセットは、すべての PEP プロシージャーを考慮する必要があります。 メッセージは subProc2 から MYCLPGMに送信されます。
SND-MSG *INFO 'Msg 7' %TARGET('RPGMAIN' : 2);
プログラム RPGSUBPGM2 のプロシージャー subProc3 には、いくつかの SND-MSG 命令があります。
- SND-MSG 命令は、現行プログラムを呼び出すプログラムまたはプロシージャーに完了メッセージを送信するためのものです。 プロシージャー RPGSUBPGM2/subProc3の場合、*PGMBDY は _QRNP_PEP_SUBPGM2を表すため、スタック・オフセットに 1 が指定され、メッセージが subProc2に送信されます。
SND-MSG *COMP 'Msg 8' %TARGET(*PGMBDY : 1); - SND-MSG 操作は、現行の活動化グループ内の最初のプログラムを呼び出すプログラムまたはプロシージャーに診断メッセージを送信することを目的としています。 プロシージャー RPGSUBPGM2/subProc3 は活動化グループ ACTGRP2にあります。 同じ活動化グループを持つプログラム・スタック内の最初の項目は、 RPGSUB1/_QRNP_PEP_RPGSUB1です。 これは、ターゲット *CTLBDY によって表される制御境界です。 スタック・オフセットに 1 が指定されているため、メッセージが RPGMAINに送信されます。これは、制御境界にあるプロシージャーの呼び出し元です。
SND-MSG *DIAG 'Msg 9' %TARGET(*CTLBDY : 1);