类似于C中的函数,java中的方法。
ABAP中的方法
创建和调用子程序
-
格式:
FROM#开始
。。。。#函数内容
END FORM#结束 -
调用子程序(即函数)
用REPORT调用子程序
例如
REPORT test.#调用子程序
FROM test.#创建子程序
WRITE “test”.
END FORM
子程序的参数
子程序可以使用Using和Changing语句来传递参数
里面有三种不同的传递方式
- CALL BY VALUE :传入的实参和形参有不同的物理地址
- CALL BY REFERENCE:有相同的物理地址
- CALL BY VALUE AND RESULT :传入和传出语句执行后返回的是变更后的值,有不同的物理地址。
-
CALL BY VALUE是指在USING和VALUE两个关键字一起使用的时候,这里事先要先定义好参数,即形参value1,就需要先定义一个value1,不像java可以直接定义形参,而且此时的value1在FORM中是局部变量。
例如:
DATA:value1 TYPE c LENGTH 20 VALUE “11111111”. #定义变量
FORM test USING VALUE(value1). #创建子程序
WRITE value1.
ENDFORM. -
CALL BY REFERENCE:这个是指用用CHANGING关键字传递参数的情况,这时候就会更改传到子程序的参数值。
例如:
DATA:value1 TYPE c LENGTH 20 VALUE “11111111”. #定义变量
WRITE / value1.
PERFORM test CHANGING value1.
WRITE / value1.
FORM test CHANGING(value1). #创建子程序
value1 = “22222222”.
ENDFORM.
前后两次的write的值会不一样,调用了子程序后value1的值就被改变了。使用USING替换CHANGING,结果也是一样,前面USING后面的FORM中使用CHANGING也不会发生改变,总结来说就是不在FORM中使用VALUE语句,USING和CHANGING的功能其实是相同的,但是为了区分在使用USING的时候要加上VLAUE一起搭配使用。 -
CALL BY VALUE AND RESULT,USING 和VALUE语句一起使用的时候不会改变子程序中的实参,但是CHANGING关键字和VALUE关键字一起使用的时候,在程序的结束时候就会修改实参值。
例如:
DATA:value1 TYPE i LENGTH 20 VALUE “1”.#参数 1
DATA:value2 TYPE i LENGTH 20 VALUE “2”. #参数 2
DATA:value3 TYPE i LENGTH 20. #参数 3
PERFORM test USING value2 value3 CHANGING value3.
WRITE / value3.
FORM test USING VALUE(value1) VALUE(value2)CHANGING VALUE(value3). #创建子程序
value3 = value1 + value2.
ENDFORM. -
注意:value关键字就是value,value语句是指定义变量时必须使用value给初始值。
定义参数的数据类型
可以使用like和type定义数据类型。
例如:
使用type定义类型
FORM test CHANGING value1 TYPE i.
使用like定义类型
FORM test CHANGING value1 LIKE value2.
使用like就是定义value1与value2一样的数据类型
注意:这里定义的类型需要和value语句中定义的类型相同不然会报错。
虚参数可定义所有的数据类型,所以也可以定义为结构体,即java中的类,使用STRUCTURE定义数据类型为结构体。
例如:
DATA:BEGIN OF value1,#定义结构体
col1 VALUE “1”,
col2 VALUE “2”,
END OF value.
PERFORM test USING value.
FORM test USING value STRUCTURE value1. #创建子程序
WRITE:value1-col1,value1-col2.
ENDFORM.
调用程序外部的子程序
使用PERFORM test IF FOUND.
调用其他程序的子程序的时候需要在后面加一个IF FOUND语句检查是否有这个子程序。如果没有加这个语句,当子程序不存在的时候就会报错。
调用内部程序的子程序的时候就不需要加语句,直接PREFORM就行。
依次调用子程序
do 2 times.
PERFORM SY-index of value1 value2.
ENDDO.
idx为调用顺序的名字,这里调用的只能是内部子程序,并且不能有参数。
而且这里的调用的一次只调用一个,就是第一次调用value1,第二次调用value2,所以这里的do需要循环两次,而不是输出两次value1和value2