mcpField
B
badi-enhancement

badi-enhancement

github.com/likweitan开发7291 次安装2 周前更新
代码仓库

关于 badi-enhancement

badi-enhancement 是面向 SAP ABAP 开发者的扩展框架指南,涵盖 BAdI 的查找、创建与实现,并按 clean core 等级说明各类扩展技术的取舍。

主要功能

  1. 01查找与实现现有 BAdI
  2. 02创建自定义 BAdI
  3. 03比较新旧 BAdI 框架
  4. 04按 clean core 等级分类扩展技术
  5. 05介绍 ATC 检查与治理

适用场景

  1. 01为 SAP 标准功能选择扩展方式
  2. 02将修改或隐式增强替换为 BAdI
  3. 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)**问题。

工作流

  1. 确定用户的目标:

    • 查找现有 BAdI 并实现
    • 创建自定义 BAdI 定义
    • 实现 BAdI
    • 将修改或隐式增强替换为 BAdI
    • 了解经典增强框架与新增强框架的区别
    • 使用关键用户扩展性
    • 对增强进行清洁核心级别分类
  2. 确定框架:

    • 新 BAdI 框架(首选,兼容 ABAP Cloud)
    • 经典 BAdI 框架(旧版,SE18/SE19)
    • 增强点和增强实现
    • 关键用户扩展性(无代码)
  3. 使用下表对清洁核心级别进行分类

  4. 引导实现采用适用的最高级别

按增强技术划分的 Clean Core 级别

技术级别指导建议
关键用户扩展性A对于紧密耦合的扩展(自定义字段、自定义逻辑、自定义 CDS 视图),从这里开始
已发布的 BAdIA首选的基于代码的扩展点
已发布的扩展包含A在数据库表和 CDS 视图上添加自定义字段的首选技术
已发布的扩展点 / RAP BOA用于扩展基于 RAP 的 SAP Fiori 应用
CDS 扩展 / 元数据扩展A/B扩展 SAP CDS 视图,而非修改它们
未发布的 BAdIB即使尚未发布以用于云开发,也适用于经典扩展。请留意其发布情况
用户出口(VOFM、SAPMV45A)BSAP 预定义的代码段稳定,通常能经受升级。从技术上讲,这属于修改
客户出口(SMOD/CMOD)BBAdI 的前身。仅在没有 BAdI 时使用——未来版本中可能会被替换
未发布的扩展包含B可以接受;请留意是否有已发布的扩展包含可用
DDIC 附加(CI / EEW 包含)B通过客户包含或扩展包含添加字段
域值附加、搜索帮助附加/出口B可接受的经典扩展技术
OData 服务重新定义B重新定义,而非修改
数据库表上的经典附加C请留意扩展包含何时可用,并相应调整
显式增强点B/D仅用于特殊情况,以包含自定义 BAdI。不要直接在增强点中放置扩展代码
隐式增强点D类似于修改——不要使用
源代码插件DATC 优先级为 1 的发现项——删除并改用 BAdI
标记为 SAP 内部的 BAdID仅用于特殊情况
修改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/SE19SE18/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_MODIFICATIONS ATC 检查进行管理
  • 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 手动修正修正随核心版本发布后,重置修改

修复工作流:

  1. 运行 SYCM_ALLOWED_ENH_TECHNOLOGY 和 CI_SEARCH_CUST_MODIFICATIONS
  2. 对每个优先级为 1 的发现项,搜索已发布的 BAdI(在 ADT 中使用 api:badi)
  3. 如果没有已发布的 BAdI,搜索经典 BAdI(B 级)
  4. 如果两者都不存在,可考虑关键用户扩展性,或在显式增强点中创建自定义 BAdI
  5. 删除 D 级实现并迁移逻辑
  6. 重新运行 ATC,确认问题已解决

最佳实践

  1. BAdI 是唯一推荐的增强技术——其他技术最多也只是 B 级
  2. 优先选择已发布的 BAdI(A 级),而非未发布的 BAdI(B 级)
  3. 优先选择新 BAdI 框架,而非经典 BAdI
  4. 切勿使用隐式增强或修改(D 级)
  5. 对于紧密耦合的扩展,从关键用户扩展性(A 级)入手
  6. 使用筛选条件,将实现限定在特定上下文中
  7. 实现回退类,提供默认行为
  8. 保持实现聚焦——每个实现只处理一个关注点
  9. 为 BAdI 编写清晰的接口文档
  10. 使用 ABAP Unit 独立测试实现
  11. 在 ABAP Cloud 中,只实现已发布的 BAdI
  12. 通过 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]

参考资料

详细参考

  • 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:用于为增强功能设置授权

评论

支持 Markdown