ABAP模块化函数

类似于C中的函数,java中的方法。
ABAP中的方法

创建和调用子程序

  • 格式:
    FROM#开始
    。。。。#函数内容
    END FORM#结束

  • 调用子程序(即函数)
    用REPORT调用子程序
    例如
    REPORT test.#调用子程序
    FROM test.#创建子程序
    WRITE “test”.
    END FORM

子程序的参数

子程序可以使用Using和Changing语句来传递参数
里面有三种不同的传递方式

  1. CALL BY VALUE :传入的实参和形参有不同的物理地址
  2. CALL BY REFERENCE:有相同的物理地址
  3. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值