%TARGET (プログラムまたはプロシージャー (program-or-procedure) { : offset } )

%TARGET は、 SND-MSG 操作の第 3 オペランドとして使用されます。 %TARGET は値を返しません。また、 SND-MSG 操作以外の場所に値を指定することはできません。

%TARGET は、メッセージのターゲット・プログラムまたはプロシージャーを指定します。

第 1 オペランドは、次のようになります。
  • *SELF。 これは、通知メッセージのデフォルトです。 メッセージは現行プロシージャーに送られます。
  • *CALLER。 これは、エスケープ・メッセージ、完了メッセージ、診断メッセージ、通知メッセージ、または状況メッセージのデフォルトです。 メッセージは現行プロシージャーの呼び出し元に送られます。
  • *CTLBDY。 これは、制御境界を表します。これは、 SND-MSG 命令を持つプロシージャーと同じ活動化グループ内にある、呼び出しスタック上の EARLIST プロシージャーです。
  • *EXT。 これは、外部メッセージ・キューを表します。 メッセージ・タイプが *STATUSの場合、メッセージは画面の下部に表示されます。 例については、 メッセージ・タイプ *STATUS および %TARGET (*EXT) の画面の下部に進行状況メッセージを表示する例 を参照してください。 *EXT は、 SND-MSG のメッセージ・タイプ・オペランドが *ESCAPEの場合は指定できません。
  • *PGMBDY。 これは、プログラム境界を表します。これは、 SND-MSG 命令を持つプロシージャーと同じプログラムまたはサービス・プログラム内にある、呼び出しスタック上の最新のプロシージャーです。
  • プログラム・スタック上のプログラムまたはプロシージャーの名前。 これはジョブ CCSID の文字値でなければなりません。
    注: プログラムまたはプロシージャーは、現行プロシージャーより前に呼び出され、その呼び出しからまだ戻っていない場合、プログラム・スタック上にあります。
第 2 オペランドは、プログラム・スタック上のオフセットです。 これは, 送信されるメッセージに指定されたプログラムまたはプロシージャーの前のプログラム・スタック上のプログラムまたはプロシージャーの数を表します。 例えば、 PROC1PROC2という名前で、 PROC2の呼び出し元にメッセージを送信する場合、 PROC2からオフセット 1 のプログラムまたはプロシージャーにメッセージを送信することを示す %TARGET('PROC2':1)を指定します。
  • これはオプションです。 指定しない場合は、デフォルトのゼロが使用されます。
  • 第 1 オペランドに *EXT が指定されている場合には, これを使用することはできません。
  • 小数点以下の桁数がゼロの数値でなければなりません。 値を負の値にすることはできません。
注: API QMHSNDPM は、メッセージの送信に使用されます。 メッセージの送信について詳しくは、 QMHSNDPM を参照してください。
注: 現行プロシージャーがプログラムのメイン・プロシージャーである場合、呼び出し側はそのプログラムのプログラム入り口プロシージャー (PEP) です。 プログラムの呼び出し側にメッセージを送信する場合は、 %TARGET の第 1 オペランドに *CALLER を指定し、 %TARGET の第 2 オペランドに値 1 を指定して、呼び出し側の呼び出し側にメッセージを送信することを示します。

現行プロシージャーがプログラムのメイン・プロシージャーではなく、メッセージをプログラムの呼び出し側に送信したい場合は、 %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);