ABAP中USING与CHANGING的用法-转

ABAP中FORM参数的传递有以下几种方式。
  1.引用传递(CALL BY REFERENCE)
  传递参数时将参数的地址(ADDRESS)传至子程序中,也就是子程序中的参数变量与外部程序的参数变量共享地址内的值。又叫CALL BY ADDRESS,若子程序中的参数变量的值发生了改变,那么,外部程序的实际变量的值也发生改变。
  [Syntax]
  FORM <subform> [USING <f1> <f2>...]  [CHANGING <fr1> <fr2>...]  
  PERFORM <subform> [USING <f1> <f2>...]  [CHANGING <fr1> <fr2>...]
  USING 之后跟随着不会发生变化的子程序参数,CHANGING后面的参数按引用传递,值会随着子程序内的变化而变化。
  [FOR EXAMPLE]

  DATA: i_num1 TYPE VALUE 10,
        i_num2 TYPE VALUE 20,
        i_num3 TYPE I.

  WRITE: /   'I_NUM1=',i_num1,
             'I_NUM2=',i_num2,
             'I_NUM3=',i_num3.
  

  PERFORM CALCULATOR USING i_num1 i_num2 CHANGING i_num3.
   WRITE: / 'I_NUM1=',i_num1,
            'I_NUM2=',i_num2,
            'I_NUM3=',i_num3.

  FORM CALCULATOR USING NUM1 NUM2 CHANGING NUM3.
    NUM3 = NUM1 + NUM2.
    WRITE: / 'NUM1=',NUM1,
              'NUM2=',NUM2,
              'NUM3=',NUM3.

    "NUM1 = NUM1 + 10.  "不允许修改
     "NUM2 = NUM2 + 12.  "不允许修改
  ENDFORM.
  程序运行结果如下,i_num3变量在调用子程序后值变为了30.
  

  2.值传递(CALL BY VALUE)
  
值传递就是将参数的值复制一份到另一个至内存地址中,所以在子程序中参数变量的值的改变不影响外部程序实际变量的值。
  [Syntax]
  FORM <subform> [USING VALUE(f1) VALUE(f2)...]...
  PERFORM <subform> [USING VALUE(f1) VALUE(f2)...]...
  VALUE(f1) VALUE(f2)是按值传递的CALL BY VALUE
  [For Example]
  DATA: i_num1 TYPE VALUE 10,
        i_num2 TYPE VALUE 20,
        i_num3 TYPE I.

  WRITE: /   'I_NUM1=',i_num1,
             'I_NUM2=',i_num2,
             'I_NUM3=',i_num3.

  

  PERFORM CALCULATOR_TWO USING i_num1 i_num2 CHANGING i_num3.
   WRITE: / 'I_NUM1=',i_num1,
            'I_NUM2=',i_num2,
            'I_NUM3=',i_num3.
  

  *值传递 USING VALUE(f1)
  FORM CALCULATOR_TWO USING VALUE(NUM1) VALUE(NUM2) CHANGING SUM.
    SUM = NUM1 + NUM2.
    NUM1 = NUM1 * NUM2.
    NUM2 = NUM1 * NUM2.
    WRITE: / 'NUM1=',NUM1,
             'NUM2=',NUM2,
             'SUM=',SUM.
  ENDFORM.
  程序运行如下图,子程序内部参数变量的值发生变量,不影响外部程序实际变量的值。
  

   当只按USING的方式传递参数时其也是按引用的方式传递,共享内存地址。如下:

  DATA: i_num1 TYPE VALUE 10,
        i_num2 TYPE VALUE 20.

  WRITE: / 'I_NUM1=',i_num1 LEFT-JUSTIFIED,
           'I_NUM2=',i_num2 LEFT-JUSTIFIED.

  PERFORM CALCULATOR USING i_num1 i_num2.
   WRITE: / 'I_NUM1=',i_num1 LEFT-JUSTIFIED,
            'I_NUM2=',i_num2 LEFT-JUSTIFIED.

     FORM CALCULATOR USING NUM1 NUM2.
      WRITE: / '  NUM1=',NUM1 LEFT-JUSTIFIED,
            '  NUM2=',NUM2 LEFT-JUSTIFIED.

     NUM1 = NUM1 + 10.  
     NUM2 = NUM2 + 12.  
  ENDFORM.
   运行结果很明显,如下图:
  

  3)值传递参数并返回最终值(CALL BY VALUE AND RETURN RESULT)
  
传递参数的方式同值传递相同,但在子程序结束执行是会将传入参数变量的最终值回传一份给外部程序变量。
  [Syntax]
  FORM <subform> [.....] [CHANGING VALUE(f1)...]
  PERFORM <subform> [.....] [CHANGING VALUE(f1)...]
  CHANGING VALUE(f1)首先按CALL BY VALUE而后RETURN RESULT给外部变量.
  [For Example]
  DATA: i_num1 TYPE VALUE 10,
        i_num2 TYPE VALUE 20,
        i_num3 TYPE I.

  WRITE: /   'I_NUM1=',i_num1,
             'I_NUM2=',i_num2,
             'I_NUM3=',i_num3.
  

  PERFORM CALCULATOR_THREE USING i_num1 i_num2 CHANGING i_num3.
  WRITE: / 'I_NUM1=',i_num1,
           'I_NUM2=',i_num2,
           'I_NUM3=',i_num3.
  

  FORM CALCULATOR_THREE USING NUM1 NUM2 CHANGING VALUE(TOTAL).
    TOTAL = NUM1 + NUM2.
    WRITE: / 'NUM1=',NUM1,
             'NUM2=',NUM2,
             'TOTAL=',TOTAL,
             'I_NUM3=',i_num3.
"原值没有发生改变
  ENDFORM.
  程序运行结果如下,i_num3的值在子程序中并没有发生变量,当子程序调用结束后将把相应的值赋予。
  

转载于:https://www.cnblogs.com/linglinghao/archive/2012/11/28/2791958.html

ABAP面试大全 目录 1. 报表知识 6 1.1 基础知识 6 1.1.1 报表事件,有哪些? 6 1.1.2 报表选择画面 7 1.2 ALV报表 8 1.2.1 ALV报表实现的流程 8 1.2.2 显示ALV常用的两个FM 8 1.2.3 如何设置ALV的热键 8 1.2.4 ALV显示的小计 8 1.2.5 FM ALV 和 OO ALV的比较 8 1.3 WRITE LIST 8 2. 数据库知识 9 2.1 基础知识 9 2.1.1 ABAP数据字典有哪些对象或元素? 9 2.1.2 据库提交确认和数据库回滚取消语句 9 2.1.3 什么是LUW 9 2.1.4简述modify 、insert、update对数据库表做操作时的影响 9 2.1.5 要描述域、数据元素、表字段之间的关系 9 2.1.6数据字典有几种缓冲方式,适用范围? 9 2.2 ABAP和数据库 10 2.2.1 ABAP 数据表的主索引是什么?索引的好处与坏处?与建索引的注意事项! 10 2.2.2 ABAP透明表有哪几种数据类(data class)?对数据的存储有什么影响? 10 2.2.3 SAP有几种表,他们的区别是什么? 10 2.2.4什么是簇表(cluster table)?举出知道的簇表。 10 2.2.5找数据库表,有哪些常用的方法。 10 2.2.6如何建立数据库锁对象,激活锁对象产生的Function Module的名字为什么,在何处查看锁表的情况? 10 2.2.7更新 FM 分为 V1 和 V2,那么首先会执行哪一种更新类型呢?每种类型又是以哪种模式(异步、同步或本地)执行的呢? 11 2.2.7使用OPEN SQL注意原则 11 2.3 与表相关 11 2.3.1 MM模块有哪些常用表格 11 2.3.2 HR模块知识:HR里面存储HR主数据主要用到了哪些表? 11 2.3.3 HR模块知识:HR程序在开发常用的两个逻辑数据库是什么?分别对其进行描述 12 2.3.4 HR模块知识:HR模块里面,如何修改HR的信息类型,具体如何实现 12 2.3.5财务模块:财务模块开发常用的表有哪些,简单举例说明: 12 2.3.6 PM 常用的TABLE 12 2.3.6 inner join 与 left-outer join的区别? 13 3. 权限相关 14 3.1 什么是权限对象(Authorization Objects)?在 ABAP 程序使用哪条语句进行授权检查? 14 3.2 与权限对象有关的事务代码有哪些? 14 4. DIALOG 15 4.1 DIALOG 的几个事件 15 4.2 何在TABLE CONTROL实现选一行或多行的效果 15 4.3 DIALOG 开发的常用几个控件是什么? 15 5. BDC 16 5.1 BDC录屏的事务代码 16 5.2 BDC与BAPI之间的区别 16 5.3 BDC录屏的注意事项 16 5.4谈谈BDC的运行模式和更新模式 16 6. 增强 17 6.1什么叫增强?有哪些方式进行增强? 17 6.1.1 User EXIT 17 6.1.2 Customer exit 17 6.1.3 BADI 17 6.1.4 Enhancement Spot 17 6.2如何建立增强? 17 6.3与增强相关的事务代码有哪些 18 6.4如何进行数据库表字段的增强?Append和Include的方式有何区别? 18 7. SMARTFORMS 19 7.1谈谈SmartForm,Template和Table表格的区别 19 7.2 SMART FORM如何实现公司LOG打印,其步骤是什么? 19 7.3 smartform 如何控制段落、单个字符输出格式? 19 8. RFC和 BAPI 20 8.1 RFC 20 8.1.1什么是RFC,有哪些通信模式? 20 8.1.2 RFC涉及到常用的事务代码有哪些? 20 8.1.3根据调用方式的不同,RFC接口提供了什么样的服务? 20 8.1.4 RFC接口的具体功能包括哪些? 20 8.1.5在通过CALL FUNCTION语句进行远程功能调用的基本模式有哪些 20 8.1.6怎么创建一个支持远程调用的RFC 21 8.1.7怎么调用一个SAP标准RFC 21 8.1.8怎样建立RFC程序?RFC程序传递的参数都是传递值还是引用?如何建立函数组? 21 8.1.9怎么来维护这个DESTINATION(远程目标) 21 8.2 BAPI 21 8.2.1什么是BAPI?你使用过哪些BAPI实现什么功能? 21 8.2.2什么是业务对象类型?它包含哪些主件? 21 8.2.3如何创建一个BAPI? 22 8.2.4编写BAPI的注意事项有哪些? 22 8.2.5谈谈与BAPI相关的事务代码。 22 8.3 RFC 和BAPI的相同之处和不同之处 22 8.3.1 RFC和BAPI的区别? 22 9.其他 23 9.1 基础知识 23 9.1.1 CHECK、EXIT、RETURN命令的区别? 23 9.1.2初始化内表有几种方式? 23 9.1.3 一个程序如何调用另外一个程序 24 9.1.4 在一个程序如何调用其他事物代码 24 9.1.5在进行画面跳时,CALL SCREEN与LEAVE TO SCREEN的区别? 24 9.1.6 LOOP 循环和系统字段? 24 9.1.7 MESSAGE消息有哪些类型,含义?如何自定义MESSAGE消息类? 24 9.1.8 ABAP,如何自定义异常类?如何捕捉异常? 24 9.1.9什么是事物变式?事务变式有什么用? 25 9.1.10 RANGE 25 9.1.11对于FIELD SYMBOL赋值将使用 25 9.1.12 Perform 调用子程序时,usingtables,changing 3个参数分别有什么影响? 25 9.1.13如何在程序间传送数据? 25 9.2 延伸 26 9.2.1自定义搜索帮助有几种方式?如何实现 26 9.2.2怎么创建number range 26 9.2.3 function module,如何给出错误消息? 26 9.2.4如何优化ABAP程序? 26 9.2.5前导零的处理方式 27 9.2.6 程序事件和系统事件 27 9.2.7如何建立一个外部数据库的连接 27 9.2.8怎样从文件服务器上读取文件?和写文件到文件服务器上? 27 9.2.9 SAP 包括哪些传输技术 27 9.2.10如何将内表数据换成一个XML文件? 28 9.2.11怎么导出一个WSDL文件? 28 9.2.12怎么导入一个WSDL文件? 28 9.2.13创建后台程序的TCODE是什么,如何在程序里面调用后台程序 28 9.2.14 webservice 28 9.2.15什么叫BTE (Business Transaction Event),BTE的两种类型? 28 9.2.16现阶段接口开发使用的技术 29 9.2.17将一个RFM(Remote-Enabled Module)创建一个WEB SERVICE都有什么相关的事务代码? 29 9.2.18 esb使用 29 10.常用T-CODE 30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值