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区别有更深的了解欢迎讨论(ノ゚▽゚)ノ。

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/17875.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论