SAP ABAP应用 INCLUDE语句
我们在SAP自定义事务程序中,经常看到如下语句显示:
REPORT ZMM188.
INCLUDE zmm188_top.
INCLUDE zmm188_sel.
INCLUDE zmm188_lol.
INCLUDE zmm188_frm.
INCLUDE zmm188_pbo.
INCLUDE zmm188_pai.
我是一个不太懂ABAP SQL的小白,初看充满疑惑,INCLUDE语句后缀“_***”到底是啥意思,有什么作用。于是,自己也就参照公司程序和网上资料去学习、理解、整理。下面就一起分享一下我理解的INCLUDE 语句。资料解析ABAP中通过INCLUDE语句搭建模块化设计,通过将程序拆解为功能聚焦的代码片段。INCLUDE语句后缀的命名规则是行业内长期形成的特性模块化约定,每个后缀对应明确的代码职责,尤其在复杂应用中能极大提升代码组织性。
一、INCLUDE语句
INCLUDE语句本质上是代码片段的动态整合设备——允许开发者将多个独立的“包含程序(include program)”嵌入主程序,在编译阶段自动拼接为完整地可执行单元。这种机制打破了“单文件”代码地局限性。
INCLUDE语句核心优势如下:
- 逻辑拆分:将大型程序按功能拆解为小型材料,避免单材料代码的冗余;
- 职责隔离:每个具备程序专注于单一效果,便于开发者快速定位目标代码;
- 协作提效:承受多开发者并行编辑不同包含程序,减少代码冲突;
- 复用赋能:通用逻辑可能通过INCLUDE在多脚本中复用;
例如:我们常见的SAP标准事务采购订单创建(T-code:ME21N)程序,是一个复杂的代码,也是一个典型的函数池程序,它通过INCLUDE串联近40个包含程序,代码体系层次清晰。
二、INCLUDE语句命名规范
ABAP开发者们经过长期实践,形成了基于后缀命名的涵盖代码规范。这些后缀不是语法强制要求,却成了行业通用的“开发共识”,使代码结构直观易懂。根据大家公司程序代码编译信息和理解,我列一下常见的后缀及其功能定位:
1、_top:全局定义区(Top Include)
- 核心作用:作为整个脚本的“基础骨架”,存放所有其他INCLUDE文件或主程序依赖的全局定义,是程序运行的基础。
- 包含内容:
- 全局变量(DATA)、常量(CONSTANTS)、宏定义(DEFINE);
- 内表类型(TYPES:BEGIN OF ty_alv,*** END OF ty_alv.)、内表(DATA:gt_alv TYPE STANDARD TABLE OF ty_alv);
- 类型引用(TYPE-POOLS);
- 消息类声明(MESSAGE-ID)、权限对象(AUTHORITY-CHECK)等;
- 特点:在程序执行顺序中_top通常是第一个被INCLUDE的材料,确保后续代码能直接使用其定义的变量和类型。
2、_sel:选择屏幕区(Selection Screen Include)
- 核心作用:专门定义用户交互的输入界面(选择屏幕),集中管理输入参数,是报表程序与用户交互的入口。
- 包含内容:
- 选择参数(PARAMETERS:p_matnr TYPE matnr DEFAULT '00000001000010'.);
- 选择选项(SELECT-OPTIONS:z_bedat FOR ekko-bedat.);
- 选择屏幕元素(如按钮、分组框、文本,例如:SELECT-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.******.SELECT-SCREEN END OF BLOCK b1.对选择屏幕区 b1做的描述,框架主题信息从text-001取得,中间包括的内容。);
- 选择屏幕事件(如AT SELECTION ON VALUE-REQUEST FOR p_matnr );
- 适用场景:主要用于REPORT类型的报表程序;模块池程序(MODULE-POOL)一般通过屏幕painter(屏幕painter是ABAP工作台中的一个设备,用于为事务创建屏幕)定义输入界面,很少使用_sel。
3、_lcl:局部类区(Local Class Include)
- 核心作用:存放程序内部使用的面向对象类,通过封装逻辑减少主程序代码冗余,提升代码面向对象特性。类(Class)是对具有相同结构和行为的对象的抽象描述。类分全局类和本地类,由属性、方法、事件等组件构成,具有封装、继承、多态等特点。
- 包含内容:
- 局部类的定义和构建(定义:Class lcx_exception DEFINITION .*******.ENDCLASS.实 现:CLASS lcx_exception IMPLEMENTATION.******.ENDCLASS. );
- 类的途径(如数据校验、ALV表明、内容提取等复用逻辑。方法用于定义类的可以执行的操 作);
- 类的属性(用于类内部数据传递。属性用于存储数据。);
- 特点:这些类仅在当前程序中可见(局部类),区别于全局类(可能跨程序调用,SE24创建)。
4、_frm:子例程区(Form Routine Include)
- 核心作用:集中存放面向过程的子例程,封装重复执行的逻辑,实现代码复用。
- 包含内容:
- 子例程(用FORM frm_up_part.*****.ENDFORM.);
- 子例程的参数;
5、_pov:值请求处理区(Process On Value-Request)
- 核心作用:专门处理用户输入时的“值帮助”逻辑,即当用户在屏幕字段或选择参数上按下F4键时,提供可选值列表,提升输入准确率和效率。
- 包含内容:
- 针对特定字段的F4帮助逻辑;
- 从数据库提取可选值、动态生成候选值(如根据用户权限过滤可选范围);
- 适用场景:适用于报表程序(选择屏幕字段)和模块池程序(屏幕输入字段)。
6、_pbo:输出处理区(Process Before Output)
- 核心作用:模块池程序(MOUDULE-POOL)中,在屏幕显示前执行的逻辑,确保屏幕按预期展示。
- 包含内容:
- MODULE定义(MODULE stutas_9000 OUTPUT. *****.ENDMODULE.);
- 屏幕元素赋值(如屏幕名称可见,用screen-name=‘VISIBLE’。控制元素显隐);
- 权限检查、数据预加载等;
- 触发时机:当用户调用事务代码(对应模块池程序)时,屏幕显示前自动执行PBO逻辑。
7、_pai:输入处理区(Process After Input)
- 核心作用:模块池程序(MOUDULE-POOL)中,用户在屏幕输入数据并触发操作(如点击按钮)后执行的逻辑,处理核心业务交互。
- 包含内容:
- MODULE定义(MODULE stutas_9000 INPUT. *****.ENDMODULE.)、绑定到屏幕的PAI 事件;
- 用户输入校验(如 IF p_matnr IS INITIAL.MESSAGE '物料号不能为空' TYPE
'E'.ENDIF.);
- 事件处理(如CASE ok_code.WHEN 'BACK' OR'RETURN' OR 'CANCEL'.LEAVE TO
SCREEN 0.WHEN OTHERS.ENDCASE.);
三、学习总结
这些后缀本质是能力模块化的命名约定,通过INCLUDE语句将不同职责的代码拆分到独立文件,实现“分文件编码”的效果。例如:一个完整地模块池程序通常按“定义(_top)→选择屏幕(_sel)→局部类(_lcl)→子例程(_frm)→值帮助(_pov)→输入后处理(_pbo)→输出前处理(_pai)”的顺序INCLUDE这些文件,让开发者、维护者能快速定位代码特性,大幅提升复杂程序的可维护性。