目录
ABAP 第三代输出接口 BAdIs(BusinessAdd-Ins)
ABAP入门01
ABAP入门02
ABAP入门03
ABAP入门04
ABAP 对象事件
概念
- 定义:事件是类中声明的 “触发器”,用于在特定条件下自动调用其他类中的 “事件处理程序方法”。事件与处理程序的关联在运行时动态建立,而非编译时固定。
- 特点:
- 事件由某个类(触发类)定义,由其他类(处理类)中的方法响应。
- 事件仅包含输出参数,通过
RAISE EVENT传递给处理程序。 - 一个事件可关联多个处理程序,触发时所有关联的处理程序都会执行。
关键要素
- 事件声明:在触发类中用
EVENTS关键字声明,如EVENTS: CUTOFF.。 - 事件处理程序方法:在处理类中用
FOR EVENT <事件名> OF <触发类名>声明,用于响应事件,如METHODS: handling_CUTOFF FOR EVENT CUTOFF OF CL_main.。 - 关联事件与处理程序:通过
SET HANDLER <处理程序方法> FOR <触发类对象>动态建立关联,指定 “哪个处理程序响应哪个对象的事件”。 - 触发事件:在触发类中用
RAISE EVENT <事件名>语句,当满足特定条件时触发,如IF num2 ≥ 2. RAISE EVENT CUTOFF. ENDIF.。
对比普通方法调用
- 普通方法:调用者主动指定调用哪个对象的哪个方法(“调用者主导”)。
- 事件处理:处理程序提前注册关联事件,事件触发时自动执行(“事件主导”,动态绑定)。
示例程序
* 声明可执行程序 ZEVENT1
REPORT ZEVENT1.
* 定义触发事件的类 CL_main(事件的声明和触发逻辑在此类中)
CLASS CL_main DEFINITION.
PUBLIC SECTION.
DATA: num1 TYPE I. " 类的公共属性,用于存储数据
METHODS: PRO IMPORTING num2 TYPE I. " 公共方法 PRO,接收输入参数 num2
EVENTS: CUTOFF. " 声明事件 CUTOFF(在满足条件时触发)
ENDCLASS.
* 定义事件处理类 CL_eventhandler(包含响应事件的处理程序方法)
CLASS CL_eventhandler DEFINITION.
PUBLIC SECTION.
" 声明处理程序方法 handling_CUTOFF,用于响应 CL_main 类的 CUTOFF 事件
METHODS: handling_CUTOFF FOR EVENT CUTOFF OF CL_main.
ENDCLASS.
* 程序执行入口
START-OF-SELECTION.
DATA: main1 TYPE REF TO CL_main. " 定义指向 CL_main 类的引用变量
DATA: eventhandler1 TYPE REF TO CL_eventhandler. " 定义指向处理类的引用变量
CREATE OBJECT main1. " 创建 CL_main 类的实例(事件触发者)
CREATE OBJECT eventhandler1. " 创建 CL_eventhandler 类的实例(事件处理者)
" 建立关联:将 eventhandler1 的 handling_CUTOFF 方法注册为 main1 对象的 CUTOFF 事件的处理程序
SET HANDLER eventhandler1→handling_CUTOFF FOR main1.
" 调用 CL_main 类的 PRO 方法,传入参数 4
main1→PRO( 4 ).
* 实现 CL_main 类的方法(包含事件触发逻辑)
CLASS CL_main IMPLEMENTATION.
METHOD PRO. " 实现方法 PRO
num1 = num2. " 将输入参数 num2 赋值给类属性 num1
IF num2 ≥ 2. " 当 num2 大于等于 2 时(触发条件)
RAISE EVENT CUTOFF. " 触发 CUTOFF 事件
ENDIF.
ENDMETHOD.
ENDCLASS.
* 实现 CL_eventhandler 类的处理程序方法
CLASS CL_eventhandler IMPLEMENTATION.
METHOD handling_CUTOFF. " 实现响应 CUTOFF 事件的方法
WRITE: 'Handling the CutOff'. " 输出处理信息
WRITE: / 'Event has been processed'. " 换行输出事件处理完成信息
ENDMETHOD.
ENDCLASS.
输出
-
执行流程:
- 创建
CL_main(触发类)和CL_eventhandler(处理类)的实例。 - 通过
SET HANDLER关联:eventhandler1→handling_CUTOFF响应main1的CUTOFF事件。 - 调用
main1→PRO(4),因4 ≥ 2,触发CUTOFF事件。 - 事件触发后,自动执行关联的
handling_CUTOFF方法,输出结果。
- 创建
-
运行结果:
Handling the CutOff Event has been processed
ABAP 报表程序
传统报表是 ABAP 中最基础的报表形式,通过 WRITE 语句循环输出数据,特点:
- 单界面输出,无嵌套子报表。
- 依赖 事件驱动 控制逻辑(如
INITIALIZATION、TOP-OF-PAGE等),每个事件对应特定执行时机。 - 适用于简单数据展示,支持基本格式控制(颜色、位置、线条等)。
关键事件及触发时机
| 事件名 | 触发时机 |
|---|---|
INITIALIZATION | 显示选择屏幕 前 触发,用于初始化选择参数(如默认值)。 |
AT SELECTION-SCREEN | 选择屏幕上 用户输入后 触发,用于验证输入(选择屏幕仍保持激活,可报错修正)。 |
START-OF-SELECTION | 选择屏幕处理完成(用户点击执行)后 触发,主逻辑(如取数)在此实现。 |
TOP-OF-PAGE | 报表 第一行 WRITE 触发时 执行,用于绘制每页的表头(标题、列名)。 |
END-OF-PAGE | 报表 每页末尾 触发(需配合 REPORT 的 LINE-COUNT 参数),用于页脚。 |
END-OF-SELECTION | START-OF-SELECTION 执行完毕 后 触发,用于汇总或收尾操作。 |
示例
*--------------------------------------------------------------------*
* 传统报表示例:从 MARA 表取物料数据,演示事件和格式控制
*--------------------------------------------------------------------*
REPORT ZREPORT2 " 声明报表程序 ZREPORT2
LINE-SIZE 75 " 设置每行最多 75 个字符(控制行宽)
LINE-COUNT 30(3) " 每页 30 行,页脚前留 3 空行(配合 END-OF-PAGE)
NO STANDARD PAGE HEADING. " 关闭 SAP 标准表头,自定义表头
TABLES: MARA. " 声明 MARA 表(传统写法,现代推荐直接取字段)
* 定义内表结构 itab,对应 MARA 的 4 个字段
TYPES: BEGIN OF itab,
MATNR TYPE MARA-MATNR, " 物料号
MBRSH TYPE MARA-MBRSH, " 行业
MEINS TYPE MARA-MEINS, " 单位
MTART TYPE MARA-MTART, " 物料类型
END OF itab.
* 定义工作区和内表
DATA: wa_ma TYPE itab, " 工作区:存储单行数据
it_ma TYPE STANDARD TABLE OF itab. " 内表:存储查询结果
* 选择屏幕参数:必输的物料号范围
SELECT-OPTIONS: MATS FOR MARA-MATNR OBLIGATORY. " OBLIGATORY 表示必须输入
*--------------------------------------------------------------------*
* 事件 1:INITIALIZATION(选择屏幕显示前触发,初始化参数)
*--------------------------------------------------------------------*
INITIALIZATION.
MATS-LOW = '1'. " 设置物料号范围的下限为 '1'
MATS-HIGH = '500'. " 设置物料号范围的上限为 '500'
APPEND MATS. " 将默认范围追加到选择屏幕(用户可修改)
*--------------------------------------------------------------------*
* 事件 2:AT SELECTION-SCREEN(选择屏幕输入后触发,验证输入)
*--------------------------------------------------------------------*
AT SELECTION-SCREEN.
IF MATS-LOW = ' '. " 检查下限是否为空
MESSAGE I000(ZKMESSAGE). " 抛信息类 ZKMESSAGE 的 000 号消息(提示输入)
ELSEIF MATS-HIGH = ' '. " 检查上限是否为空
MESSAGE I001(ZKMESSAGE). " 抛信息类 ZKMESSAGE 的 001 号消息
ENDIF.
*--------------------------------------------------------------------*
* 事件 3:TOP-OF-PAGE(每页开头触发,绘制表头)
*--------------------------------------------------------------------*
TOP-OF-PAGE.
" 输出报表标题,COLOR 7 表示反显(深色背景),/ 表示换行
WRITE:/ 'CLASSICAL REPORT CONTAINING GENERAL MATERIAL DATA FROM THE TABLE MARA' COLOR 7.
ULINE. " 画横线(分隔标题和列头)
" 输出列标题,指定绝对列位置(如 24、38、53 列)和颜色:
" COLOR 1=红,2=绿,3=黄,4=蓝
WRITE:/ 'MATERIAL' COLOR 1, " 第 1 列:物料号(红色)
24 'INDUSTRY' COLOR 2, " 第 24 列:行业(绿色)
38 'UNITS' COLOR 3, " 第 38 列:单位(黄色)
53 'MATERIAL TYPE' COLOR 4. " 第 53 列:物料类型(蓝色)
ULINE. " 画横线(分隔列头和数据)
*--------------------------------------------------------------------*
* 事件 4:START-OF-SELECTION(主逻辑,取数并输出)
*--------------------------------------------------------------------*
START-OF-SELECTION.
" 从 MARA 表取数,按 MATS 范围筛选,结果存入内表 it_ma
SELECT MATNR MBRSH MEINS MTART
FROM MARA
INTO TABLE it_ma
WHERE MATNR IN @MATS. " @ 是 ABAP 7.4+ 的内联声明语法
" 循环内表,逐行输出数据(位置与列头对齐)
LOOP AT it_ma INTO wa_ma.
WRITE:/ wa_ma-MATNR, " 物料号(第 1 列,与标题对齐)
25 wa_ma-MBRSH, " 行业(第 25 列,比列头 24 列后移 1 列,避免重叠)
40 wa_ma-MEINS, " 单位(第 40 列,比列头 38 列后移 2 列)
55 wa_ma-MTART. " 物料类型(第 55 列,比列头 53 列后移 2 列)
ENDLOOP.
*--------------------------------------------------------------------*
* 事件 5:END-OF-SELECTION(数据处理后,输出收尾信息)
*--------------------------------------------------------------------*
END-OF-SELECTION.
ULINE. " 画横线(分隔数据和收尾信息)
" 输出报表创建完成提示,COLOR 7 反显
WRITE:/ 'CLASSICAL REPORT HAS BEEN CREATED' COLOR 7.
ULINE. " 画横线
SKIP. " 空行(增加间距)
输出

ABAP 对话框程序
对话框程序是 SAP ABAP 中用于实现多界面交互逻辑的程序类型,支持用户通过多个屏幕进行数据输入、操作和展示,适用于复杂业务流程(如数据维护、多步骤审批等)。其核心特点是:
- 由多个关联对象(屏幕、模块池、事务码等)组成,分层链接并按顺序执行。
- 依赖 ABAP 工作台工具(如 SE80)开发,确保对象间自动关联,避免手动维护依赖。
- 区别于传统报表(单界面输出),强调 “用户交互驱动”,通过屏幕间跳转实现流程化操作。
对话程序的主要组件:
| 组件 | 定义与作用 |
|---|---|
| 界面(Screens) | 用户交互的可视化界面,是对话框程序的核心载体。每个屏幕包含: - 属性:屏幕号(唯一标识,如 100、200)、类型(普通屏幕、子屏幕等)、标题等。 - 布局:通过屏幕 painter(SE51)设计,包含输入框、按钮、表格等控件。 - 字段:与 ABAP 变量或字典对象(如数据库表字段)绑定,用于数据展示 / 输入。 - 流程逻辑:定义屏幕显示和用户操作的触发逻辑,分为 PBO(Process Before Output,屏幕显示前执行)和 PAI(Process After Input,用户输入后执行)。 |
| 模块池(Module Pools) | 存储对话框程序核心逻辑的 ABAP 程序(程序类型为 M),是屏幕与业务逻辑的 “桥梁”。 - 包含模块化程序( MODULE...ENDMODULE),供屏幕流程逻辑调用。- 通常通过 INCLUDE 程序拆分代码(如定义变量、PBO/PAI 模块),提升可维护性。- 不能直接执行,必须通过事务码触发。 |
| 子程序(Subroutines) | 在模块池中定义的可复用代码块(FORM...ENDFORM),被模块(MODULE)调用,用于封装重复逻辑(如数据验证、格式转换)。 |
| 目录(Menus) | 通过菜单 painter(SE41)设计的交互菜单,包括菜单栏、工具栏、功能键(如 F3 退出),用于增强用户操作便捷性,关联事务或功能码(OK-CODE)触发对应逻辑。 |
| 事务(Transactions) | 对话框程序的 “入口”,通过事务码(如 ZDIALOG)调用程序,定义启动屏幕和初始参数。用户通过事务码直接访问程序,无需手动指定程序名。 |
ABAP 智能表单(Smart Form)
SAP 的 Smart Form(智能表单) 工具可用于打印和发送文档。该工具在为互联网开发表单、PDF 文件、电子邮件和文档时非常有用。该工具提供了一个界面来构建和维护表单的布局和逻辑。SAP 还提供了一系列业务流程表单,如客户关系管理(CRM)、销售和分销(SD)、财务会计(FI)和人力资源(HR)中使用的表单。
该工具让您可以通过使用简单的图形工具而不是使用任何编程工具来修改表单。这意味着没有编程知识的用户可以轻松地为这些表单配置业务流程的数据。
在 Smart Form 中,从静态和动态表中检索数据。表标题和小计由触发的事件指定,然后在最终输出之前对数据进行排序。Smart Form 让您可以合并可以作为表单的一部分或作为背景显示的图形。
SAP 系统中可用的标准 Smart Form 如下:
SF_EXAMPLE_01表示具有用于客户航班预订的表输出的发票。SF_EXAMPLE_02表示类似于SF_EXAMPLE_01的发票,但包含小计。SF_EXAMPLE_03指定类似于SF_EXAMPLE_02的发票,但可以在应用程序中选择多个客户。
ABAP SAPscripts
SAPscript 是 SAP 系统中用于构建和管理业务表单的工具,主要用于创建标准化的业务文档(如发票、采购订单、销售确认书等)。它提供预定义模板和设计工具,简化业务表单的开发与维护,确保文档格式统一、符合业务规范。
SAP 系统在标准客户端(Client 000)中提供了一系列预配置的标准 SAPscript 表单,可直接使用或作为自定义表单的模板。常见实例如下:
| 表单名称 | 描述 |
|---|---|
RVORDER01 | 销售订单确认表 |
RVDELNOTE | 装箱单 |
RVINVOICE01 | 发票 |
MEDRUCK | 采购订单 |
F110_PRENUM_CHCK | 预编号检查单 |
核心结构
SAPscript 表单的结构由 Content(内容) 和 Layout(布局) 两大组件构成,二者协同定义表单的显示效果:
-
Content(内容)
指表单中展示的实际信息,包括两类元素:- 文本(业务数据):如客户名称、订单号、金额等动态业务数据,通常从数据库表或变量中获取。
- 图形:如公司 Logo、水印、签章等静态图像,用于增强表单的视觉标识性。
-
Layout(布局)
指内容的排版方式,由 窗口(Windows) 定义。窗口是表单上划分的特定区域,用于控制内容的显示位置和范围。常见窗口类型包括:- 主窗口(Main Window):用于展示动态业务数据(如订单明细),内容过长时可跨页延续。
- 标题窗口(Header Window):位于页面顶部,展示固定信息(如公司名称、表单标题),每页重复显示。
- 页脚窗口(Footer Window):位于页面底部,展示页码、打印日期等页级信息,每页重复显示。
- 文本窗口(Text Window):用于展示固定文本(如条款说明),位置和内容固定。
ABAP 客户出口(Customer Exits)
客户出口(Customer Exits) 是 SAP 标准程序中预留的“钩子”(Hook),允许用户在不修改 SAP 标准代码的前提下,插入自定义业务逻辑以满足特定需求。这些出口本质上是空的功能模块/屏幕/菜单,用户可填充代码实现增强。
-
无需访问密钥:避免直接修改标准程序,确保升级兼容性。
-
业务场景适配:例如在创建销售订单时强制输入采购订单号、在发票校验中添加银行信息校验等
| 类型 | 调用方式 | 主要用途 | 示例 |
|---|---|---|---|
| 功能模块出口 | CALL CUSTOMER-FUNCTION '编号' | 在程序逻辑节点插入自定义代码 | 供应商创建时强制校验银行信息 |
| 屏幕出口 | CALL CUSTOMER-SUBSCREEN | 向标准屏幕添加自定义字段 | 在时间表录入屏幕添加合规声明 |
| 菜单出口 | +CUS(GUI 状态扩展) | 向标准菜单添加自定义选项 | 在 SE38 中添加跳转到 SE80 的菜单项 |
ABAP 用户出口(User Exits)
-
用户出口(User Exits)是 SD模块特有的增强点,用于扩展标准功能
-
当标准提取器无法提供所需数据/功能时使用(如授权检查、时间验证)
-
通过修改 SAP 标准程序实现(需访问密钥)
| 特性 | 用户出口(User Exits) | 客户出口(Customer Exits) |
|---|---|---|
| 适用范围 | 仅限SD模块 | 全模块 |
| 修改方式 | 直接修改标准程序 | 通过预留接口增强 |
| 访问控制 | 需要访问密钥 | 无需访问密钥 |
| 技术实现 | FORM USEREXIT_XXX | CALL CUSTOMER-FUNCTION |
定位路径:
IMG → Sales and Distribution → System Modifications → User Exits
关键用户出口示例(销售文档处理)
| 出口编号 | 出口名称 | 用途说明 |
|---|---|---|
| 1 | USEREXIT_FIELD_MODIFICATION | 动态修改屏幕字段属性(如必填/隐藏) |
| 2 | USEREXIT_SAVE_DOCUMENT | 在保存文档时执行操作(如日志记录) |
| 3 | USEREXIT_SAVE_DOCUMENT_PREPARE | 保存前执行检查/填充字段(如弹出确认窗口) |
| 4 | USEREXIT_MOVE_FIELD_TO_VBAK | 将用户输入数据转移到销售凭证抬头结构(VBAK) |
| 5 | USEREXIT_MOVE_FIELD_TO_VBAP | 将用户输入数据转移到销售凭证行项结构(VBAP) |
REPORT zuserexit1.
* 定义相关数据表
TABLES:
tstc, " 事务代码表
tstct, " 事务代码文本表
tadir, " 开发对象目录
trdir, " 程序属性表
tfdir, " 函数模块目录
enlfdir," 函数模块区域
modsapt," SMOD文本表
modact. " 激活的增强表
* 定义内表和工作区
DATA:
jtab LIKE tadir OCCURS 0 WITH HEADER LINE, " 存储找到的出口对象
field1(30), " 光标字段存储
v_devclass LIKE tadir-devclass. " 开发类存储
* 输入参数:事务代码
PARAMETERS:
p_tcode LIKE tstc-tcode OBLIGATORY. " 强制输入事务代码
* 主逻辑开始
START-OF-SELECTION.
* 检查事务代码是否存在
SELECT SINGLE * FROM tstc WHERE tcode EQ p_tcode.
IF sy-subrc EQ 0. " 事务代码存在
* 查找事务代码对应的程序对象
SELECT SINGLE * FROM tadir
WHERE pgmid = 'R3TR'
AND object = 'PROG'
AND obj_name = tstc-pgmna.
* 获取开发类
IF sy-subrc EQ 0.
MOVE tadir-devclass TO v_devclass.
ELSE.
* 如果是函数组
SELECT SINGLE * FROM trdir WHERE name = tstc-pgmna.
IF trdir-subc EQ 'F'. " 函数组标识
SELECT SINGLE * FROM tfdir WHERE pname = tstc-pgmna.
SELECT SINGLE * FROM enlfdir WHERE funcname = tfdir-funcname.
SELECT SINGLE * FROM tadir
WHERE pgmid = 'R3TR'
AND object = 'FUGR'
AND obj_name EQ enlfdir-area.
MOVE tadir-devclass TO v_devclass.
ENDIF.
ENDIF.
* 查询该开发类下的所有用户出口
SELECT * FROM tadir
INTO TABLE jtab
WHERE pgmid = 'R3TR'
AND object = 'SMOD'
AND devclass = v_devclass.
* 获取事务代码描述
SELECT SINGLE * FROM tstct
WHERE sprsl EQ sy-langu
AND tcode EQ p_tcode.
* 输出事务代码信息
FORMAT COLOR COL_POSITIVE INTENSIFIED OFF.
WRITE: /(19) 'Transaction Code - ',
20(20) p_tcode,
45(50) tstct-ttext.
SKIP.
* 显示找到的出口
IF NOT jtab[] IS INITIAL.
* 输出表头
WRITE: /(95) sy-uline.
FORMAT COLOR COL_HEADING INTENSIFIED ON.
WRITE: /1 sy-vline,
2 'Exit Name',
21 sy-vline,
22 'Description',
95 sy-vline.
WRITE: /(95) sy-uline.
* 遍历输出每个出口
LOOP AT jtab.
SELECT SINGLE * FROM modsapt
WHERE sprsl = sy-langu
AND name = jtab-obj_name.
FORMAT COLOR COL_NORMAL INTENSIFIED OFF.
WRITE: /1 sy-vline,
2 jtab-obj_name HOTSPOT ON, " 热点可点击
21 sy-vline,
22 modsapt-modtext,
95 sy-vline.
ENDLOOP.
WRITE: /(95) sy-uline.
* 显示出口数量
DESCRIBE TABLE jtab.
SKIP.
FORMAT COLOR COL_TOTAL INTENSIFIED ON.
WRITE: / 'No of Exits:', sy-tfill.
ELSE.
* 无出口提示
FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
WRITE: /(95) 'User Exit doesn''t exist'.
ENDIF.
ELSE.
* 事务代码不存在提示
FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
WRITE: /(95) 'Transaction Code Does Not Exist'.
ENDIF.
* 行选择事件处理
AT LINE-SELECTION.
GET CURSOR FIELD field1.
CHECK field1(4) EQ 'JTAB'. " 检查是否点击出口名称列
* 设置参数并调用SMOD事务码
SET PARAMETER ID 'MON' FIELD sy-lisel+1(10).
CALL TRANSACTION 'SMOD' AND SKIP FIRST SCREEN. " 直接跳转到增强点
ABAP 第三代输出接口 BAdIs(BusinessAdd-Ins)
BAdIs (业务插件) 是 SAP 提供的预定义扩展点,允许在不修改标准代码的前提下增强 SAP 应用功能。类似于 Excel 加载项对 Excel 的扩展。
| 代数 | 技术 | 特点 |
|---|---|---|
| 第一代 | User Exits | 直接修改标准程序 |
| 第二代 | Customer Exits | 通过函数模块接口扩展 |
| 第三代 | BAdIs | 基于面向对象的标准化增强框架 |
//TODO
ABAP Web Dynpro
Web Dynpro(WD)是 SAP 推出的标准用户界面技术,用于在 ABAP 环境中开发基于 Web 的应用程序。它提供前端 Web 界面,可直接连接 SAP R/3 后端系统,访问数据和功能,支持报告、业务操作等场景。
核心架构:MVC 模型
Web Dynpro 应用程序基于模型 - 视图 - 控制器(MVC) 架构设计,各组件职责明确:
| 组件 | 作用 |
|---|---|
| 模型(Model) | 定义与后端系统的接口,负责访问和管理数据(如 SAP R/3 系统数据)。 |
| 视图(View) | 负责数据在 Web 浏览器中的展示,定义用户界面布局(如输入框、按钮、表格)。 |
| 控制器(Controller) | 位于模型与视图之间,处理业务逻辑: - 格式化模型数据供视图显示; - 接收用户输入(如点击按钮),并同步到模型。 |
关键组件与对象
-
Web Dynpro 组件(Component)
- 是应用程序的全局单元,开发 Web Dynpro 应用的起点。
- 可包含多个视图(View),并通过窗口组装这些视图。
- 存储应用程序的管理信息(描述、创建人、开发包等)。
-
Web Dynpro 窗口(Window)
- 每个组件至少包含一个窗口,用于嵌入并展示所有视图,是前端显示的容器。
- 在 ABAP 工作台的 “窗口编辑器” 中设计,定义视图的组合方式和导航逻辑。
-
Web Dynpro 应用程序(Application)
- 是独立的 ABAP 工作台对象,作为用户访问的入口。
- 通过 “界面视图” 与窗口交互,将窗口内容暴露给前端用户。

2106

被折叠的 条评论
为什么被折叠?



