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的值在子程序中並沒有發生變量,當子程序調用結束后將把相應的值賦予。
  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM