abap调⽤程序与⼦程序之间进⾏数据传递的⽅式⼀、将数据声明为公共部分
要将数据声明为公共部分,请使⽤ DATA 语句,⽤法如下:
语法:
DATA: BEGIN OF COMMON PART [<name>],
<data declaration>, .............. END OF COMMON PART [<name>].
在 <data declaration> 中,按 DATA 语句所述,对要包含到公共部分中的所有数据加以声明。
⼦程序和调⽤程序⾃动共享 TABLES 语句定义的表格⼯作区。
要在调⽤程序和⼦程序中使⽤公共部分,必须在所涉及的全部程序中都使⽤完全相同的声明。因此,应将公共部分声明放到INCLUDE 程序中。
⼀个程序中可使⽤多个公共部分。但必须给每个公共部分分配⼀个名称 <name>。如果每个程序中只使⽤⼀个公共部分,则名称 <name> 可选。
为了避免在具有不同公共部分声明的程序之间发⽣冲突,公共部分的名称应始终保持唯⼀。
假定某个 INCLUDE 程序 INCOMMON 包含公共部分 NUMBERS 的声明。公共部分由三个数字字
段组成: NUM1、 NUM2 以及 SUM:
***INCLUDE INCOMMON.
DATA: BEGIN OF COMMON PART NUMBERS, NUM1 TYPE I, NUM2 TYPE
I, SUM TYPE I, END OF COMMON PART NUMBERS.
假定程序 FORMPOOL 包含 INCOMMON,同时包含⼦程序 ADDIT 和 OUT:
PROGRAM FORMPOOL.
INCLUDE INCOMMON.
FORM ADDIT. SUM = NUM1 + NUM2. PERFORM OUT.ENDFORM.
FORM OUT. WRITE: / 'Sum of', NUM1, 'and', NUM2, 'is', SUM.ENDFORM.
假定调⽤程序 SAPMZTST 时包含 INCOMMON,并从程序 FORMPOOL 中调⽤ ADDIT。
PROGRAM SAPMZTST.
INCLUDE INCOMMON.
NUM1 = 2. NUM2 = 4.PERFORM ADDIT(FORMPOOL).
NUM1 = 7. NUM2 = 11.PERFORM ADDIT(FORMPOOL).
启动 SAPMZTST 后,输出如下:
Sum of 2 and 4 is 6
Sum of 7 and 11 is 18
该⽰例与调⽤内部⼦程序的⽰例功能相同。在当前⽰例中,必须将程序所⽤数据对象声明为公共
部分,因为⼦程序 ADDIT 和 OUT 都被外部调⽤。
⼆、通过参数进⾏数据传递【Important】
可以⽤参数在调⽤程序和⼦程序之间进⾏数据传递。
_ 在定义⼦程序期间⽤ FORM 语句定义的参数叫做形式参数。
_ 在调⽤⼦程序期间⽤ PERFORM 语句指定的参数叫做实参数。
可以区分不同种类的参数:
_ 输⼊参数⽤于向⼦程序传递参数
_ 输出参数⽤于从⼦程序传递参数
_ 输⼊/输出参数⽤于与⼦程序进⾏参数传递
在 FORM 和 PERFORM 语句的 <pass> 选项中定义参数,⽅法如下:
语法
FORM <subr> [TABLES <formal table list>] [USING <formal input list>] [CHANGING <formal output list>]....
PERFORM <subr>[(<prog>)] [TABLES <actual table list>] [USING <actual input
list>] [CHANGING <actual output list>]....
选项 TABLES、 USING 和 CHANGING 必须按上述顺序编写。
列表中 USING 和 CHANGING 后⾯的参数可以是所有类型的数据对象和字段符号。列表中 TABLES 后⾯的参数既可以是有表头⾏的内表,也可以是不带表头⾏的内表。可以采⽤ TABLES、 USING 或 CHANGING 传送内表。
对于 FORM 语句中 USING 和 CHANGING后⾯列表中的每个形式参数,可以指定不同数据传递⽅式:
_ 通过参考值调⽤:在⼦程序调⽤期间,仅将实参数的地址传送给形式参数。形式参数本⾝没有内存。
在⼦程序中使⽤调⽤程序的字段。更改形式参数之后,调⽤程序中的字段内容也会变动。
_ 通过值调⽤:在⼦程序调⽤期间,形式参数是作为实参数的副本创建的。形式参数有⾃⼰的内存。更
字符串函数传参改形式参数并不影响实参数。
_ 通过值和结果调⽤:在⼦程序调⽤期间,形式参数是作为实参数的副本创建的。形式参数有⾃⼰的内
存空间。在⼦程序末尾,将对形式参数的更改复制给实参数。
由 TABLES 传递的内表均通过参考值调⽤。
指定形式参数的数据类型对于向⼦程序传递结构化数据⾮常重要。有关如何传递结构化数据的内容(字段串和内表)在以下章节中有专门解释:
(⼀) 通过参考传递
要通过参考值在调⽤程序和⼦程序之间进⾏数据传递,请使⽤ FORM 和 PERFORM 语句 <pass> 选项
的 USING 或 CHANGING,⽤法如下:
语法:
FORM ..... [USING <fi1> ... <fin>] [CHANGING <fo1> ... <fon>] ...
< [USING <ai1> ... <ain>] [CHANGING <ao1> ... <aon>] ...
在 USING 和 CHANGING 后⾯的列表中指定形式参数和实参数,⽽不需附加任何内容。
FORM 语句中形式参数的名称可以与PERFORM 语句中实参数 <ai1> ... <ain> and <ao1> ... <aon> 的名称不同。PERFORM 语句列表中的第⼀个参数传递给 FORM 语句相应列表中的第⼀个参数,以此类推。
对于通过参考值调⽤, USING 和CHANGING 完全相同。对于⽂档, USING ⽤于⼦程序中的固定输⼊参数,
⽽ CHANGING 则⽤于⼦程序中变化的输出参数。
⼦程序中变化的输⼊参数在调⽤程序中也会变化。要避免这⼀点,必须通过值传递参数。
假定程序 FORMPOOL 包含两个⼦程序 ADDIT 和 OUT:
PROGRAM FORMPOOL.
FORM ADDIT USING ADD_NUM1 ADD_NUM2 CHANGING ADD_SUM. ADD_SUM =
ADD_NUM1 + ADD_NUM2. PERFORM OUT USING ADD_NUM1 ADD_NUM2
ADD_SUM.ENDFORM.
FORM OUT USING OUT_NUM1 OUT_NUM2 WRITE: / 'Sum
of',OUT_NUM1,'and',OUT_NUM2,'is',OUT_SUM.ENDFORM.
假定某个调⽤程序调⽤ ADDIT 和 OUT:
PROGRAM SAPMZTST.
DATA: NUM1 TYPE I, NUM2 TYPE I, SUM TYPE I.
NUM1 = 2. NUM2 = 4.PERFORM ADDIT(FORMPOOL) USING NUM1 NUM2 CHANGING SUM.
NUM1 = 7. NUM2 = 11. PERFORM ADDIT(FORMPOOL) USING NUM1 NUM2 CHANGING
SUM.
启动 SAPMZTST 后,输出如下:
Sum of 2 and 4 is 6
Sum of 7 and 11 is 18
该⽰例与将数据声明为公共部分中的⽰例功能相同。当前⽰例中,通过参考值将实参数 NUM1、
NUM2 和 SUM 从 SAPMZTST 传递给⼦程序 ADDIT 的形式参数。更改 ADD_SUM 后,后⾯的参
数就传递给⼦程序 OUT 的形式参数 OUT_NUM1、 OUT_NUM2 和 OUT_SUM。
备注:不能在⼦程序中更改 USING 后加的实参数
Eg:
PROGRAM FORMPOOL.
FORM ADDIT USING ADD_NUM1 ADD_NUM2 CHANGING ADD_SUM. ADD_SUM =
ADD_NUM1 + ADD_NUM2. PERFORM OUT USING ADD_NUM1 ADD_NUM2 ADD_SUM.
* ADD_NUM1 = 5.
* ADD_NUM2 = 5.
* A USING reference parameter should not be used.
* Instead, define the parameter as a USING-VALUE(...) or CHANGING parameter.
ENDFORM.
(⼆)通过值传递
要确保输⼊参数在调⽤程序中保持不变(即使⼦程序中已被更改),可以通过值将数据传递给⼦程序。为此,请使⽤ FORM 和 PERFORM 语句 <pass> 选项的 USING,⽤法如下:
语法
FORM ..... USING ...VALUE(<fii>) ..
< USING .......<aii> ..
通过对 FORM 语句中 USING 后⾯列表中的形式输⼊参数写⼊ VALUE(<fii>)⽽不是 <fii>,相应参数就通过
值进⾏传递。与实字段 <ai> 属性相同的 PERFORM 语句调⽤该⼦程序时,就会创建⼀个新的局域字
段 <fi>。系统处理独⽴于调⽤程序中参考字段的该字段。
假定 FORMPOOL 程序包含⼦程序 FACT:
PROGRAM FORMPOOL.
FORM FACT USING VALUE(F_NUM) CHANGING F_FACT. F_FACT = 1. WHILE F_NUM GE
1. F_FACT = F_FACT * F_NUM. F_NUM = F_NUM - 1. ENDWHILE.ENDFORM.
假定程序 SAPMZTST 调⽤⼦程序 FACT:
PROGRAM SAPMZTST.
DATA: NUM TYPE I VALUE 5, FAC TYPE I VALUE 0.
PERFORM FACT(FORMPOOL) USING NUM CHANGING FAC.
WRITE: / 'Factorial of', NUM, 'is', FAC.
在启动 SAPMZTST 后,输出如下:
Factorial of 5 is 120
在该⽰例中,计算数字 NUM 的阶乘。输⼊参数 NUM 被传递给⼦程序的形式参数 F_NUM。尽
管 F_NUM 在⼦程序中已被更改,实参数 NUM 仍然保持其初始值。输出参数 FAC 通过参考值
进⾏传递。
(三)通过值和结果进⾏传递
如果仅希望在⼦程序运⾏成功之后,才将更改过的输出参数从⼦程序返回给调⽤程序,请使⽤ FORM 和 PERFORM 语句 <pass> 选项的 CHANGING,⽤法如下:
语句
FORM ..... CHANGING ...VALUE(<fii>) ..
< CHANGING .......<aii> ..
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论