%TARGET (程序或过程 { : offset } )

%TARGET 用作 SND-MSG 操作的第三个操作数。 %TARGET 不会返回值,并且不能在除 SND-MSG 操作以外的任何位置指定该值。

%TARGET 指定消息的目标程序或过程。

第一个操作数可以是
  • *SELF。 这是参考消息的缺省值。 将消息发送到当前过程。
  • *CALLER。 这是转义,完成,诊断,通知或状态消息的缺省值。 将消息发送到当前过程的调用者。
  • *CTLBDY。 这表示控制边界,它是调用堆栈中与 SND-MSG 操作处于同一激活组的一组过程中的第一个过程。

    例如,考虑以下程序堆栈,其中 PROC1 调用 PROC2 , 调用 PROC3 ,以此类推。 如果 PROC5 发送给 %TARGET(*CTLBDY) 的消息,则该消息将发送给 PROC3 ,因为这是激活组 AG1 中连续操作组中的第一个操作。 过程 PROC1 也在激活组 AG1 中,但过程 PROC2 在另一个激活组中,因此在确定 PROC5 的控制边界时,不会考虑过程 PROC1

  • *EXT。 这表示外部消息队列。 当消息类型为 *STATUS时,消息将显示在屏幕底部。 请参阅 在屏幕底部显示消息类型为 *STATUS 和 %TARGET (*EXT) 的进度消息的示例 以获取示例。 当 SND-MSG 的消息类型操作数为 *ESCAPE时,不能指定 *EXT
  • *PGMBDY。 这表示程序边界,它是调用堆栈中与具有 SND-MSG 操作的过程位于同一程序或服务程序中的过程组中的第一个过程。

    例如,考虑以下程序堆栈,其中 PROC1 调用 PROC2 , 调用 PROC3 ,以此类推。 如果 PROC5 发送给 %TARGET(*PGMBDY) 的消息,该消息将发送给 PROC3 ,因为这是连续程序组中的第一个程序,该程序组中的所有程序都在同一程序或服务程序中, PGM1 ,如 PROC5 。 程序 PROC1 也在程序或服务程序 PGM1 中,但程序 PROC2 是另一个程序,因此在确定程序 PROC5 的边界时,不考虑程序 PROC1

  • 程序堆栈上程序或过程的名称。 它必须是作业 CCSID 中的字符值。
    注: 如果程序或过程是在当前过程之前调用的,并且尚未从该调用返回,那么该程序或过程位于程序堆栈上。
第二个操作数是程序堆栈上的偏移量。 它表示在要发送消息的指定程序或过程之前程序堆栈上的程序或过程数。 例如,如果 PROC1 调用了 PROC2,并且要将消息发送到 PROC2的调用者,请指定 %TARGET('PROC2':1),这表示要将消息发送到程序或过程,其偏移量为 1 from PROC2
  • 它是可选的。 如果未指定,那么缺省为零。
  • 如果对第一个操作数指定了 *EXT ,那么不允许该值。
  • 它必须是小数位数为零的数字值。 该值不能为负数。
注: API QMHSNDPM 用于发送消息。 有关发送消息的更多信息,请参阅 QMHSNDPM
注: 如果当前过程是程序的主过程,那么调用者是程序的程序入口过程 (PEP)。 如果要将消息发送到程序的调用者,请为 %TARGET 的第一个操作数指定 *CALLER ,并为 %TARGET 的第二个操作数指定值 1 ,以指示要将消息发送到调用者的调用者。

如果当前过程不是程序的主过程,并且要将消息发送至程序的调用者,请对 %TARGET 的第一个操作数指定 *PGMBDY ,并对第二个操作数指定值 1。

%TARGET 将消息发送到调用堆栈上的另一个过程的示例

对于以下示例,在 RPG 程序员的应用程序中, CL 程序 MYCLPGM 调用 RPG 程序 RPGMAIN,后者调用 RPG 程序 RPGSUB1。 在 RPGSUB1中,主过程调用 subProc1,后者调用 subProc2。 过程 subProc2 调用 RPG 程序 RPGSUBPGM2 ,该程序调用 subProc3。 程序 RPGMAIN 位于激活组 AG1 中,其他程序位于激活组 ACTGRP2中。

subProc3 正在运行时,以下内容表示作业的调用堆栈。 可以使用带有参数 OPTION (*PGMSTK)DSPJOB 命令来查看调用堆栈。

程序 过程 激活组
MYCLPGM 资料库    
RPGMAIN 资料库 _QQRNP_PEP_RPGMain AG1
RPGMAIN 资料库 RPGMAIN AG1
RPGSUB1 资料库 _QRNP_PEP_RPGSUB1 ACTGRP2
RPGSUB1 资料库 RPGSUB1 ACTGRP2
RPGSUB1 资料库 subProc1 ACTGRP2
RPGSUB1 资料库 subProc2 ACTGRP2
RPGSUBPGM2 资料库 _QRNP_PEP_RPGSUBPGM2 ACTGRP2
RPGSUBPGM2 资料库 RPGSUBPGM2 ACTGRP2
RPGSUBPGM2 资料库 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 的第二个操作数设置为 1 ,指示目标过程是 %TARGET的第一个操作数中指定的过程的调用者。 消息将从 subProc2 发送到其调用者的调用者 RPGSUB1
    SND-MSG *ESCAPE 'Msg 5' %TARGET(*CALLER : 1);
  • SND-MSG 操作与前一个操作类似,但 %TARGET 的第二个操作数设置为 2 ,指示目标过程是在 %TARGET的第一个操作数中指定的高于过程的两个调用级别。 消息将从 subProc2 发送到 _QRNP_PEP_RPGSUB1。 如果 RPGMAIN 是预期的目标过程,那么必须为堆栈偏移量指定 3 的值,以说明程序堆栈上是否存在程序入口过程 _QRNP_PEP_RPGSUB1 。
    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);