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 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)
值傳遞就是将參數的值複制一份到另一個至記憶體位址中,是以在子程式中參數變量的值的改變不影響外部程式實際變量的值。
FORM <subform> [USING VALUE(f1) VALUE(f2)...]...
PERFORM <subform> [USING VALUE(f1) VALUE(f2)...]...
VALUE(f1) VALUE(f2)是按值傳遞的CALL BY VALUE
[For Example]
PERFORM CALCULATOR_TWO USING i_num1 i_num2 CHANGING i_num3.
*值傳遞 USING VALUE(f1)
FORM CALCULATOR_TWO USING VALUE(NUM1) VALUE(NUM2) CHANGING SUM.
SUM = NUM1 + NUM2.
NUM1 = NUM1 * NUM2.
NUM2 = NUM1 * NUM2.
'NUM2=',NUM2,
'SUM=',SUM.
程式運作如下圖,子程式内部參數變量的值發生變量,不影響外部程式實際變量的值。
當隻按USING的方式傳遞參數時其也是按引用的方式傳遞,共享記憶體位址。如下:
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.
運作結果很明顯,如下圖:
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給外部變量.
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.
'NUM2=',NUM2,
'TOTAL=',TOTAL,
'I_NUM3=',i_num3."原值沒有發生改變
程式運作結果如下,i_num3的值在子程式中并沒有發生變量,當子程式調用結束後将把相應的值賦予。