ABAP 包含程序
📦 包含程序概述
定义
包含程序是用于模块化源代码的全局存储库对象,允许您在不同的程序中使用相同的源代码。
包含程序的特点
graph TD
A[包含程序] --> B[代码重用]
A --> C[模块化管理]
A --> D[有序组织]
A --> E[全局访问]
B --> B1[跨程序共享]
C --> C1[功能分离]
D --> D1[代码组织]
E --> E1[库对象]
主要作用
- 代码重用:在不同的程序中使用相同的源代码
- 有序管理:以有序的方式管理复杂的程序
- 功能分离:将不同功能的代码分离到不同的包含程序中
🔧 包含程序语法
基本语法
包含机制
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. 错误调试
- 包含程序的错误可能难以定位
- 注意包含顺序的影响
- 使用清晰的注释