abap perform的using与changing区别

abap程序中面向过程写法经常会使用到子程序,我们都知道perform可以附加选项using和changing,但是两者有什么区别呢?
一般回答都是using的参数在子程序中只能使用,不能修改。changing的参数在子程序中可以修改。
那我们通过简单代码进行测试两者区别。

示例一 只使用using

按照using只能使用,不能修改的说法,输出结果应该是两个1。

DATA: l_num1 TYPE i VALUE 1,
       l_num2 TYPE i VALUE 1.

START-OF-SELECTION.

  PERFORM test USING l_num1 l_num2.

  WRITE:/ l_num1,l_num2.
*&---------------------------------------------------------------------*
*&      Form  test
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_NUM1     text
*----------------------------------------------------------------------*
FORM test USING p_num1 p_num2.

  p_num1 = p_num1 + 1.
  p_num2 = p_num2 + 1.

ENDFORM.                    "test

测试结果
但是可以看到输出结果还是变化了,接下试下同时使用using和changing。
在这里插入图片描述

示例二 同时使用using和changing

DATA: l_num1 TYPE i VALUE 1,
       l_num2 TYPE i VALUE 1.

START-OF-SELECTION.

  PERFORM test USING l_num1 CHANGING l_num2.

  WRITE:/ l_num1,l_num2.
*&---------------------------------------------------------------------*
*&      Form  test
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_NUM1     text
*----------------------------------------------------------------------*
FORM test USING p_num1 CHANGING p_num2.

  p_num1 = p_num1 + 1.
  p_num2 = p_num2 + 1.

ENDFORM.                    "test

测试结果
这时程序会出现语法警告。黄色警告我们依然可以执行。
在这里插入图片描述
执行结果
在这里插入图片描述
当我们将using参数在子程序中的修改注释掉,语法就不会警告了。

DATA: l_num1 TYPE i VALUE 1,
       l_num2 TYPE i VALUE 1.

START-OF-SELECTION.

  PERFORM test USING l_num1 CHANGING l_num2.

  WRITE:/ l_num1,l_num2.
*&---------------------------------------------------------------------*
*&      Form  test
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_NUM1     text
*----------------------------------------------------------------------*
FORM test USING p_num1 CHANGING p_num2.

*  p_num1 = p_num1 + 1.
  p_num2 = p_num2 + 1.

ENDFORM.                    "test

看来using和changing同时存在时,语法还是会针对using参数的修改部分警告提示的,这时using和changing更像是代码规范。

示例三 按语法警告中提示使用value()

DATA: l_num1 TYPE i VALUE 1,
       l_num2 TYPE i VALUE 1.

START-OF-SELECTION.

  PERFORM test USING l_num1 l_num2.

  WRITE:/ l_num1,l_num2.
*&---------------------------------------------------------------------*
*&      Form  test
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_NUM1     text
*----------------------------------------------------------------------*
FORM test USING p_num1 VALUE(p_num2).

  p_num1 = p_num1 + 1.
  p_num2 = p_num2 + 1.

ENDFORM.                    "test

测试结果
在这里插入图片描述
可以看到,虽然在子程序中修改了参数p_num2,但是并没有影响变量l_num2。p_num2有些像在子程序中声明的一个和l_num2结构相同的局部变量。当我们希望针对一个全局变量进行处理,但是不想改变该变量值时就可以通过value()来实现了。

该结论只是通过测试得出的,有小伙伴对perform 的using和changing区别有更深的了解欢迎讨论(ノ゚▽゚)ノ。

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

椰子皮不皮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值