ABAP 包含程序

ABAP 包含程序

📦 包含程序概述

定义

包含程序是用于模块化源代码的全局存储库对象,允许您在不同的程序中使用相同的源代码。

包含程序的特点



graph TD
    A[包含程序] --> B[代码重用]
    A --> C[模块化管理]
    A --> D[有序组织]
    A --> E[全局访问]
    
    B --> B1[跨程序共享]
    C --> C1[功能分离]
    D --> D1[代码组织]
    E --> E1[库对象]

主要作用

  1. 代码重用:在不同的程序中使用相同的源代码
  2. 有序管理:以有序的方式管理复杂的程序
  3. 功能分离:将不同功能的代码分离到不同的包含程序中

🔧 包含程序语法

基本语法

1
INCLUDE <program_name>.

包含机制

INCLUDE 语句具有与复制包含程序 <program_name> 的源代码并进入另一个程序相同的效果。

嵌套包含

包含程序也可以嵌套使用:

1
2
3
4
5
6
7
REPORT Z_MAIN_PROGRAM.

* 第一层包含
INCLUDE Z_COMMON_FUNCTIONS.

* 第二层包含(在Z_COMMON_FUNCTIONS中)
INCLUDE Z_UTILITIES.

⚠️ 包含程序限制

1. 自调用限制

  • 包含程序不能调用自己
  • 避免循环包含

2. 语句完整性

  • 包含程序必须包含完整的语句
  • 不能包含不完整的代码片段

3. 执行独立性

  • 包含程序不能独立运行
  • 必须嵌入到其他程序中

🛠️ 创建和使用包含程序

步骤1:创建包含程序

使用事务 SE38 创建程序 Z_TOBEINCLUDED

设置程序类型

将程序的类型设置为 INCLUDE 程序

步骤2:编写包含程序代码

1
2
3
4
5
PROGRAM Z_TOBEINCLUDED.

WRITE: / 'This program is started by:', SY-UNAME,
/ 'The Date is:', SY-DATUM,
/ 'Time is', SY-UZEIT.

步骤3:保存程序

点击”保存”按钮,将程序保存在包中(如 ZINCL_PCKG)。

步骤4:创建主程序

创建另一个程序 Z_INCLUDINGTEST,类型指定为可执行程序

步骤5:引用包含程序

1
2
3
4
REPORT Z_INCLUDINGTEST.

* 包含包含程序
INCLUDE Z_TOBEINCLUDED.

步骤6:执行程序

保存、激活并执行程序。

输出示例

1
2
3
This program is started by: SAPUSER
The Date is: 06.10.2015
Time is 13:25:11

💡 包含程序的使用场景

1. 通用功能库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
* 通用功能包含程序
* Z_GLOBAL_UTILS.abap
REPORT Z_GLOBAL_UTILS.

* 常用宏定义
DEFINE format_header.
ULINE.
WRITE: / &1 COLOR COL_HEADING.
ULINE.
END-OF-DEFINITION.

* 常用函数
FORM get_sy_username.
WRITE: / 'User:', SY-UNAME.
ENDFORM.
1
2
3
4
5
6
7
8
9
* 主程序
REPORT Z_MAIN.

* 包含通用功能
INCLUDE Z_GLOBAL_UTILS.

START-OF-SELECTION.
format_header '系统信息'.
PERFORM get_sy_username.

2. 数据定义

1
2
3
4
5
6
7
8
* 常量定义
* Z_CONSTANTS.abap
REPORT Z_CONSTANTS.

CONSTANTS: c_true TYPE abap_bool VALUE abap_true,
c_false TYPE abap_bool VALUE abap_false.

DATA: gv_max_lines TYPE i VALUE 1000.
1
2
3
4
5
6
7
8
9
10
11
* 主程序
REPORT Z_DATA_PROGRAM.

* 包含常量定义
INCLUDE Z_CONSTANTS.

START-OF-SELECTION.
WRITE: / '最大行数:', gv_max_lines.
IF c_true = abap_true.
WRITE: / '常量定义成功'.
ENDIF.

3. 类定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
* 类定义
* Z_CLASSES.abap
REPORT Z_CLASSES.

* 全局类定义
CLASS lcl_utility DEFINITION.
PUBLIC SECTION.
METHODS: display_info
IMPORTING
iv_text TYPE string.
ENDCLASS.

CLASS lcl_utility IMPLEMENTATION.
METHOD display_info.
WRITE: / iv_text.
ENDMETHOD.
ENDCLASS.
1
2
3
4
5
6
7
8
9
* 使用类的主程序
REPORT Z_CLASS_USER.

* 包含类定义
INCLUDE Z_CLASSES.

START-OF-SELECTION.
DATA(lo_util) = NEW lcl_utility( ).
lo_util->display_info( 'Hello from Class' ).

🎯 包含程序的最佳实践

1. 命名规范

程序类型 前缀 示例 说明
通用功能 Z_ Z_GLOBAL_UTILS 全局通用功能
特定功能 Z_ Z_SALES_UTILS 销售相关功能
数据定义 Z_ Z_FINANCE_CONST 财务常量
类定义 Z_ Z_ABAP_CLASSES ABAP类定义

2. 组织结构

1
2
3
4
5
6
7
* 推荐的包含程序组织
Z_BASE # 基础功能和常量
Z_UTILS # 通用工具函数
Z_CONSTANTS # 系统常量
Z_CLASSES # 类定义
Z_FORMS # 子程序定义
Z_MACROS # 宏定义

3. 依赖管理

  • 避免循环包含
  • 明确包含顺序
  • 减少不必要的依赖

🔗 包含程序 vs 其他模块化方式

方式 作用域 重用性 维护性 适用场景
包含程序 程序间 集中 通用代码
子程序 程序内 程序内 简单功能
功能模块 全局 很高 集中 复杂功能
全局 很高 面向对象 OOP编程

⚠️ 使用注意事项

1. 性能考虑

  • 包含程序在编译时展开
  • 过多的包含可能影响编译速度
  • 避免重复包含

2. 代码管理

  • 保持包含程序的简洁
  • 单一职责原则
  • 版本控制

3. 错误调试

  • 包含程序的错误可能难以定位
  • 注意包含顺序的影响
  • 使用清晰的注释