马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622 。
您需要 登录 才可以下载或查看,没有帐号?注册
x
【子程序调用】
子程序是可 以从 ABAP/4 中调用的程 序。定义子 程序的目的 是为了避免 重复编写程 序中频繁使 用的某些部 分或频繁使 用的算法。 可以与子程 序进行显式 数据传递。 有两种类型 的子程序: 内部子程 序: 内部子程序 的源代码与 调用程序( 内部调用) 位于同一 ABAP/4 程序中。 外部子程 序: 外部子程序 的源代码位 于 ABAP/4 程序中而不 是调用程序 (外部调用 )中。 尽管内部子 程序主要用 于模块化及 结构化单个 程序,某个 ABAP/4 程序中内部 调用的子程 序可以从另 一个 ABAP/4 程序中外部 调用。另外 ,也可以创 建只包含子 程序的 ABAP/4 程序。这些 程序不能自 己运行,而 是被其它 ABAP/4 程序作为外 部子程序库 来调用。 下列主题说 明 定义子程序 调用子程序 在调用程序与子程序之间进行数据传递 在子程序中定义局部数据类型和对象 中断子程序 定义子程序 子程序是以 FORM 开头、以 ENDFORM 结尾的代码 块。要定义 子程序,请 使用下列语 法: 语法 FORM <subr> [<pass>].
<statement block>
ENDFORM. <subr> 定义子程序 名。<pass> 选项用于指 定如何与子 程序进行数 据传递。 对于内部 子程序,不 必使用 <pass> 选项,但子 程序可以访 问主 ABAP/4 程序中声明 的所有数据 对象。 对于外部 子程序,必 须决定是使 用 <pass> 选项,还是 在内存公用 部分声明数 据对象。 有关与子程 序进行数据 传递的详细 信息,参见 在调用程序与子程序之间进行数据传递 如果在同一 程序中定义 内部子程序 ,并且不使 用事件关键 字,则应将 其分组集中 在程序末尾 ,以免影响 程序流程( 参见 定义过程块)。 子程序不能 包含嵌套的 FORM-ENDFORM 块。 FORM HEADER.
WRITE: / 'Program started by', SY-UNAME,
/ 'on host', SY-HOST,
'date:', SY-DATUM, 'time:', SY-UZEIT.
ULINE.
ENDFORM. 这样就创建 了子程序 HEADER, 该子程序可 用于创建输 出列表的表 头(请与使用包含程序中 的示例进行 比较)。 调用子程序 可以调用代 码位于同一 ABAP/4 程序中的子 程序(内部 调用),也 可调用代码 位于其它 ABAP/4 程序中的子 程序(外部 调用)。 调用内部子程序 调用外部子程序 可以运行时 指定子程序 名,或从给 定列表中调 用子程序。 运行时指定子程序名 从列表中调用子程序 不仅可以从 子程序中调 用子程序( 嵌套调用) ,子程序也 可以调用自 己(递归调 用)。 created with Help to RTF file format converter 调用内部子 程序 要调用内部 子程序,请 使用 PERFORM 语句,用法 如下: 语法 PERFORM <subr> [<pass>]. 调用子程序 <subr>。 在 <pass> 选项中,指 定如何与子 程序进行数 据传递。如 果不使用 <pass> 选项,子程 序也可以访 问主 ABAP/4 程序中声明 的所有数据 类型和对象 。该数据叫 做全局数据 ,如果不被 同名局域数 据隐藏,该 数据对子程 序可见(关 于数据传递 的详细信息 ,参见在调用程序与子程序之间进行数据传递)。 PROGRAM SAPMZTST. DATA: NUM1 TYPE I,
NUM2 TYPE I,
SUM
TYPE I.
NUM1 = 2. NUM2 = 4. PERFORM ADDIT. NUM1 = 7. NUM2 = 11. PERFORM ADDIT. FORM ADDIT.
SUM = NUM1 + NUM2.
PERFORM OUT.
ENDFORM. FORM OUT.
WRITE: / 'Sum of', NUM1, 'and', NUM2, 'is', SUM.
ENDFORM. 输出如下: Sum of
2 and
4 is
6 Sum of
7 and
11 is
18 在该示例中 ,程序末尾 定义了两个 内部子程序 :ADDIT 和 OUT。ADDIT 从该程序中 调用,OUT 从 ADDIT 调用。子程 序自动具有 字段 NUM1、 NUM2 和 SUM 的访问权限 。 调用外部子 程序 要调用外部 子程序,请 使用 PERFORM 语句,用法 如下: 语法 PERFORM <subr>(<prog>) [<pass>] [IF FOUND]. 调用程序 <prog> 中定义的子 程序 <subr>。 如果希望与 子程序进行 数据传递, 必须定义 <pass> 选项或者使 用公用部分 (关于进行 数据传递的 详细信息, 参见在调用程序与子程序之间进行数据传递)。 如果使用 IF FOUND 选项,并且 程序 <prog> 中没有子程 序 <sub>, 系统就忽略 PERFORM 语句。 启动调用外 部子程序的 程序时,如 果定义了子 程序的程序 不在内存中 ,ABAP/4就 将其装载到 内存中。为 了节省存储 空间,尽量 将不同程序 中定义的子 程序数目限 制到最小。 假定程序包 含下列子程 序: PROGRAM FORMPOOL. FORM HEADER.
WRITE: / 'Program started by', SY-UNAME,
/ 'on host', SY-HOST,
'date:', SY-DATUM, 'time:', SY-UZEIT.
ULINE.
ENDFORM. 可以从程序 中调用子程 序,方法如 下: PROGRAM SAPMZTST. PERFORM HEADER(FORMPOOL) IF FOUND. 在该示例中 ,调用程序 与子程序之 间没有数据 传递。与 使用包含程序中的示例一 样,该子程 序执行输出 语句。 运行时指定 子程序名 运行时,可 以指定要调 用的子程序 名以及存储 子程序的程 序名。为此 请使用 PERFORM 语句,用法 如下: 语法 PERFORM (<fsubr>) [IN PROGRAM (<fprog>)] [<pass>] [IF FOUND]. 系统执行字 段 <fsubr> 中存储的子 程序。如果 使用 IN PROGRAM 选项,系统 在字段 <fprog> 中存储的程 序内查找子 程序(外部 调用)。否 则,系统在 当前程序中 查找子程序 (内部调用 )。 使用该语句 还可在程序 代码中指定 子程序名和 外部程序名 。为此请忽 略括弧。 <pass> 选项指定如 何与子程序 进行数据传 递(关于数 据传递的详 细信息,参 见 在调用程序与子程序之间进行数据传递)。如果使 用 IF FOUND 选项,找不 到子程序 <sub>时 ,系统就忽 略 PERFORM 语句。 假定程序包 含子程序: PROGRAM FORMPOOL. FORM SUB1.
WRITE: / 'Subroutine 1'.
ENDFORM. FORM SUB2.
WRITE: / 'Subroutine 2'.
ENDFORM. 可在运行时 指定子程序 名,如下所 示: PROGRAM SAPMZTST. DATA: PROGNAME(8) VALUE 'FORMPOOL',
SUBRNAME(8).
SUBRNAME = 'SUB1'. PERFORM (SUBRNAME) IN PROGRAM (PROGNAME) IF FOUND. SUBRNAME = 'SUB2'. PERFORM (SUBRNAME) IN PROGRAM (PROGNAME) IF FOUND. 输出如下: Subroutine 1 Subroutine 2 字符字段 PROGNAME 包含程序名 ,该程序包 含子程序。 子程序名被 分配给字符 字段 SUBRNAME。 从列表中调 用子程序 要从列表中 调用特定子 程序,请使 用 PERFORM 语句,用法 如下: 语法 PERFORM <idx> OF <form1> <form2> .... <formn>. 系统执行子 程序列表中 位于 <idx> 处的子程序 。PERFORM 语句的这一 变量只对内 部调用有效 。字段 <idx> 既可以是变 量也可以是 文字。 PROGRAM SAPMZTST. DO 2 TIMES.
PERFORM SY-INDEX OF SUB1 SUB2.
ENDDO. FORM SUB1.
WRITE / 'Subroutine 1'.
ENDFORM. FORM SUB2.
WRITE / 'Subroutine 2'.
ENDFORM. 输出如下: Subroutine 1 Subroutine 2 在该示例中
,从列表中
连续调用两
个内部子程
序:SUB1 和 SUB2。 |