原文链接:Modularization in ABAP: Macro, Subroutines & Function Modules
作者:By Scott Livingston
模块化源代码时,将一系列 ABAP 语句放在模块中。然后,无需将所有语句放在主程序中,只需调用模块即可。生成程序时,模块化单元中的源代码被视为实际存在于主程序中。
在本教程中,您将学习:
模块化的需求
- 完善程序结构。
- 易于阅读的代码
- 易于维护的代码
- 避免冗余并促进代码重用
各种模块化技术
- 宏的使用
- 包含文件的使用
- 子 例 程
- 功能模块
让我们详细研究一下它们中的每一个:
SAP-ABAP 宏
如果要在程序中多次重用同一组语句,则可以将它们包含在宏中。
您只能在定义宏的程序中使用宏,并且只能在程序定义之后的行中调用它。
宏对于长计算或复杂的 WRITE 语句很有用。
语法
DEFINE <macro_name>
'Macro Statements
END-OF-DEFINITION
宏可以使用参数 &N,其中 N = 1,2,3...
例:-
DATA: number1 TYPE I VALUE 1.
DEFINE increment.
ADD 1 to &1.
WRITE &1.
END-OF-DEFINITION.
Increment number1.
WRITE number1.
输出:2
包括程序
包含程序仅用于模块化源代码,没有参数接口。
包含程序允许您在不同的程序中使用相同的源代码。如果要在不同程序中使用的冗长数据声明,则它们可能很有用。
语法
Include <include program Name>
注意事项
- 包含程序不能调用自己。
- 包含程序必须包含完整的语句。
例:
INCLUDE ZILX0004.
WRITE: / 'User', SY-UNAME,/ 'Date', SY-DATUM.
================================
PROGRAM ZRPM0001.
INCLUDE ZILX0004.
子 例 程
子例程是可以在任何 ABAP 程序中定义的过程,也可以从任何程序调用。子例程通常在内部调用,也就是说,它们包含本地经常使用的代码或算法部分。如果希望函数在整个系统中可重用,请使用函数模块。
语法-
FORM <Subroutine> [<pass>].
<Statement block>.
ENDFORM.
<子例程> = 子例程的名称
= 正在传递的参数
子例程的类型
-
内部
- 在被调用的同一程序中定义的子例程。
- 可以访问主 ABAP/4 程序中声明的所有数据对象。
-
外部
- 在被调用的程序外部定义的子例程。
- 需要使用 选项或在内存的公共部分中声明数据对象。
**调用子例程
**
内部子例程
PERFORM <subroutine> [<pass>]
<子例程> = 子例程的名称
= 正在传递的参数
主程序中声明的数据自动可用。
外部子例程
PERFORM <subroutine>(<Program>) [<pass>].
PERFORM <subroutine> (<Program>) [<pass>] [IF FOUND].
PERFORM (<subroutine>) IN PROGRAM (<Program>) [<pass>] [IF FOUND].
PERFORM <index> OF <subroutine1> <subroutine2> <subroutine3> [<pass>].
注意事项
- 子例程中允许嵌套调用(即在表单中执行...尾部形式)。
- 递归调用也是可能的。
- 要定义本地数据,请在 FORM 之后使用 DATA 语句。每次进入子例程时,都会重新创建数据(具有初始值)并在末尾(从堆栈)释放数据。
- 要定义子例程中使用的全局数据,请在 FORM 之后使用 LOCAL 语句。这些值在输入子例程时保存,然后在末尾(从堆栈中)释放
功能模块
功能模块是任何人都可以使用的通用ABAP/4例程。事实上,有大量的标准功能模块可用。
功能模块被组织成功能组:逻辑上相关的功能的集合。函数模块始终属于函数组。
语法-
FUNCTION <function module>
<Statements>
ENDFUNCTION.
与功能模块相关的重要信息
- 管理
- 导入/更改/导出参数。
- 表参数/异常。
- 文档
- 源代码 – LU01 . 是功能组
- 全球数据 – LTOP .功能组的全局数据 - 可跨功能组中的功能模块访问。
- 主程序 – SAPL .包含该函数组的所有包含文件的列表
调用函数模块
要调用函数模块,请使用 CALL FUNCTION 语句:
CALL FUNCTION <module>
[EXPORTING f1 = a 1.... f n = a n]
[IMPORTING f1 = a 1.... f n = a n]
[CHANGING f1 = a 1.... f n = a n]
[TABLES f1 = a 1.... f n = a n]
[EXCEPTIONS e1 = r 1.... e n = r n [ERROR_MESSAGE = r E]
[OTHERS = ro]].
功能组
功能组是功能模块的容器。事实上,有大量的标准功能组。
一个功能组中的所有功能模块都可以访问该组的全局数据。
与可执行程序(类型 1)和模块池(M 类型)一样,功能组可以包含屏幕、选择屏幕和列表。
注意事项
- 无法执行函数组。
- 函数组的名称最多可包含 26 个字符。
- 创建功能组或功能模块时,将自动生成主程序和包含程序。
- 函数组封装数据。
如何创建函数组
- 转到事务 SE80。
- 在下拉列表中选择程序。
- 写下要创建的函数组的名称。通常,用户创建的函数组以“Z”开头。例如 – <Z_FUNCTION_GROUP_NAME> .打 输入 键。
- 请注意,如果用户选中创建 TOP 包含的选项,则默认情况下会创建 TOP 包含。
如何创建功能模块
-
创建一个函数组(例如“ZCAL”)。
-
创建一个函数模块,设置属性,如(函数组、应用程序、短文本和进程类型)和保存。
-
包含文件“LZCALU01”将具有第一个功能模块的源代码。
-
包含文件“LZCALTOP”将具有全局数据。
-
主程序“SAPLZCAL”包含
- 全局数据包括文件“LZCALTOP”
- 功能模块包括文件“LZCALUXX”
- 用户定义的包含文件 “LZCALF..”、“LZCALO..” 和 “LZCALI..”****
-
定义接口参数和异常
-
编写源代码
-
激活功能模块
-
测试功能模块 – 单一测试和调试
-
记录和发布功能模块
这就是ABAP中的模块化的全部内容。