ABAP中USING与CHANGING的用法

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]

SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000; background: #FFFFFF }
.L0S33 { color: #4DA619 }
.L0S52 { color: #0000FF }

  DATA: i_num1 TYPE I VALUE 10,

  i_num2 TYPE I VALUE 20,

  i_num3 TYPE I.

  WRITE: /   ‘I_NUM1=‘,i_num1,

  ‘I_NUM2=‘,i_num2,

   ‘I_NUM3=‘,i_num3.
  

SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000; background: #FFFFFF }
.L0S31 { font-style: italic; color: #808080 }
.L0S33 { color: #4DA619 }
.L0S52 { color: #0000FF }

  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.

SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000; background: #FFFFFF }
.L0S31 { font-style: italic; color: #808080 }

    "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 I VALUE 10,

  i_num2 TYPE I VALUE 20,

  i_num3 TYPE I.

  WRITE: /   ‘I_NUM1=‘,i_num1,

  ‘I_NUM2=‘,i_num2,

   ‘I_NUM3=‘,i_num3.
  

SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000; background: #FFFFFF }
.L0S33 { color: #4DA619 }
.L0S52 { color: #0000FF }

  PERFORM CALCULATOR_TWO USING i_num1 i_num2 CHANGING i_num3.

  WRITE: / ‘I_NUM1=‘,i_num1,

  ‘I_NUM2=‘,i_num2,

  ‘I_NUM3=‘,i_num3.
  

SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000; background: #FFFFFF }
.L0S31 { font-style: italic; color: #808080 }
.L0S33 { color: #4DA619 }
.L0S52 { color: #0000FF }

  *值传递 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的方式传递参数时其也是按引用的方式传递,共享内存地址。如下:

SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000; background: #FFFFFF }
.L0S32 { color: #3399FF }
.L0S33 { color: #4DA619 }
.L0S52 { color: #0000FF }

  DATA: i_num1 TYPE I VALUE 10,

   i_num2 TYPE I 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 I VALUE 10,

  i_num2 TYPE I VALUE 20,

  i_num3 TYPE I.

  WRITE: /   ‘I_NUM1=‘,i_num1,

  ‘I_NUM2=‘,i_num2,

   ‘I_NUM3=‘,i_num3.
  

SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000; background: #FFFFFF }
.L0S33 { color: #4DA619 }
.L0S52 { color: #0000FF }

  PERFORM CALCULATOR_THREE USING i_num1 i_num2 CHANGING i_num3.

  WRITE: / ‘I_NUM1=‘,i_num1,

   ‘I_NUM2=‘,i_num2,

   ‘I_NUM3=‘,i_num3.
  

SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000; background: #FFFFFF }
.L0S33 { color: #4DA619 }
.L0S52 { color: #0000FF }

  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的值在子程序中并没有发生变量,当子程序调用结束后将把相应的值赋予。
  

  

时间: 2024-11-10 12:01:47

ABAP中USING与CHANGING的用法的相关文章

转 ABAP中USING与CHANGING的用法

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

ABAP中SHIFT用法

1).SHIFT:截断字符串         SHIFT {c} [BY {n} PLACES] [{mode}].:             作用:去掉字符串的前n个位置的字符,如果n未指定,默认为1,如果指定的n小于等于0,则字符串不变.如果n超出字符串的长度,则字符串变空,所以在做 此操作的时候要注意n的指定.可以首先获得该字符串的长度,方法:len=STRLEN(C).                 Mode:指定字符串截断的方向.                   LEFT:从左边

关于Java中this和super的用法介绍和区别

1.this&super 什么是this,this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针.当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便可以利用this来实现这个目的.要注意的是this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this.his也可作为构造函数来使用.在后面可以看到 而什么是super,可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类.super的作用同样是可

shell中$0,$?,$!等的特殊用法

shell中$0,$?,$!等的特殊用法 变量说明: $$Shell本身的PID(ProcessID)$!Shell最后运行的后台Process的PID$?最后运行的命令的结束代码(返回值)$-使用Set命令设定的Flag一览$*所有参数列表.如"$*"用「"」括起来的情况.以"$1 $2 … $n"的形式输出所有参数.[email protected]所有参数列表.如"[email protected]"用「"」括起来的情况

Oracle中HINT的30个用法

在SQL语句优化过程中,经常会用到hint, 以下是在SQL优化过程中常见Oracle中"HINT"的30个用法 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化. 例如: SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT'; 2. /*+FIRST_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消

js中继承的几种用法总结(apply,call,prototype)

本篇文章主要介绍了js中继承的几种用法总结(apply,call,prototype) 需要的朋友可以过来参考下,希望对大家有所帮助 一,js中对象继承 js中有三种继承方式 1.js原型(prototype)实现继承 <SPAN style="<SPAN style="FONT-SIZE: 18px"><html>   <body>  <script type="text/javascript"> 

C中的时间函数的用法

C中的时间函数的用法    这个类展示了C语言中的时间函数的常用的用法. 源代码: #include <ctime>#include <iostream> using namespace std; class MyTime{public:    MyTime() { mPTime = 0; mStLocalTime = 0; mStGMTTime = 0; }    ~MyTime() {}; //time_t time(time_t * timer) 返回自1970年1月1日00

java中静态代码块的用法 static用法详解

(一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用比如main方法就必须是静态的 这是程序入口两者的区别就是:静态代码块是自动执行的;静态方法是被调用的时候才执行的.静态方法(1)在Java里,可以定义一个不需要创建对象的方法,这种方法就是

C# 中 PadLeft和PadRight 的用法

在 C# 中可以对字符串使用 PadLeft 和 PadRight 进行轻松地补位. PadLeft(int totalWidth, char paddingChar) //在字符串左边用 paddingChar 补足 totalWidth 长度 PadRight(int totalWidth, char paddingChar) //在字符串右边用 paddingChar 补足 totalWidth 长度 示例: 1.假如想输出AAAAA,可以用string.Empty.PadLeft(5,'