子程序大多只被定义为某一个程序调用。可以将一个应用程序中的具体功能分解成几个子程序实现,则整个程序显得易读并易于维护,并可以实现功能复用。子程序的定义与调用分别使用FORM/ENDFORM和PREFORM语句来实现。
<1>,子程序定义:
FORM subr [USING ... [VALUE()p1[]] [TYPE t|LIKE f] ... ]
[CHANGING ... [VALUE()pn[]] [TYPE t|LIKE f] ].
...
<subr codes>
...
ENDFORM.
子程序不能进行嵌套(所有的处理块均不能嵌套),USING和CHANGING(以及不常用到的TABLES选项)是子程序与主程序的参数接口部分,
<subr codes>是子程序的具体代码段,主程序就是通过调用子程序名subr来执行这个部分定义的程序代码。
主程序段调用子程序的语法:
PREFORM subr [USING ... p1 ... ]
[CHANGING ... p2 ... ].
简单实例:
REPORT z_subr.
DATA: int1 TYPE i VALUE 1,
int2 TYPE i VALUE 2,
sum TYPE i.
START-OF-SELECTION.
PERFORM add.
WRITE sum.
FORM add.
sum = int1 + int2.
ENDFORM.
ABAP有辅助生成成功能,步骤:
1).在一个新程序中输入语句:PERFORM subr.
2).双击该子程序名,系统会询问是否生成子程序定义,单击确定后,子程序的代码框会自动出现。
3).若子程序以定义,双击咋会自动导航之代码处。
<2>,参数接口
形参:在子程序定义部分使用USING和CHANGING进行指定的参数,只能在子程序出现。
实参:调用子程序时在PREFORM语句中使用同样的附加项进行传递的参数。
REPORT z_canshu.
DATA: int1 TYPE i VALUE 1, int2 TYPE i VALUE 2,
int3 TYPE i VALUE 3, int4 TYPE i VALUE 4,
sum TYPE i.
*Passing Parameters
PERFORM add USING int1 int2.
PERFORM add USING int3 int4.
*Defining Parameters
FORM add USING p1 p2.
sum = p1 + p2.
WRITE: /' int1 + int2 = ', sum.
ENDFORM.
<3>,参数传递方式子程序的参数传递方式分为值传递和引用传递,以及一种较特殊的值和结果传递。
引用传递:子程序调用期间,将实参的地址产给形参,而形参本身不占用内存。对形参进行修改,主程序的数据对象值也会随之改变。
FORM ... [CHANGE pi ... Pn] ... //其中参数没有VALUE项
USING USING VALUE CHANGE CHANGE VALUE
参数传递方式 引用 值 引用 值
值是否改变 变 不变 变 当正常结束后改变(Exit,CHECK,ENDFORM)
值传递:形参作为实参的副本被创建,形参有自己的内存,更改形参不会影响到实参本身的内容。若子程序只使用主程序数据,或实现某些输出的功能,并不打算修改主程序变量的值,则应选择值传递。
FORM ... USING ... VALUE(Pi1) ... VALUE(Pi2) ...
特殊的形参定义方式: 称为值和结果传递。
FORM ... CHANGE ... VALUE(Pi) ... VALUE(Pi2) ...
与值传递相似,但是子程序正常结束是,将把对形式参数的更改“结果”复制给实参,因而主程序中的实参仍会被修改。如果子程序非正常中断,则参数变量保持原值。
<4>,参数类型及兼容
一般情况下性参可以代表多种类型的实参,所以不需要某一种特殊定类型,但是实参类型,必须确定。指定参数类型有两种,第一种是为一般类型,只在运行期内才将是参的具体结构传递给形参,所以只能使用其整体属性,而不能使用其具体结构。