ABAP-10 模块化
1、子程序
FORM 子程序名 参数(值传递、引用传递(含内表))
代码...
代码...
代码...
ENDFORM.
using | using value | change | change value | table | |
---|---|---|---|---|---|
传递方式 | 引用传递 | 值传递 | 引用传递 | 值传递 | 引用传递 |
参数是否改变 | 是 | 否 | 是 | 结束后改变 | 是 |
1、子程序必须写在代码的最后面 2、参数最好带类型
简单子程序
*调用子程序Fname。
PERFORM fname."输出:Hello world
*此处定义子程序:Fname
*子程序不被调用,是不会执行的
FORM fname.
WRITE / 'Hello world'.
ENDFORM.
1.1 using
例子A
PERFORM fname02 USING 'hello'."输出:hello
FORM fname02 USING in_str TYPE string.
WRITE / in_str.
ENDFORM.
例子B-参数的值会改变
DATA l_msg TYPE string VALUE 'hello03'.
WRITE / l_msg."输出:hello
PERFORM fname03 USING l_msg.
WRITE / l_msg."输出:03你好
FORM fname03 USING in_str TYPE string.
in_str = '03你好'.
ENDFORM.
1.2 using value
DATA l_msg04 TYPE string VALUE 'hello04'.
WRITE / l_msg04."输出:hello04.
PERFORM fname04 USING l_msg04.
WRITE / l_msg04."输出:hello04.
FORM fname04 USING VALUE(in_str) TYPE string.
in_str = '04你好'.
ENDFORM.
1.3 change
DATA l_msg05 TYPE string VALUE 'hello05'.
WRITE / l_msg05."输出:hello05.
PERFORM fname05 CHANGING l_msg05.
WRITE / l_msg05."输出:05你好.
FORM fname05 CHANGING in_str TYPE string.
in_str = '05你好'.
ENDFORM.
1.4 change value
子程序form执行完后参数(l_msg06)的值才会改变,参数(l_msg06)的值在form中永远不会改变
DATA l_msg06 TYPE string VALUE 'hello06'.
PERFORM fname06 CHANGING l_msg06.
WRITE / l_msg06."输出:06你好.
FORM fname06 CHANGING VALUE(in_str) TYPE string.
WRITE / l_msg06."输出:hello06,
in_str = '06你好'.
WRITE / l_msg06."输出:hello06,,没有改变
ENDFORM.
1.5 table
TYPES:BEGIN OF ty_tab,
id TYPE i,
name(10) TYPE c,
END OF ty_tab.
TYPES stru_tab TYPE STANDARD TABLE OF ty_tab."定义一个表结构
DATA tbl_tab TYPE STANDARD TABLE OF ty_tab WITH HEADER LINE."定义一个内表
DATA g_msg TYPE string.
DATA g_msg2 TYPE string.
PERFORM ftab1 TABLES tbl_tab.
PERFORM ftab2 TABLES tbl_tab.
*多参数调用
PERFORM ftab3 TABLES tbl_tab USING g_msg CHANGING g_msg2.
FORM ftab1 TABLES in_tab TYPE stru_tab.
ENDFORM.
FORM ftab2 TABLES in_tab STRUCTURE tbl_tab .
ENDFORM.
FORM ftab3 TABLES in_tab TYPE stru_tab USING value(in_ustr) TYPE string CHANGING in_cstr TYPE string.
ENDFORM.
2、功能模块(函数)
2.1、创建功能模块(函数)——SE37
2.2、在import中创建字段:IN_AUFNR,Typing=TYPE,参考元素=AUFNR,勾选=值传递
2.3、在export总创建字段:OT_CAUFV,Typing=TYPE,参考表=CAUFV,勾选=值传递
2.4、在代码块输入:SELECT SINGLE * INTO ot_caufv FROM caufv WHERE aufnr = in_aufnr.
2.5 在SE38创建:ZCSDN_LION_DEMO11_FG
REPORT zcsdn_lion_demo11_fg.
DATA:df_aufnr LIKE caufv-aufnr,
df_caufv LIKE caufv.
df_aufnr = '000110000000'.
CALL FUNCTION 'ZCSDN_FG01'"必须大写,否则找不到.
EXPORTING
in_aufnr = df_aufnr
IMPORTING
ot_caufv = df_caufv.
WRITE df_caufv-auart.
2.6 执行结果
2.7 验证结果
SE11—输入资料库表格:CAUFV—显示—内容—订单=000110000000—执行
执行结果和数据表CAUFV数据一致
补充1:在函数ZCSDN_FG01中新增一个表格变量:OT_TAB,Typing=like,参考元素=CAUFV
补充2:在函数ZCSDN_FG01代码中新增代码:
ot_caufv-auart = ‘111’.
APPEND ot_caufv TO ot_tab.
补充3:在程序ZCSDN_LION_DEMO11中定义表格,并添加一行数据:
DATA df_tab TYPE STANDARD TABLE OF caufv WITH HEADER LINE.
df_tab-auart = ‘lionfang’.
append df_tab.
补充4:在ZCSDN_LION_DEMO11_FG添加函数调用table属性
此时执行,内表df_tab会有得到2行数据,一个是本程序append的,另一个是函数ZCSDN_FG01中append的
REPORT zcsdn_lion_demo11_fg.
DATA:df_aufnr LIKE caufv-aufnr,
df_caufv LIKE caufv.
DATA df_tab TYPE STANDARD TABLE OF caufv WITH HEADER LINE.
df_tab-auart = 'lionfang'.
append df_tab.
df_aufnr = '000110000000'.
CALL FUNCTION 'ZCSDN_FG01'"必须大写,否则找不到.
EXPORTING
in_aufnr = df_aufnr
IMPORTING
ot_caufv = df_caufv
TABLES
ot_tab = df_tab.
*验证df_tab的行数
DATA tabline TYPE i .
tabline = lines( df_tab ).
if sy-subrc = 0.
WRITE / tabline."输出:2,本函数append了一行,子函数ZCSDN_FG01append了一行,共2行.
ENDIF.
WRITE / df_caufv-auart.
3、代码复用
代码复用是指重复某一个代码块,包括:包含程序、宏
3.1 包含程序
se38——创建程序ZCSDN_LION_DEMO11——点上面的“显示物件清单”——object name(对象名)选中后右键——建立——INCLUDE(包含或包括)——
在包含程序中定义的字段直接能在主程序中使用
输出结果
如果其他程序也要使用name的定义,只需在程序自身代码中添加即可:INCLUDE ZCSDN_LION_DEMO11_01.
3.2 宏
TYPES:BEGIN OF pers,
name(10) TYPE c,
age TYPE i,
END OF pers.
DATA it_per TYPE STANDARD TABLE OF pers WITH HEADER LINE.
*例子1
DEFINE per_add.
it_per-name = &1.
it_per-age = &2.
append it_per.
END-OF-DEFINITION.
per_add '张三' '40'."此时会调用上面的宏per_add 并传值:&1=张三,&2=40,内表it_per会增加一行数据。
*例子2
DATA rt TYPE i.
DEFINE operation.
rt = &1 &2 &3.
write / rt.
END-OF-DEFINITION.
operation 1 + 10."调用后会输出结果:11.
WRITE /.