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