mcpField
A
abap-cloud

abap-cloud

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

关于 abap-cloud

abap-cloud 是面向 ABAP Cloud 开发者及 SAP 扩展评估团队的开发指南,介绍 clean core A–D 级别、开发模式选择、API 限制,以及在 ABAP Cloud 中使用未发布 API 的封装方式。

主要功能

  1. 01按 clean core A–D 级别分类扩展
  2. 02比较 ABAP Cloud 与经典 ABAP
  3. 03说明 API 访问限制
  4. 04指导封装未发布的 API
  5. 05查找已发布和经典 API 的分类
  6. 06提供 clean core 检查与整改指引

适用场景

  1. 01评估扩展的 clean core 级别
  2. 02选择 ABAP 开发模式
  3. 03查找未发布 API 的替代方案
  4. 04规划经典或内部 API 的封装

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/likweitan/abap-skills --skill abap-cloud

安装后在 Claude Code 中输入/abap-cloud确认已加载。

附带文件references/clean-core-levels.md

详细介绍

ABAP Cloud 和 Clean Core 级别概念

ABAP Cloud 编程模型开发指南,介绍如何使用 Clean Core 级别概念(A–D)对扩展进行分类,以及如何应用 Clean Core 原则。

术语说明:SAP 已将原有的 3 层可扩展性模型演进为 Clean Core 级别概念。3 层模型(Tier 1/2/3)已被取代,请改用 Level A、B、C、D。当前产品名称:SAP Cloud ERP(公有云)、SAP Cloud ERP Private(原名 S/4HANA Cloud Private Edition)、SAP Business AI Platform(包含 SAP BTP 功能)、SAP Build(专业代码和低代码工具,包含 ABAP Cloud)。

工作流

  1. 确定用户的使用场景:

    • 了解 ABAP Cloud 的概念和限制
    • 将扩展归类到某个 Clean Core 级别
    • 在 ABAP Cloud 开发和经典 ABAP 开发之间进行选择
    • 封装非已发布 API,以便在 ABAP Cloud 中使用
    • 确定已发布 API 或经典 API 的替代方案
  2. 按 Clean Core 级别对扩展进行分类:

    • Level A:仅使用已发布的 API 和扩展点(稳定性契约)
    • Level B:使用经典 API 和经典框架(由 SAP 专家提名,无稳定性契约)
    • Level C:使用 SAP 内部对象(通过变更日志有条件地符合 Clean Core)
    • Level D:使用不建议的对象和模式(必须整改)
  3. 应用最低级别规则:扩展的级别由它使用的最低级别决定。调用一个内部对象的 Level A 扩展属于 Level C 扩展。

  4. 引导实现朝最高适用级别推进(优先考虑 Level A)。

Clean Core 级别概念

SAP 将扩展分为四个级别,类似于能效标签。Level A 是目标状态,体现了“优先使用 SAP Business AI Platform”的策略;Level D 必须整改。

级别名称SAP 对象限定符升级稳定性ATC 行为
Level A使用 SAP Build 进行扩展[Released] SAP 远程 API、本地 API、扩展点由稳定性契约保障无检查结果
Level B使用经典 API[Classic] SAP API 和扩展点由 SAP 专家提名,无正式契约优先级 3(信息)
Level C访问内部对象[Internal] SAP 对象(未分类对象的默认值)升级不稳定;通过变更日志降低风险优先级 2(警告)
Level D不建议[Not recommended] SAP 对象、扩展点、技术风险高,技术债务重大优先级 1(错误)

Clean Core 状态:Level A = Clean Core · Levels B 和 C = 有条件符合 Clean Core · Level D = 不符合 Clean Core。

Level A — 使用 SAP Build 和 Joule Studio 进行扩展

仅使用具有稳定性契约的公开已发布接口和扩展点。

  • 栈内:在 SAP Cloud ERP Private 中使用 ABAP Cloud 开发模型,采用已发布的本地 API(已发布的 CDS 视图、已发布的 BO 接口、已发布的扩展点),并结合关键用户可扩展性
  • 并行扩展:在 SAP Business AI Platform 上使用 ABAP Cloud、CAP 或低代码/无代码工具(SAP Build、Joule Studio),使用已发布的远程 API
  • 在 SAP Business Accelerator Hub、Cloudification Repository 或 ADT 中直接查找已发布的对象
  • 注意:Level A 的覆盖范围并不涵盖 SAP Cloud ERP Private 的全部功能范围,也没有计划实现完整覆盖
"Level A: ABAP Cloud class using only released APIs
CLASS zcl_my_extension DEFINITION
  PUBLIC FINAL CREATE PUBLIC.
  PUBLIC SECTION.
    INTERFACES if_oo_adt_classrun.
ENDCLASS.

CLASS zcl_my_extension IMPLEMENTATION.
  METHOD if_oo_adt_classrun~main.
    "Released CDS view — no direct table access
    SELECT FROM I_BusinessPartner
      FIELDS BusinessPartner, BusinessPartnerName
      INTO TABLE @DATA(partners)
      UP TO 10 ROWS.
    out->write( partners ).
  ENDMETHOD.
ENDCLASS.
Level B — 利用经典 API

成熟、文档齐全且由 SAP 指定的经典 API和经典框架。没有正式的稳定性承诺,但长期以来可靠使用,并经过 SAP 内部质量保证。

  • 典型示例:BAPI_* 函数模块、CL_GUI_ALV_GRID、未发布的 BAdI、用户/客户出口、SAP GUI 和 ALV 框架
  • ABAP 语言版本为 Standard ABAP 的自定义对象属于 Level B,前提是它们仅引用已发布或经典对象
  • 可供 Level A 代码使用的经典 API 封装属于 Level B
  • 在 Cloudification Repository 的 objectClassifications_SAP.json 和用于框架分类的 SAP Note 3578329 中识别经典 API
  • 经典 ABAP 开发推荐的软件组件:HOME
Level C — 访问内部对象

SAP 内部对象,在技术上可访问,但未发布、未指定、未记录,也不支持客户使用。这是所有未另行分类的 SAP 对象的默认分类。

  • 典型示例:直接调用内部函数模块/类、对 SAP 数据库表的读取访问
  • 缓解措施:SAP 对象变更日志会标识在后续版本中可能发生不兼容变更的内部对象,从而可在升级前主动重构
  • SAP 可能将内部对象重新分类为经典对象(→ Level B)或不推荐对象(→ Level D)
  • 在 Cloudification Repository 中,具有已发布后继对象的对象会标记为 internalAPI
Level D — 不推荐

风险最高、技术债务最高。立即修复。

  • 在 Cloudification Repository 中分类为 noAPI 的 SAP 对象(例如 RFC_READ_TABLE)
  • 对 SAP 对象的修改(包括通过手动更正应用的 SAP Note)
  • 隐式和显式增强(源代码插件)
  • 对 SAP 数据库表的直接写入访问
  • 调用 SAP 程序中的表单例程
  • 关键 ABAP 语句(内核调用、系统调用、编辑器调用、EXEC SQL、数据库提示、报表/Dynpro 生成、nametab 导入/导出)
  • 实现标记为 SAP 内部的 BAdI

开发模型

SAP Cloud ERP Private 中两种并存的栈上开发模型:

方面ABAP Cloud 开发经典 ABAP 开发
Clean coreLevel ALevel B(或使用内部/不推荐对象时为 C/D)
语言版本ABAP for Cloud DevelopmentStandard ABAP
默认选择是 — 适用于所有新的基于 ABAP 的扩展仅在没有已发布 API 或 UI 为经典界面时使用
主导模型RAP经典框架(SAP GUI、ALV、Web Dynpro、SEGW、BOPF)
强制执行语法检查 + 运行时检查ABAP Test Cockpit(ATC)治理
软件组件使用 ABAP for Cloud Development 语言版本的组件HOME 或现有经典组件
IDEADT(必需)ADT 或 SAP GUI
开发者角色SAP_BC_ABAP_DEVELOPER_5 模板标准开发者角色
访问规则

ABAP Cloud 对象只能访问:

  • 同一软件组件中的自定义对象
  • 已发布的 SAP 对象(已发布的 API)
  • 经典软件组件中为 ABAP Cloud 开发发布的自定义对象(已发布的自定义 API)

经典 ABAP 对象应仅访问:

  • 自身软件组件中的自定义对象
  • 已发布的 SAP API 以及经典 SAP API
  • 经典和 ABAP Cloud 软件组件中的自定义对象
通过授权强制执行该模型

授权对象 S_ABPLNGVS 控制开发人员能否在 Standard ABAP 中创建对象,还是只能在 ABAP for Cloud Development 中创建对象。使用它创建专用的 ABAP Cloud 开发人员角色。

ABAP for Cloud Development 中的关键限制

  • 只能使用已发布的 SAP API(C1 合约)
  • 不得直接访问 SAP 表的数据库表(应使用已发布的 CDS 视图)
  • 不得使用经典 dynpro、选择屏幕或依赖 SAP GUI 的语句
  • 不得使用 CALL TRANSACTION、SUBMIT、AUTHORITY-CHECK(应使用 CL_ABAP_AUTHORIZATION)
  • 不得使用经典 BAdI 或用户出口(只能使用已发布的 BAdI)
  • 不得使用 EXEC SQL 或原生 SQL(应使用 ABAP SQL 或 AMDP)
  • 不得使用未发布的函数模块
  • 不得使用 INCLUDE 程序
  • 不得使用 WRITE 或经典列表输出
  • 使用 if_oo_adt_classrun 输出到控制台

包装器模式

如果所需 API 尚未发布,请在经典 ABAP软件组件中构建包装器,并将其发布供 ABAP Cloud 开发使用。使用该 API 的 ABAP Cloud 代码保持整洁;包装器将级别违规限制在单一位置。

包装器级别分类(摘自白皮书):

  • 围绕经典 API(B 级对象)的包装器 → 包装器为 B 级
  • 围绕内部对象(C 级对象)的包装器 → 包装器为 C 级
  • 围绕不建议使用的对象的包装器 → D 级,不要构建
"Classic ABAP software component: wrapper class released for ABAP Cloud
"Wrapping BAPI_PO_CREATE1 (a classic API) → Level B
CLASS zcl_wrapper_material DEFINITION
  PUBLIC FINAL CREATE PUBLIC.
  PUBLIC SECTION.
    INTERFACES zif_material_reader.
    "Release with C1 contract in ADT → API State tab
ENDCLASS.

CLASS zcl_wrapper_material IMPLEMENTATION.
  METHOD zif_material_reader~get_material.
    "Access non-released API internally
    SELECT SINGLE * FROM mara
      WHERE matnr = @iv_matnr
      INTO @DATA(ls_mara).
    "Map to released structure
    rs_material = VALUE #(
      matnr = ls_mara-matnr
      mtart = ls_mara-mtart
      matkl = ls_mara-matkl ).
  ENDMETHOD.
ENDCLASS.
包装器指南
  • CDS 视图:在未发布的 SAP CDS 视图之上创建自定义 CDS 视图并发布。关联目标和值帮助视图可能也需要包装器。如果不存在 SAP CDS 视图,则包装数据库表。
  • 类/接口:包装未发布的 FM 或类。不要复制未发布的数据类型——应通过包装器公共部分中的 TYPES 声明对其进行包装,这样只需发布包装器。
  • 授权:经典 API 通常会检查未发布的授权对象,而这些对象在 ABAP Cloud 中不可用。PFCG 角色可以混用已发布和未发布的授权对象。发布包装器时,请为其提供 SU22 数据,并针对指定用途创建 SU22 变体。
  • ATC 豁免:包装可将 N 项检查结果减少为 1 项——在包装器上创建单个细粒度豁免,而不是为每种用途各创建一项。这是 SAP 针对内部对象的推荐做法。
  • 弃用包装器:SAP 发布 API 后,替换包装器并将代码迁移到 ABAP Cloud。
通过 RFC 代理实现包装(与堆栈上部署并行)
"Side-by-side consumer calls a released RFC wrapper
DATA(lo_dest) = cl_rfc_destination_provider=>create_by_comm_arrangement(
  comm_scenario  = 'Z_MY_COMM_SCENARIO'
  service_id     = 'Z_MY_OUTBOUND_SRV' ).

CALL FUNCTION 'Z_WRAPPER_FM'
  DESTINATION lo_dest->get_destination_name( )
  EXPORTING iv_param = lv_value
  IMPORTING ev_result = lv_result.

对象分类查询

方法描述
云化代码库objectClassifications_SAP.json — 经典 API、noAPI、内部 API 分类
云化 API 查看器访问 https://sap.github.io/abap-atc-cr-cv-s4hc/ 浏览
SAP Business Accelerator Hub提供具有稳定性契约的已发布远程和本地 API
ADT:已发布对象搜索使用 api: 前缀搜索(例如 api:cl_*),或通过 Project Explorer → 已发布对象
ATC clean core 检查SYCM_USAGE_OF_APIS、SYCM_ALLOWED_ENH_TECHNOLOGY、CI_SEARCH_CUST_MODIFICATIONS
SAP Note 3578329经典技术、复用服务和应用框架的分类
SAP Note 3565942提供 Usage of APIs 和 Allowed Enhancement Technologies ATC 检查
released-abap-classes 技能ABAP Cloud 的常用已发布类
XCO LibraryXCO_CP_* 类提供适用于云环境的替代方案

经典 API 分类适用于以下对象类型:函数模块(FUNC)、类(CLAS)、接口(INTF)、CDS 视图(STOB)、BO 接口(BDEF)。用作数据类型的 DDIC 对象不分类也不检查;仅检查对 SAP 表的 SQL 访问。

常见的非已发布 → 已发布替代方案

非已发布(级别 C/D)已发布替代方案(级别 A)
AUTHORITY-CHECKCL_ABAP_AUTHORIZATION=>check_authorization()
sy-unamecl_abap_context_info=>get_user_technical_name()
sy-datum / sy-uzeitcl_abap_context_info=>get_system_date/time()
cl_gui_frontend_services不可用 — 请改用 Fiori UI
CALL TRANSACTIONRAP 操作或 Fiori 导航
SUBMIT ... AND RETURN通过 CL_APJ_RT_API 创建后台作业
直接 SELECT SAP 表已发布的 CDS 视图(I_* 视图)
CONVERSION_EXIT_*CL_ABAP_CONV_CODEPAGE、域固定值
BAPI_* 函数模块已发布 API 或 RAP BO 消费(否则为级别 B)
RFC_READ_TABLE(noAPI)已发布的 CDS 视图或已发布的远程 API
经典 MESSAGE 语句通过 REPORTED 发送 RAP 消息

用例 → 级别映射

类别用例级别
扩展通过已发布扩展 include 添加自定义字段A
扩展实现已发布的 SAP BAdIA
扩展通过未发布扩展 include 添加自定义字段B
扩展通过传统 append 在 DB 表上添加自定义字段C
扩展实现用户/客户出口(例如 SAPMV45A)B
扩展实现未发布的 SAP BAdIB
扩展实现标记为 SAP-internal 的 BAdID
扩展扩展基于 RAP 的 SAP Fiori 应用A
扩展扩展 SEGW / BOPF / UI5 SAP Fiori 应用B
扩展扩展 SAP GUI 事务B
自定义应用自定义的基于 RAP 的 SAP Fiori 应用(核心范围)A
自定义应用自定义 SEGW / BOPF / UI5 应用B(优先选择 RAP)
自定义应用旧版 UI 应用(带 ALV 的 ABAP 报表、Web Dynpro)B(应予以避免)
自定义应用基于 SE54 的 BC UIB(优先选择基于 RAP 的 BC 应用)
封装围绕未发布 SAP 对象(例如 BAPI)的封装类如果被封装对象是传统 API,则为 B;否则为 C
封装为未发布 SAP 表或 CDS 视图创建封装 CDS 视图如果被封装对象是传统 API,则为 B;否则为 C
修改带手动修正的 SAP NoteD(核心中一旦具备相应能力就重置)
修改业务驱动的修改D(仅限特殊情况)

关键用户扩展性与开发者扩展性

使用已发布扩展点时,两者均属于级别 A:

  • 关键用户扩展性(无代码/低代码):自定义字段、自定义逻辑、自定义 CDS 视图、自定义业务对象,以及通过 Fiori 应用创建自定义分析查询。对于紧密耦合的扩展,请从这里开始——使用事务 SEEA / 扩展注册表查找已注册的扩展点。
  • 开发者扩展性(ABAP Cloud):当关键用户扩展性无法满足需求时使用。在 ADT 中通过 RAP 实现完整生命周期管理。

最佳实践

  1. 以级别 A 为目标——“优先采用 SAP Business AI Platform”,在栈内使用 ABAP Cloud
  2. 按使用的最低级别分类——一个内部对象就会使整个扩展归为级别 C
  3. 立即消除级别 D——修改、隐式增强、表写入、noAPI 对象
  4. 尽量减少级别 C——用已发布或传统 API 替换内部对象;监控 SAP 对象的变更日志
  5. 务实地接受级别 B——传统 API 在实践中具有升级稳定性;不要强行进行不必要的重写
  6. 进行封装,而非分散使用——一个封装配一个 ATC 豁免,胜过多处直接使用
  7. 通过 ATC 管理——使用全局检查变式,对于优先级 1 和 2 的发现项,阻止传输发布
  8. 拆分软件组件——ABAP Cloud 组件与用于传统开发的 HOME

输出格式

在解答有关 ABAP Cloud / clean core 的主题时,请按以下结构组织回复:

## ABAP Cloud Guidance

### Context

- Clean core level: [A / B / C / D] (classified by the lowest level used)
- Development model: [ABAP Cloud / Classic ABAP]
- Language version: [ABAP for Cloud Development / Standard ABAP]
- Target platform: [SAP Cloud ERP / SAP Cloud ERP Private / SAP Business AI Platform]

### Recommendation

[Guidance on the approach and how to reach a higher level]

### Code Example

[ABAP code following clean core principles]

### Released API References

- [List of relevant released or classic APIs used]

### Expected ATC Findings

- [Priority and check name, if any]

参考资料

详细参考

  • Clean Core 级别详情:阅读 references/clean-core-levels.md,了解完整的逐级比较、决策矩阵、治理设置和补救优先级

相关技能

  • abap-cloud-migration:用于对现有自定义代码进行基于级别的补救
  • atc-cloudification:用于配置 ATC Clean Core 检查和级别治理
  • released-abap-classes:用于查找 Level A 已发布 API 的替代方案
  • authorization-iam:用于 ABAP Cloud 中的授权和封装器 SU22 处理
  • badi-enhancement:用于对 BAdI 和增强技术进行级别分类

评论

支持 Markdown