一、概述
子程序从FORM语句开始执行直到遇END FORM结束,使用子程序的主要目的在于代码模块化、结构化及重复利用。
二、子程序定义
PERFORM
FORM.
~~~~
ENDFORM.
调用
PERFORM WRITE_DATA.
FORM WRITE_DATA.
WRITE:/ 'WRITE_DATA'.
ENDFORM.
三、子程序参数
参数是指调用子程序时用于传入、传出的值。子程序中的参数与一般用DATA语句定义的局部
变量相同。调用子程序时使用的参数叫实参,在子程序中使用的参数叫虚参。PERFORM利
用USING、CHAING定义参数,且使用时要与子程序的顺序一致。参数可以使用ABAP的所有
对象,即基本数据类型、Field Symbol、内表等。
下列语句给出了子程序中可以使用的多种选项
FORM subr USING p1 TYPE type
VALUE(p2) TYPE type
...
CHANGING p3 TYPE type
VALUE(p4) TYPE type
传递参数的方法
子程序用Using和Changing语句传递参数,其方法共分为三种。
- Call by Value
传入参数即实参与传出参数即虚参有不同的物理内存 - Call by Reference
共有相同的物理内存并且互相传递地址。 - Call by Value and Result
传入传出遍历语句执行成功时返回变更后的值。拥有不同的物理地址
Call by Value
Call by Value 是指使用USING关键字传递参数时与VALUE语句一起搭配使用的情况。
FORM subr USING ..VALUE(pi)[TYPE <t>|LIKE <f>].
VALUE语句中虚参占用自己的单独内存。调用子程序时,实参值复制到虚参中,即使改变虚参的值也不会影响实参值。
Call by Reference
Call by Reference是指使用CHANGING关键字传递参数时的情况,此时会修改传递到子程序的参数值。
FORM subr USING ... pi[TYPE <t>| LIKE <f>]...
FORM subr CHANGING ...pi[TYPE <t>|LIKE <f>]...
子程序的虚参没有自己的内存空间。只是在调用子程序期间占用实参的地址。即在调用Subroutine的程序的内存地址(相同名字的变量)中进行工作。
若在FORM语句中不使用VALUE语句,则USING与CHANGING语句功能是相同的,但出于代码可读性区分为“使用”、“变更”。USING代表传递数据,CHAING代表传递数据后变更其值。为了避免发生实参值在调用子程序后不被修改的情况,当使用USING时要与VALUE语句一起搭配使用。
Call by Value and Result
介绍使用CHANGING语句传递参数时与VALUE语句搭配使用的情况
FORM subr CHANGING... VALUE(pi) [TYPE <t> | LIKE <f>].
USING语句与VALUE语句一起搭配使用,则无法修改子程序的实参值,但是CHANGING语句与VALUE语句一起配套使用时,当正常结束子程序时会修改实参值。
四、TABLE语句
TYPES:BEGIN OF t_str,
col1 type c,
col2 type i ,
END OF t-str.
TYPES:t_itab TYPE TABLE OF t_str.
DATA:gt_itab TYPE t_itab.
PERFORM test_itab TABLES gs_itab.
FORM test_itab TABLES pt_itab TYPE t_itab.
ENDFORM.
五、调用子程序
调用子程序的方法有Internal、External两种。通过PERFORM语句不仅能调用ABAP程序内部子程序,还可以调用其他程序的子程序。调用外部程序子程序的情况,称之为External Call,子程序名字后面要明确指定该子程序所属程序名(用括号)。可以根据条件动态地显示子程序的 名称。
PERFORM subr.
PERFORM subr(prog) [IF FOUND].