1. 程式人生 > >ABAP引數傳遞USING和CHANGIN用法總結

ABAP引數傳遞USING和CHANGIN用法總結

ABAP中FORM引數的傳遞有以下幾種方式。   1.引用傳遞(CALL BY REFERENCE)   傳遞引數時將引數的地址(ADDRESS)傳至子程式中,也就是子程式中的引數變數與外部程式的引數變數共享地址內的值。又叫CALL BY ADDRESS,若子程式中的引數變數的值發生了改變,那麼,外部程式的實際變數的值也發生改變。   [Syntax]   FORM [USING …] [CHANGING …]   PERFORM [USING …] [CHANGING …]   USING 之後跟隨著不會發生變化的子程式引數,CHANGING後面的引數按引用傳遞,值會隨著子程式內的變化而變化。   [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.

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 [USING VALUE(f1) VALUE(f2)…]…   PERFORM [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.

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 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 […] [CHANGING VALUE(f1)…]   PERFORM […] [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.

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的值在子程式中並沒有發生變數,當子程式呼叫結束後將把相應的值賦予。   在這裡插入圖片描述