二维码

[基础语法] ABAP中USING与CHANGING的用法

Twilight发表于 2014-11-25 18:55jiaps 最后回复于 2017-12-03 23:04 [复制链接] 3382 23

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.
using changing 1.jpg
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
复制代码
程序运行如下图,子程序内部参数变量的值发生变量,不影响外部程序实际变量的值。
using changing 2.jpg
当只按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
复制代码
运行结果很明显,如下图:
using changing 3.jpg
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的值在子程序中并没有发生变量,当子程序调用结束后将把相应的值赋予。
using changing 4.jpg
注:using 也是可以传递内表数据的
根据实际项目经验,using,changing都会回传影响实参的,下面的新版系统代码检查时的系统报错:
内表低性能传输.jpg
游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

yny038
世上无难事{:soso_e185:}     只怕有心人{:soso_e181:}
您辛苦了!!!  
回复 支持 反对

使用道具 举报

xacwc
{:soso_e195:} {:soso_e195:} 进来看看
回复 支持 反对

使用道具 举报

clamp
支持一下!!
回复

使用道具 举报

fayne
回复下@!!!!
回复

使用道具 举报

teyun2222
解說非常詳細,謝謝分享!!
回复 支持 反对

使用道具 举报

jianwang1993
很哈的分享,谢谢楼主
回复 支持 反对

使用道具 举报

qshiou
楼主棒棒哒
回复 支持 反对

使用道具 举报

qshiou
楼主棒棒哒
回复 支持 反对

使用道具 举报

qshiou
楼主棒棒哒
回复 支持 反对

使用道具 举报

Rey
ABAP中USING与CHANGING的用法
回复 支持 反对

使用道具 举报

晓月之影
感谢分享~~~~
回复

使用道具 举报

资明
很好 很想看看
回复 支持 反对

使用道具 举报

Anda
学习学习,谢谢
回复 支持 反对

使用道具 举报

qintengteng

RE: ABAP中USING与CHANGING的用法

谢谢分享,受益良多
回复

使用道具 举报

JYL

RE: ABAP中USING与CHANGING的用法

学习一下,谢谢分享!
回复

使用道具 举报

ratg0626

RE: ABAP中USING与CHANGING的用法

ABAP中USING与CHANGING的用法,您辛苦了
回复 支持 反对

使用道具 举报

last

RE: ABAP中USING与CHANGING的用法

谢谢楼主

回复

使用道具 举报

h_ronin

RE: ABAP中USING与CHANGING的用法

谢谢大神分享,学习
回复

使用道具 举报

barry

RE: ABAP中USING与CHANGING的用法

新人,学习中
回复

使用道具 举报

12下一页

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表