%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 。
过程 激活组 PROC1 AG1 PROC2 AG2 PROC3 AG1 PROC4 AG1 PROC5 AG1 - *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 。
过程 节目或服务节目 PROC1 PGM1 PROC2 PGM2 PROC3 PGM1 PROC4 PGM1 PROC5 PGM1 - 程序堆栈上程序或过程的名称。 它必须是作业 CCSID 中的字符值。注: 如果程序或过程是在当前过程之前调用的,并且尚未从该调用返回,那么该程序或过程位于程序堆栈上。
- 它是可选的。 如果未指定,那么缺省为零。
- 如果对第一个操作数指定了 *EXT ,那么不允许该值。
- 它必须是小数位数为零的数字值。 该值不能为负数。
如果当前过程不是程序的主过程,并且要将消息发送至程序的调用者,请对 %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);