ABAP中USING与CHANGING的用法

ABAP中FORM参数的传递有以下几种方式。
1、引用传递(CALL BY REFERENCE)
传递参数时将参数的地址(ADDRESS)传至子程序中,也就是子程序中的参数变量与外部程序的参数变量共享地址内的值。又叫CALL BY ADDRESS,若子程序中的参数变量的值发生了改变,那么,外部程序的实际变量的值也发生改变。
语法:
FORM <subform> [USING <f1> <f2>...]  [CHANGING <fr1> <fr2>...]  
PERFORM <subform> [USING <f1> <f2>...]  [CHANGING <fr1> <fr2>...]
USING 之后跟随着不会发生变化的子程序参数,CHANGING后面的参数按引用传递,值会随着子程序内的变化而变化。
  1. DATA: i_num1 TYPE i VALUE 10,
  2.       i_num2 TYPE i VALUE 20,
  3.       i_num3 TYPE i.
  4. WRITE: /'原数据',
  5.        /'I_NUM1=',i_num1,
  6.         'I_NUM2=',i_num2,
  7.         'I_NUM3=',i_num3.
  8. PERFORM calculator USING i_num1 i_num2 CHANGING i_num3.
  9. WRITE: / 'perform返回的数据',
  10.        / 'I_NUM1=',i_num1,
  11.          'I_NUM2=',i_num2,
  12.          'I_NUM3=',i_num3.
  13. *&---------------------------------------------------------------------*
  14. *&      Form  calculator
  15. *&---------------------------------------------------------------------*
  16. *       text
  17. *----------------------------------------------------------------------*
  18. *      -->NUM1       text
  19. *      -->NUM2       text
  20. *      -->NUM3       text
  21. *----------------------------------------------------------------------*
  22. FORM calculator USING num1 num2 CHANGING num3.
  23.   num3 = num1 + num2.
  24.   WRITE: /  'perform中的数据',
  25.          /  'NUM1=',num1,
  26.             'NUM2=',num2,
  27.             'NUM3=',num3.
  28.   "NUM1 = NUM1 + 10.  "不允许修改
  29.   "NUM2 = NUM2 + 12.  "不允许修改
  30. ENDFORM.                    "calculator
复制代码
程序运行结果如下,i_num3变量在调用子程序后值变为了30.
<ignore_js_op> 
2、值传递(CALL BY VALUE)
值传递就是将参数的值复制一份到另一个至内存地址中,所以在子程序中参数变量的值的改变不影响外部程序实际变量的值。
语法:
FORM <subform> [USING VALUE(f1) VALUE(f2)...]...
PERFORM <subform> [USING VALUE(f1) VALUE(f2)...]...
VALUE(f1) VALUE(f2)是按值传递的CALL BY VALUE
  1. DATA: i_num1 TYPE i VALUE 10,
  2. i_num2 TYPE i VALUE 20,
  3. i_num3 TYPE i.
  4. WRITE:  /'原数据',
  5.         /'I_NUM1=',i_num1,
  6.         'I_NUM2=',i_num2,
  7.         'I_NUM3=',i_num3.
  8. PERFORM calculator_two USING i_num1 i_num2 CHANGING i_num3.
  9. WRITE:  / 'perform返回的数据',
  10.         / 'I_NUM1=',i_num1,
  11.           'I_NUM2=',i_num2,
  12.           'I_NUM3=',i_num3.
  13. *值传递 using value(f1)
  14. FORM calculator_two USING value(num1) value(num2) CHANGING sum.
  15.   sum = num1 + num2.
  16.   num1 = num1 * num2.
  17.   num2 = num1 * num2.
  18.   WRITE:  /  'perform中的数据',
  19.           /  'NUM1=',num1,
  20.              'NUM2=',num2,
  21.              'SUM=',sum.
  22. ENDFORM.                    "calculator_two
复制代码
程序运行如下图,子程序内部参数变量的值发生变量,不影响外部程序实际变量的值。
<ignore_js_op> 
当只按USING的方式传递参数时其也是按引用的方式传递,共享内存地址。如下:
  1. DATA:i_num1 TYPE i VALUE 10,
  2.      i_num2 TYPE i VALUE 20.
  3. WRITE: / 'I_NUM1=',i_num1 LEFT-JUSTIFIED,
  4.          'I_NUM2=',i_num2 LEFT-JUSTIFIED.
  5. PERFORM calculator USING i_num1 i_num2.
  6. WRITE: / 'I_NUM1=',i_num1 LEFT-JUSTIFIED,
  7.          'I_NUM2=',i_num2 LEFT-JUSTIFIED.
  8. *&---------------------------------------------------------------------*
  9. *&      Form  CALCULATOR
  10. *&---------------------------------------------------------------------*
  11. *       text
  12. *----------------------------------------------------------------------*
  13. *      -->NUM1       text
  14. *      -->NUM2       text
  15. *----------------------------------------------------------------------*
  16. FORM calculator USING num1 num2.
  17.   WRITE: / '  NUM1=',num1 LEFT-JUSTIFIED,
  18.            '  NUM2=',num2 LEFT-JUSTIFIED.
  19.   num1 = num1 + 10.
  20.   num2 = num2 + 12.
  21. ENDFORM.                    "CALCULATOR
复制代码
运行结果很明显,如下图:
<ignore_js_op> 
3、值传递参数并返回最终值(CALL BY VALUE AND RETURN RESULT)
传递参数的方式同值传递相同,但在子程序结束执行是会将传入参数变量的最终值回传一份给外部程序变量。
语法:FORM <subform> [.....] [CHANGING VALUE(f1)...]
        PERFORM <subform> [.....] [CHANGING VALUE(f1)...]
CHANGING VALUE(f1)首先按CALL BY VALUE而后RETURN RESULT给外部变量.
  1. DATA: i_num1 TYPE i VALUE 10,
  2.       i_num2 TYPE i VALUE 20,
  3.       i_num3 TYPE i.
  4. WRITE: /'原数据',
  5.        /'I_NUM1=',i_num1,
  6.         'I_NUM2=',i_num2,
  7.         'I_NUM3=',i_num3.
  8. PERFORM calculator_three USING i_num1 i_num2 CHANGING i_num3.
  9. WRITE: / 'perform返回的数据',
  10.        /'I_NUM1=',i_num1,
  11.         'I_NUM2=',i_num2,
  12.         'I_NUM3=',i_num3.
  13. *&---------------------------------------------------------------------*
  14. *&      Form  CALCULATOR_THREE
  15. *&---------------------------------------------------------------------*
  16. *       text
  17. *----------------------------------------------------------------------*
  18. *      -->NUM1          text
  19. *      -->NUM2          text
  20. *      -->VALUE(TOTAL)  text
  21. *----------------------------------------------------------------------*
  22. FORM calculator_three USING num1 num2 CHANGING value(total).
  23.   total = num1 + num2.
  24.   WRITE: /  'perform中的数据',
  25.          / 'NUM1=',num1,
  26.            'NUM2=',num2,
  27.            'TOTAL=',total,
  28.            'I_NUM3=',i_num3."原值没有发生改变
  29. ENDFORM.                    "CALCULATOR_THREE
复制代码
程序运行结果如下,i_num3的值在子程序中并没有发生变量,当子程序调用结束后将把相应的值赋予。
<ignore_js_op> 
注:using 也是可以传递内表数据的
根据实际项目经验,using,changing都会回传影响实参的,下面的新版系统代码检查时的系统报错:
<ignore_js_op> 

posted on 2016-08-16 10:40  刘君俭  阅读(734)  评论(0)    收藏  举报

导航