关于 badi-enhancement
badi-enhancement 是面向 SAP ABAP 开发者的扩展框架指南,涵盖 BAdI 的查找、创建与实现,并按 clean core 等级说明各类扩展技术的取舍。
主要功能
- 01查找与实现现有 BAdI
- 02创建自定义 BAdI
- 03比较新旧 BAdI 框架
- 04按 clean core 等级分类扩展技术
- 05介绍 ATC 检查与治理
适用场景
- 01为 SAP 标准功能选择扩展方式
- 02将修改或隐式增强替换为 BAdI
- 03在 ABAP Cloud 或 RAP 场景评估 BAdI
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ likweitan/ abap-skills --skill badi-enhancement安装后在 Claude Code 中输入/badi-enhancement确认已加载。
附带文件references/badi-patterns.md
详细介绍
BAdI 与增强框架
本指南介绍如何使用 BAdI(业务加载项)和 ABAP 增强框架扩展 SAP 标准功能,并对每种技术进行清洁核心级别分类。
根据清洁核心级别概念,BAdI 是唯一推荐使用的增强技术。ATC 检查
SYCM_ALLOWED_ENH_TECHNOLOGY会将基于其他任何技术构建的ENHO增强报告为**优先级 1(级别 D)**问题。
工作流
-
确定用户的目标:
- 查找现有 BAdI 并实现
- 创建自定义 BAdI 定义
- 实现 BAdI
- 将修改或隐式增强替换为 BAdI
- 了解经典增强框架与新增强框架的区别
- 使用关键用户扩展性
- 对增强进行清洁核心级别分类
-
确定框架:
- 新 BAdI 框架(首选,兼容 ABAP Cloud)
- 经典 BAdI 框架(旧版,
SE18/SE19) - 增强点和增强实现
- 关键用户扩展性(无代码)
-
使用下表对清洁核心级别进行分类
-
引导实现采用适用的最高级别
按增强技术划分的 Clean Core 级别
| 技术 | 级别 | 指导建议 |
|---|---|---|
| 关键用户扩展性 | A | 对于紧密耦合的扩展(自定义字段、自定义逻辑、自定义 CDS 视图),从这里开始 |
| 已发布的 BAdI | A | 首选的基于代码的扩展点 |
| 已发布的扩展包含 | A | 在数据库表和 CDS 视图上添加自定义字段的首选技术 |
| 已发布的扩展点 / RAP BO | A | 用于扩展基于 RAP 的 SAP Fiori 应用 |
| CDS 扩展 / 元数据扩展 | A/B | 扩展 SAP CDS 视图,而非修改它们 |
| 未发布的 BAdI | B | 即使尚未发布以用于云开发,也适用于经典扩展。请留意其发布情况 |
用户出口(VOFM、SAPMV45A) | B | SAP 预定义的代码段稳定,通常能经受升级。从技术上讲,这属于修改 |
| 客户出口(SMOD/CMOD) | B | BAdI 的前身。仅在没有 BAdI 时使用——未来版本中可能会被替换 |
| 未发布的扩展包含 | B | 可以接受;请留意是否有已发布的扩展包含可用 |
| DDIC 附加(CI / EEW 包含) | B | 通过客户包含或扩展包含添加字段 |
| 域值附加、搜索帮助附加/出口 | B | 可接受的经典扩展技术 |
| OData 服务重新定义 | B | 重新定义,而非修改 |
| 数据库表上的经典附加 | C | 请留意扩展包含何时可用,并相应调整 |
| 显式增强点 | B/D | 仅用于特殊情况,以包含自定义 BAdI。不要直接在增强点中放置扩展代码 |
| 隐式增强点 | D | 类似于修改——不要使用 |
| 源代码插件 | D | ATC 优先级为 1 的发现项——删除并改用 BAdI |
| 标记为 SAP 内部的 BAdI | D | 仅用于特殊情况 |
| 修改 | D | 完全避免。如果无法避免,请使用修改助手并通过 ATC 管理 |
一般规则:不要修改 SAP 对象。如有修改,请检查是否可以用已发布或经典 BAdI 替代。
ATC 治理
| ATC 检查 | 技术名称 | 报告内容 |
|---|---|---|
| 允许的增强技术 | SYCM_ALLOWED_ENH_TECHNOLOGY | 在不允许的技术上进行的 ENHO 增强——仅推荐使用 BAdI |
| 搜索客户修改 | CI_SEARCH_CUST_MODIFICATIONS | 已修改的对象(每个对象一条结果);检查 ABAP Cloud 对象类型支持情况 |
两项检查都会产生**优先级 1(错误)**结果,对应 D 级。如果无法使用这些检查,请实施 SAP Note 3565942。
BAdI 框架概述
新版与经典 BAdI
| 方面 | 新版 BAdI 框架 | 经典 BAdI 框架 |
|---|---|---|
| 事务 | ADT 或 SE18/SE19 | SE18/SE19 |
| 增强点 | 必需的容器 | 不适用 |
| 多重使用 | 始终支持多重使用 | 可配置 |
| 筛选器 | 支持筛选器类型 | 筛选器值 |
| 回退类 | 支持 | 不可用 |
| ABAP Cloud | 支持(仅限已发布的 BAdI) | 不可用 |
| Clean Core 级别 | 若已发布则为 A 级,否则为 B 级 | B 级(若标记为 SAP 内部,则为 D 级) |
| 建议 | 所有新开发均使用 | 仅维护现有实现 |
创建自定义 BAdI
步骤 1:创建增强点
ADT: New → Other ABAP Repository Object → Enhancements → Enhancement Spot
Name: Z_ENH_SPOT_TRAVEL
步骤 2:定义 BAdI 接口
INTERFACE zif_badi_travel_validate
PUBLIC.
METHODS validate
IMPORTING
is_travel TYPE zstravel
CHANGING
ct_messages TYPE bapiret2_t
RAISING
cx_badi_not_implemented.
ENDINTERFACE.
步骤 3:在增强点中定义 BAdI
在增强点中添加 BAdI 定义:
| 属性 | 值 |
|---|---|
| BAdI 名称 | ZBADI_TRAVEL_VALIDATE |
| 接口 | ZIF_BADI_TRAVEL_VALIDATE |
| 多重使用 | 是(允许多个实现) |
| 回退类 | ZCL_BADI_TRAVEL_FALLBACK(可选) |
步骤 4:创建回退类(可选)
CLASS zcl_badi_travel_fallback DEFINITION
PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES zif_badi_travel_validate.
ENDCLASS.
CLASS zcl_badi_travel_fallback IMPLEMENTATION.
METHOD zif_badi_travel_validate~validate.
"Default behavior when no implementation is active
ENDMETHOD.
ENDCLASS.
步骤 5:在代码中调用 BAdI
"Get BAdI handle
DATA lo_badi TYPE REF TO zif_badi_travel_validate.
GET BADI lo_badi.
"Call BAdI — loops through all active implementations
CALL BADI lo_badi->validate
EXPORTING is_travel = ls_travel
CHANGING ct_messages = lt_messages.
使用筛选器
"Define BAdI with filter
"In Enhancement Spot: add filter type COUNTRY (type LAND1)
"Get BAdI with filter
GET BADI lo_badi
FILTERS country = ls_travel-country.
CALL BADI lo_badi->validate
EXPORTING is_travel = ls_travel
CHANGING ct_messages = lt_messages.
实现现有 BAdI
步骤 1:查找 BAdI
查找 BAdI 的方法:
- ADT 搜索:搜索 BAdI 名称或增强点
- 事务
SE18:浏览 BAdI 定义 - 在
GET BADI上设置断点:在CL_BADI_INTERNAL_FACTORY=>GET_BADI处设置断点,以查找流程中调用的 BAdI - 文档:查阅 SAP 文档或社区,获取 BAdI 名称
步骤 2:创建增强实现
ADT: New → Other ABAP Repository Object → Enhancements → Enhancement Implementation
Name: Z_ENH_IMPL_TRAVEL_CHECK
Enhancement Spot: Z_ENH_SPOT_TRAVEL (or SAP's spot)
步骤 3:创建 BAdI 实现类
CLASS zcl_badi_impl_travel_check DEFINITION
PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES zif_badi_travel_validate.
ENDCLASS.
CLASS zcl_badi_impl_travel_check IMPLEMENTATION.
METHOD zif_badi_travel_validate~validate.
"Custom validation logic
IF is_travel-begin_date < cl_abap_context_info=>get_system_date( ).
APPEND VALUE #(
type = 'E'
id = 'Z_TRAVEL'
number = '001'
message_v1 = 'Travel begin date must be in the future'
) TO ct_messages.
ENDIF.
ENDMETHOD.
ENDCLASS.
ABAP Cloud / RAP 中的 BAdI
在 ABAP for Cloud Development 中,BAdI 遵循特定模式:
已发布的 BAdI——A 级
- 在 ABAP Cloud 中,只能实现 SAP 已发布的 BAdI
- 在 ADT 中搜索已发布的 BAdI:
api:badi - 常用于 RAP 场景,用于扩展标准 RAP BO
- 以编程方式验证发布状态:
SELECT SINGLE *
FROM i_apistateofrepositoryobject
WHERE ObjectType = 'SXSD' "BAdI definition
AND ObjectName = 'MY_BADI'
AND ReleaseState = 'RELEASED'
INTO @DATA(ls_state).
RAP BAdI 模式
"BAdI for extending SAP Fiori apps / RAP BOs
"Implement the released BAdI interface
CLASS zcl_my_rap_badi DEFINITION
PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_some_released_badi.
ENDCLASS.
CLASS zcl_my_rap_badi IMPLEMENTATION.
METHOD if_some_released_badi~some_method.
"Custom logic
ENDMETHOD.
ENDCLASS.
动态 BAdI 调用
"Dynamic GET BADI with BAdI name in variable
DATA lo_badi TYPE REF TO cl_badi_base.
DATA(lv_badi_name) = 'ZBADI_MY_BADI'.
GET BADI lo_badi TYPE (lv_badi_name).
"Dynamic CALL BADI with method name in variable
CALL BADI lo_badi->('VALIDATE')
EXPORTING is_data = ls_data.
增强点与实现
除了 BAdI,增强框架还支持以下技术。请注意每项技术的 Clean Core 级别——大多数为 D 级,必须避免使用。
显式增强点——B/D 级
SAP 在标准代码中定义了可插入自定义逻辑的显式位置。这些位置主要用于支持行业特定的调整。
指导原则:仅在特殊情况下使用,且仅用于将自定义定义的 BAdI 纳入 SAP 核心。不要直接在增强点中放置扩展代码。
"In SAP standard code:
ENHANCEMENT-POINT z_enh_point SPOTS z_enh_spot.
"In your enhancement implementation:
ENHANCEMENT z_my_enhancement.
"Preferred: delegate to a custom BAdI rather than inlining logic
DATA lo_badi TYPE REF TO zif_badi_my_logic.
GET BADI lo_badi.
CALL BADI lo_badi->process CHANGING cs_data = ls_data.
ENDENHANCEMENT.
显式增强区段——B/D 级
"SAP code with replaceable section:
ENHANCEMENT-SECTION z_section SPOTS z_enh_spot.
"Default code (can be replaced)
lv_result = lv_a + lv_b.
END-ENHANCEMENT-SECTION.
"Your replacement:
ENHANCEMENT z_my_section_impl.
"Custom replacement code
lv_result = lv_a * lv_b.
ENDENHANCEMENT.
隐式增强 — D 级,不要使用
隐式增强点(位于方法、表单和程序的开头或结尾)在技术上等同于修改。SYCM_ALLOWED_ENH_TECHNOLOGY 会将其报告为**优先级 1(错误)**问题。
补救措施:删除增强实现,改用已发布的 BAdI 或经典 BAdI。
修改 — D 级,完全避免
如果无法避免修改:
- 使用修改助手,以便在升级后仍能轻松进行调整
- 通过
CI_SEARCH_CUST_MODIFICATIONSATC 检查进行管理 - SAP Note 中的修正纳入核心后,重置相应修改
补救措施:检查是否可以用已发布的 BAdI 或经典 BAdI 替代修改。
用户出口和客户出口 — B 级
- 用户出口(VOFM、
SAPMV45A):SAP 命名空间中的预定义 SAP 代码部分(表单例程、包含程序)。它们稳定,通常能经受升级,但在技术上仍被视为修改。请关注是否可以用已发布的 BAdI 替代。 - 客户出口(SMOD/CMOD):BAdI 的前身技术。在尚无 BAdI 的特殊情况下可以使用;大多数客户出口将在后续版本中被替代。
结构扩展技术
除业务逻辑外,以下技术还可扩展 SAP 数据结构和服务:
DDIC — A/B/C 级
- 已发布的扩展包含(EEW)→ A 级,优先采用
- 非已发布结构/表上的客户包含(CI 包含)→ B 级
- 数据库表上的经典追加结构 → C 级;请关注是否有已发布的扩展包含
- 域值追加、搜索帮助追加、搜索帮助出口 → B 级
CDS — A/B 级
- 使用 CDS 扩展,而非修改 SAP CDS 视图
- 使用 CDS 元数据扩展更改 UI 注解
OData — B 级
- 使用 OData 服务的重新定义,而非修改服务
关键用户扩展性 — A 级
可通过 SAP Fiori 使用的无代码/低代码扩展功能。这是紧密耦合扩展的起点。
| 功能 | 描述 |
|---|---|
| 自定义字段 | 向标准业务对象添加字段 |
| 自定义逻辑 | 通过 BRF+ 添加校验/判定逻辑 |
| 自定义 CDS 视图 | 创建简单的分析视图 |
| 自定义业务对象 | 创建简单的事务对象 |
| 自定义分析查询 | 基于现有 CDS 视图构建查询 |
查找扩展点:使用扩展注册表(事务 SEEA / 扩展点注册表),查找系统中注册的所有扩展点。
当需求对关键用户扩展性而言过于复杂时,可转向开发人员扩展性(ABAP Cloud)——仍为 A 级。
替换 D 级增强
| 现有 D 级技术 | 替代方案 |
|---|---|
| 修改 | 已发布的 BAdI → 经典 BAdI → 关键用户扩展性 |
| 隐式增强 | 已发布的 BAdI → 经典 BAdI |
| 含内联代码的显式增强 | 将代码移入从增强中调用的自定义 BAdI |
| 源代码插件 | 已发布或经典 BAdI |
| SAP 内部标记的 BAdI 实现 | 查找其他已发布或经典扩展点 |
| SAP Note 手动修正 | 修正随核心版本发布后,重置修改 |
修复工作流:
- 运行
SYCM_ALLOWED_ENH_TECHNOLOGY和CI_SEARCH_CUST_MODIFICATIONS - 对每个优先级为 1 的发现项,搜索已发布的 BAdI(在 ADT 中使用
api:badi) - 如果没有已发布的 BAdI,搜索经典 BAdI(B 级)
- 如果两者都不存在,可考虑关键用户扩展性,或在显式增强点中创建自定义 BAdI
- 删除 D 级实现并迁移逻辑
- 重新运行 ATC,确认问题已解决
最佳实践
- BAdI 是唯一推荐的增强技术——其他技术最多也只是 B 级
- 优先选择已发布的 BAdI(A 级),而非未发布的 BAdI(B 级)
- 优先选择新 BAdI 框架,而非经典 BAdI
- 切勿使用隐式增强或修改(D 级)
- 对于紧密耦合的扩展,从关键用户扩展性(A 级)入手
- 使用筛选条件,将实现限定在特定上下文中
- 实现回退类,提供默认行为
- 保持实现聚焦——每个实现只处理一个关注点
- 为 BAdI 编写清晰的接口文档
- 使用 ABAP Unit 独立测试实现
- 在 ABAP Cloud 中,只实现已发布的 BAdI
- 通过 ATC 实施治理——对优先级为 1 和 2 的发现项阻止传输发布
输出格式
在帮助处理 BAdI/增强相关主题时,按以下结构组织回复:
## BAdI / Enhancement Guidance
### Framework
- Type: [New BAdI / Classic BAdI / Enhancement Spot / Key User]
- Clean core level: [A / B / C / D]
- Context: [ABAP Cloud / Classic ABAP]
### Implementation
[Step-by-step with code examples]
### Expected ATC Findings
- [Check name, priority, and level, if any]
### Testing
[How to verify the enhancement works]
参考资料
- Clean Core Extensibility Whitepaper — clean core 级别概念
- Extend SAP S/4HANA in the cloud and on premise with ABAP based extensions(版本 2.3,2025 年 8 月)
- BAdI Cheat Sheet: https://github.com/SAP-samples/abap-cheat-sheets/blob/main/35_BAdIs.md
- Enhancement Framework: https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/enhancement
- Key User Extensibility: https://help.sap.com/docs/sap-s4hana-cloud/extensibility
- SAP Note 3565942 — 提供
SYCM_ALLOWED_ENH_TECHNOLOGY
详细参考
- BAdI 模式:阅读
references/badi-patterns.md,了解实现模式、筛选条件、回退类和测试
相关技能
- abap-cloud:用于了解 clean core 级别定义,以及哪些 BAdI 已发布
- abap-cloud-migration:用于替换 D 级修改和增强
- atc-cloudification:用于配置
SYCM_ALLOWED_ENH_TECHNOLOGY治理 - rap:用于为 SAP Fiori 应用实现已发布的 RAP BAdI
- authorization-iam:用于为增强功能设置授权