1、參數引用傳遞(Parameters Passed by Reference)
使用USING或CHANGING不帶value關鍵字來聲明參數引用傳遞。代碼樣例:
FORM subr USING p1 [{TYPE type}|{LIKE field}]
p2 [{TYPE type}|{LIKE field}]
...
CHANGING p1 [{TYPE type}|{LIKE field}]
p2 [{TYPE type}|{LIKE field}]
...
在引用傳遞的方式,參數不在堆中佔有內存,傳入的是變量的地址,在子程序中對變量的修改實際上是對實際參數的修改。在這種方式using和changing是等價的。
2、輸入參數傳值傳遞(Input Parameters That Pass Values)
使用USING帶value關鍵字來聲明輸入參數傳值傳遞。代碼樣例:
FORM subr USING value(p1) [{TYPE type}|{LIKE field}]
value(p2) [{TYPE type}|{LIKE field}]
...
在輸入參數傳值傳遞的方式,參數在堆中佔有內存,傳入的是變量的值,在子程序中對變量的修改不會對實際參數的造成修改。
3、輸出參數傳值傳遞(Output Parameters That Pass Values)
使用USING帶value關鍵字來聲明輸入參數傳值傳遞。代碼樣例:
FORM subr CHANGING value(p1) [{TYPE type}|{LIKE field}]
value(p2) [{TYPE type}|{LIKE field}]
...
在輸出參數傳值傳遞的方式,形式參數在堆中佔有內存,傳入的是變量的值,在子程序中對變量的修改只有正常結束 (Endform,CHECK,EXIT等語句結束)時纔會有形式參數拷貝到對實際參數,如果是錯誤消息退出則不會影響實際參數。
***************************其它知識點**************************************************************
在ABAP/4中參數的傳遞可分成
1. Call By Reference:
傳參數時將資料的存放地址(address)傳至參數中, 也就是子程序中的參數變量與外部實際
變量共享地址內的值, 又稱爲 Call By Address, 若在子程序中地址中的值改變了, 外部實
際變量的值也會跟着改變.
語法:
FORM <subr> [USING <f1> <f2>…] [CHANGING <f1>…]
PERFORM <subr> [USING <f1> <f2>…] [CHANGING <f1>…]
Using 之後接在子程序中不會改變的變量, CHANGING接會改變值的變量
但實際上USING之後的參數在子程序中也可將值改變
Example:
SUM = 0.
NUM1 = 100. NUM2=200.
PERFORM ADD USING NUM1 NUM2 CHANGING SUM.
WRITE: / NUM1,NUM2,SUM “ SUM 由 0 變成 300
FORM ADD USING NUM1 NUM2 CHANGING SUM.
SUM = NUM1 + NUM2.
ENDFORM.
執行結果:
100 200 300
2. Call By Value
傳參數時將數據的值複製一份至另一地址中, 所以在子程序中參數變量值改變, 並不會影
響外部實際變量的值.
語法:
FORM <subr> USING VALUE(<f1>…)
使用 VALUE(<f1>)表示 <f1>是 Call By Value的傳遞
PERFORM <subr> USING <f1>
Example:
SUM = 0.
NUM1 = 5.
PERFORM MULTI USING NUM1 CHANGING SUM.
WRITE: / NUM1,SUM “NUM1值還是5, SUM 由 0 變成 120
FORM MULTI USING VALUE(NUM1) CHANGING SUM.
SUM = 1.
WHILE NUM1 > 1
SUM = SUM * NUM1.
NUM1 = NUM1 – 1.
ENDWHILE..
ENDFORM.
執行結果:
5 120
3. Call By Value and Return Result
傳入參數值的方式同Call By Value, 但在子程序結束執行時會將傳入的參數值複製
一份傳回給外部實際變量.
語法:
FORM ….. CHANGING VALUE(<f1>)
PERFORM …. CHANGING …. <f1>
Example:
SUM = 0.
NUM1 = 100. NUM2=200.
PERFORM ADD USING NUM1 NUM2 CHANGING SUM.
WRITE: / NUM1,NUM2,SUM “ SUM 由 0 變成 300
FORM ADD USING NUM1 NUM2 CHANGING VALUE(S).
S = NUM1 + NUM2.
WRITE: / NUM1,NUM2,SUM “得到結果爲 100 200 0
ENDFORM.
執行結果:
100 200 0 “在子程序中 SUM值尚未改變
100 200 300 “返回程序時, 將變量 S的值複製給 SUM
“所以 SUM值變成 300