SAP模块化编程: 有函数,子例程,宏,类,我们今天主要以子例程来介绍。
1.1、子例程的定义
子例程是源代码 里具有一定独立功能的模块单元。
1.2、类型
内部子例程:内部子例程的源代码与调用程序位于同一个ABAP程序中;
外部子例程:外部子例程的源代码位于另外的ABAP程序中,而不是位于调用程序内部。
注意:
1.子例程中避免使用主程序的变量,应使用参数
2.在子例程中定义的变量,只在子例程中有效
1.3、格式
PERFORM DOWN_LIST.
FORM DOWN_LIST.
....
ENDFORM.
子例程的定义方式
以FORM开头,以ENDFORM结尾的ABAP代码。
1.4、语法
FORM [].
ENDFORM.
其中:
.用于定义子例程名,
参数选项也可以没有
子例程可以访问其所在主程序中声明的所有数据对象。
一般都将同一程序中定义的所有内部子例程都集中定义在程序的末尾。
子例程的定义不能互相嵌套。
1.5、Demo
DATA:LV_VBELN TYPE VBELN_VA ,
LS_VBAK TYPE VBAK,
LT_VBAP TYPE TABLE OF VBAP.
LV_VBELN = '11000092'.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = LV_VBELN
IMPORTING
OUTPUT = LV_VBELN .
CALL FUNCTION 'ZFM_SALESORDER_GETDETAIL1'
EXPORTING
i_vbeln = LV_VBELN
IMPORTING
E_VBAK = LS_VBAK
tables
t_vbap = LT_VBAP
EXCEPTIONS
SALESORDER_NOT_EXSIT = 1
OTHERS = 2.
PERFORM FRM_WRITE.
FORM FRM_WRITE.
IF sy-subrc = 0.
WRITE: ls_vbak-vbeln.
ELSEIF SY-SUBRC = 1.
WRITE :'销售凭证不存在'.
ENDIF.
ENDFORM.
1.6、形参和实参
形参
子例程定义期间用FORM语句定义的参数
实参
子例程调用期间用PERFORM语句指定的参数
参数传递
将主程序变量传递给子例程形式参数
传递类型
A:值传
子例程中参数变量的值的改变,不影响外部程序实际变量的值
DATA : A TYPE I VALUE 1 ,
B TYPE I VALUE 2,
C TYPE I .
PERFORM FRM_PLUS USING A B C.
WRITE C.
FORM FRM_PLUS USING VALUE(P_A) VALUE(P_b) value(P_C).
P_C = P_A + P_B + P_C.
WRITE P_C.
ENDFORM.
B:引用传(以下用的最多)
若子例程中的参数变量的值发生了改变,那么,传递程序的实际变量的值也发生改变
DATA : A TYPE I VALUE 1 ,
B TYPE I VALUE 2,
C TYPE I .
PERFORM FRM_PLUS USING A B C.
WRITE C.
FORM FRM_PLUS USING P_A P_b P_C.
P_C = P_A + P_B + P_C.
WRITE P_C.
ENDFORM.
C:值传并返回结果
传递参数的方式同值传递相同,但在子例程执行过程中,变量值不改变,而结束执行后,把变量的最终值返回。
DATA : A TYPE I VALUE 1 ,
B TYPE I VALUE 2,
C TYPE I .
PERFORM FRM_PLUS USING A B C.
WRITE C.
FORM FRM_PLUS USING VALUE(P_A) VALUE(P_b) CHANGING P_C.
P_C = P_A + P_B + P_C.
WRITE P_C.
endform.
1.6、总结
1.三种传递,如果是表类型,结构类型,则需要定义
全局变量:在主程序种定义的变量
局部变量:在子例种定义的变量;
FORM FRM_GET_SFLIGHT USING CARRID
SFLIGHT TYPE SFLIGHT.
SFLIGHT-CARRID='AA'.
ENDFORM.