ABAP 中的模块化:宏、子程序和功能模块 -04

当您模块化源代码时,您将一系列 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.

包括程序

包含程序仅用于模块化源代码,没有参数接口。 包含程序允许您在不同的程序中使用相同的源代码。 如果您想在不同的程序中使用冗长的数据声明,它们会很有用

Include <include program Name>

点需要注意

包含程序不能调用自己。

包含程序必须包含完整的语句

INCLUDE ZILX0004.

WRITE: / 'User', SY-UNAME,/ 'Date', SY-DATUM.

================================

PROGRAM ZRPM0001.

INCLUDE ZILX0004.

子例程

子例程是可以在任何ABAP程序中定义的过程,也可以从任何程序中调用。子例程通常在内部调用,也就是说,它们包含经常在本地使用的代码段或算法。如果您希望某个功能在整个系统中可重用,请使用功能模块。

FORM <Subroutine> [<pass>].

<Statement block>.

ENDFORM.
<子例程> =子例程名称
<pass> =传递的参数

子程序的类型

  1. 内部的
  • 在被调用的同一程序中定义的子程序。
  • 可以访问主 ABAP/4 程序中声明的所有数据对象。
  1. 外部的
  • 在被调用程序之外定义的子程序。
  • 需要使用 选项或在内存的公共部分声明数据对象。

调用子程序

内部子程序

PERFORM <subroutine> [<pass>]
<子例程> =子例程名称
<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 … ENDFORM 中执行)。
  • 递归调用也是可能的。
  • 要定义本地数据,请在 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 个字符。
  • 创建功能组或功能模块时,会自动生成主程序和包含程序。
  • 函数组封装数据。

如何创建功能组

  1. 转到事务 SE80。
  2. 在下拉菜单中选择程序。
  3. 写下您要创建的功能组的名称。 通常用户制作的功能组以“Z”开头。 例如 - <Z_FUNCTION_GROUP_NAME> 。 按回车键。
  4. 请注意,如果用户选中创建 TOP 包含的选项,则默认创建 TOP 包含。

如何创建功能模块

  1. 创建一个函数组(比如“ ZCAL ”)。
  2. 创建一个功能模块,设置属性(功能组、应用程序、短文本和进程类型)并保存。
  3. 包含文件“ LZCALU01 ”将包含第一个功能模块的源代码。
  4. 包含文件“ LZCALTOP ”将有全局数据。
  5. 主程序“ SAPLZCAL ”包含
  • 全局数据包含文件“ LZCALTOP ”
  • 功能模块包括文件“ LZCALUXX ”
  • 用户定义的包含文件“ LZCALF …”、“ LZCALO …”和“ LZCALI …”
  1. 定义接口参数和异常
  2. 编写源代码
  3. 激活功能模块
  4. 测试功能模块——单次测试和调试
  5. 记录和发布功能模块
    这就是 ABAP 中的模块化。