子程序用 using 和 changing 语句 传递参数 ,其方法共分为三种。
1.call by value : 传入参数实参和传出参数的虚参有不同的物理内存。
使用using 关键字传递参数时与value语句一起搭配使用的情况。
例子:
DATA:GV_VAL TYPE C LENGT 20 VALUE 'CALL BY VALUE TEST'
PERFORM CALL_BYVALUE USING GV_VAL.
FORM CALL_BYVALUE USING VALUE (P_VAL)
WRITE P_VAL .
ENDFORM.
2.call by reference : 共有相同的物理内存并且互相传递地址。
使用changing 关键字传递参数时的情况,此时会修改传递到程序的参数值。
DATA: GV_VAL TYPE C LENGTH 30 VALUE 'Call by reference Test'.
write / gv_val.
PERFORM CALL_BYVREF CHANGING GV_VAL.
WRITE / GV_VAL.
FORM CALL_BYVREF CHANGING P_VAL.
P_VAL = 'Value is changed'
endform.
3.call by value and result : 传入传出变量语句执行时返回变更后的值。拥有不同的物理地址。
using 与 value 语句 一起搭配使用,则无法修改子程序中的实参值,但是changing 语句与value 语句 一起配套使用时,
当正常结束子程序时会修改实参值。
DATA: GV_VAL1 TYPE I VALUE 2.
DATA:GV_VAL2 TYPE I VALUE 3.
DATA: GV_SUM TYPE I.
PERFORM SUM_DATA USING GV_VAL1 GV_VAL2
CHANGING GV_SUM.
WRITE : / 'Result is :' , gv_sum.
FORM SUM_DATA USING VALUE(P_VAL1)
VALUE(P_VAL2)
CHANGING VALUE(P_SUM).
P_SUM = P_VAL + P_VAL2.
ENDFORM.
参数与结构体:
DATA : BEGIN OF GS_STR,
COL1 VALUE 'A',
COL2 VALUE 'B',
ENDOF GS_STR.
PERFORM WRITE_DATA USING GS_STR.
FORM WRITE_DATA USING PS_STR STRUCTURE GS_STR.
WRITE: PS_STR-COL1 , PS_STR-COL2.
ENDFORM.
参数与内表:
参数还可以为内表 , 当子程序参数为内表的时候也可以使用关键字 using changing .
TYPES: BEGIN OF T_STR,
COL1 TYPE C ,
COL2 TYPE I,
END OF T_STR.
TYPES: T_ITAB TYPE TABLE OF T_STR.
DATA: GS_STR TYPE T_STR,
GT_ITAB TYPE T_ITAB.
GS_STR-COL1 = 'A'.
GS_STR-COL2 = 1.
APPEND GS_STR TO GT_ITAB.
PERFORM TEST_ITAB USING GT_ITAB.
FORM TEST_ITAB USING PT_ITAB TYPE ITAB
READ TABLE PT_ITAB WITH KEY COL1 = 'A' INTO GS_STR.
IF SY-SUBRC EQ 0 .
WRITE : GS_STR-COL1 , GS_STR-COL2.
ENDIF.
ENDFORM.