关于 abap-cloud-migration
abap-cloud-migration 是一份指南,帮助评估并整改经典 ABAP 代码,使其逐步符合 ABAP Cloud clean core 级别。它面向 ABAP 开发者和迁移团队,结合 ATC 优先级、改造路径以及 API 替换和包装模式。
主要功能
- 01ATC clean core 评估
- 02将检查结果映射到 clean core 级别
- 03按级别安排整改优先级
- 04旧代码改造选项
- 05API 替换与包装指导
适用场景
- 01迁移前评估经典 ABAP 代码
- 02优先处理 Level D 和 C 问题
- 03替换旧 API 和语言结构
- 04通过包装类处理 SAP 内部 API
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ likweitan/ abap-skills --skill abap-cloud-migration安装后在 Claude Code 中输入/abap-cloud-migration确认已加载。
附带文件references/migration-checklist.md
详细介绍
ABAP Cloud 迁移与 Clean Core Level 修正
系统性提升经典 ABAP 自定义代码的 Clean Core Level 指南——消除 Level D,将 Level C 降至最低,并逐步迈向 Level A(ABAP Cloud)。
术语说明:此前的 3 层扩展性模型已被 Clean Core Level 概念(A、B、C、D)取代。迁移目标不再是“将所有内容提升到 Tier 1”,而是“消除 Level D,将 Level C 降至最低,接受稳定的 Level B,并将新工作定位于 Level A”。有关各 Level 的定义,请参阅
abap-cloud技能。
工作流
- 评估当前状态:对现有代码运行 ATC Clean Core 检查
- 按 Level 对发现的问题分类:优先级 1 → Level D,优先级 2 → Level C,优先级 3 → Level B
- 确定修正优先级:先处理 Level D(必须修复),再处理 Level C(降至最低),最后处理 Level B(监控)
- 选择转换方案:退役 · 并行改造 · 栈内改造 · 适配
- 实施替代方案:使用已发布 API、经典 API,或仅带有一项 ATC 豁免的包装器
- 验证:重新运行 ATC 检查,确认不再存在优先级 1/2 的发现,并测试功能
迁移评估
运行 ATC Clean Core 检查
- 在 ADT 中:右键单击软件包 → Run As → ABAP Test Cockpit
- 使用检查变体
ABAP_CLEAN_CORE_DEVELOPMENT(SAP 提供),或基于ABAP_CLOUD_DEVELOPMENT_DEFAULT创建变体并包含以下检查:SYCM_USAGE_OF_APIS— 已发布/经典 API 分类、对 SAP 表的 SQL 操作、SAP 表单例程SYCM_ALLOWED_ENH_TECHNOLOGY— 增强技术合规性CI_SEARCH_CUST_MODIFICATIONS— 修改CI_CRITICAL_STATEMENTS— 关键语句SLIN_SEC— 代码漏洞分析器(另建议添加)
- 使用
ABAP_CLOUD_READINESS,在切换对象的语言版本前验证 ABAP Cloud 规则 - 在 ATC Results 视图中查看发现的问题
如果无法使用
SYCM_USAGE_OF_APIS或SYCM_ALLOWED_ENH_TECHNOLOGY,请实施 SAP Note 3565942。
映射到 clean core 级别的 ATC 发现
| ATC 优先级 | 级别 | 发现 | 操作 |
|---|---|---|---|
| 优先级 1(错误) | D | 对象已修改 | 移除修改;改用 BAdI |
| 不允许使用增强技术 | 删除增强;改用 BAdI | ||
| 隐式或显式增强(源代码插件) | 删除增强;改用 BAdI | ||
| 直接对 SAP 数据库表进行写入访问 | 使用已发布或经典 API | ||
| 在 SAP 程序中调用子例程 | 使用已发布或经典 API | ||
使用被归类为 noAPI 的 SAP 对象 | 使用已发布或经典 API;检查后续信息 | ||
| 使用关键 ABAP 语句 | 使用已发布或经典 API | ||
| 优先级 2(警告) | C | 直接对 SAP 数据库表/视图进行读取访问 | 使用已发布的 CDS 视图或经典 API |
| 使用未归类为经典 API(内部)的 SAP 对象,且该对象未发布 | 使用已发布或经典 API | ||
| 优先级 3(信息) | B | 使用已弃用的 API | 使用后续替代项 |
| 使用经典 API | — 可接受,无需采取操作 |
配置 ATC 传输设置,使优先级 1 和 2 的发现阻止传输发布。
修复优先级
-
级别 D — 完全消除
- 不做修改 → 改用 BAdI
- 不使用隐式或显式增强 → 改用 BAdI
- 不直接写入 SAP 数据库表 → 使用已发布或经典 API
- 不使用不推荐的(
noAPI)API → 使用已发布或经典 API - 移除关键 ABAP 语句 → 使用已发布或经典 API
- 不要在 SAP 程序中调用子例程 → 使用已发布或经典 API
-
级别 C — 尽可能减少
- 不直接读取 SAP 表 → 使用已发布或经典 CDS 视图
- 将 SAP 内部 API 替换为已发布或经典 API
- 如果仍需使用内部 API,请查阅SAP 对象变更日志,了解不兼容变更
- 封装剩余的内部对象,并创建单个细粒度的 ATC 豁免
-
级别 B — 监控
- 对已弃用 API 的发现采用后续替代项
- 监控 SAP 发布等效 API 的时间,然后迁移到级别 A
- 没有业务理由时,不要重写稳定的经典代码
-
级别 A — 保持
- 使用
S_ABPLNGVS授权和独立软件组件强制执行
- 使用
旧代码转换选项
| 选项 | 适用时机 | 典型任务 |
|---|---|---|
| 退役未使用的代码 | 典型 ERP 中约 60% 的自定义代码未得到有效使用 | 使用 SUSG/SCMON 收集使用数据 · 在 Custom Code Migration 应用中分析 · 删除/备份未使用的代码 · 使用克隆查找器 |
| 并行翻新与创新 | 松耦合扩展更适合 SAP Business AI Platform | 在 Custom Code Migration 应用中分析依赖项 · 将代码迁移到 BTP · 通过 ATC 快速修复进行调整 |
| 在应用栈内翻新与创新 | 值得重新实现的紧耦合扩展/修改 | 分析复杂度以识别 TCO 驱动因素 · 使代码符合 ABAP Cloud 要求 · 将未发布对象替换为已发布 API · 仅使用已发布的扩展点 |
| 调整 | 以上选项均不可行时——最低限度的可行操作 | 通过 readiness ATC 检查、Simplification Database、ADT 快速修复进行调整(最高约 60% 可自动化) · SQL Monitor · CDS/AMDP 下推 |
建议:转换期间尽可能多地舍弃旧代码——之后再清理的成本会高得多。
SAP 对象变更日志(Level C 风险缓解)
根据定义,使用 SAP 内部对象的自定义代码无法保证升级稳定性。内部对象可能在升级、导入功能包,甚至导入 SAP Note 时发生变化。
不兼容的变更包括:
- 删除对象(例如,函数模块)
- 重命名或删除函数模块参数
- 不兼容的参数类型变更
- 重命名或删除 SAP 类中的方法
- 从 CDS 视图中移除字段
涵盖的对象类型:FUNC、CLAS、INTF、STOB、BDEF。
使用方法:
- 从 SAP Software Download Center(SAP Support Portal)下载 Simplification Database 文件
- 通过事务
SYCM导入 - 在开发期间运行变更日志 ATC 检查,或像其他简化项检查一样,在系统升级前运行
- 重构受影响的用法,使其改用已发布或经典 API
变更日志中的对象不会自动降级为 Level D——根据变更的范围和关键程度,可能允许继续使用。
常见 API 替换方案
数据库访问
| 经典模式 | ABAP Cloud 替代方案 |
|---|---|
SELECT FROM mara | SELECT FROM i_product |
SELECT FROM bkpf / bseg | SELECT FROM i_journalentry |
SELECT FROM vbak / vbap | SELECT FROM i_salesorder |
SELECT FROM ekko / ekpo | SELECT FROM i_purchaseorder |
SELECT FROM kna1 | SELECT FROM i_customer |
SELECT FROM lfa1 | SELECT FROM i_supplier |
SELECT FROM t001 | SELECT FROM i_companycode |
| 直接访问表 | 使用已发布的 I_* CDS 视图 |
函数组 → 已发布的类
| 经典函数模块 | 已发布的替代方案 |
|---|---|
GUID_CREATE | cl_system_uuid=>create_uuid_x16_static( ) |
CONVERSION_EXIT_ALPHA_INPUT | cl_abap_format=>alpha_input( ) |
CONVERSION_EXIT_ALPHA_OUTPUT | cl_abap_format=>alpha_output( ) |
POPUP_TO_CONFIRM | 不可用 — 使用 Fiori UI |
NUMBER_GET_NEXT | cl_numberrange_runtime=>number_get( ) |
BAPI_TRANSACTION_COMMIT | 由 RAP 框架处理(无需显式提交) |
SO_NEW_DOCUMENT_ATT_SEND_API1 | cl_bcs_mail_message(发送电子邮件) |
READ_TEXT / SAVE_TEXT | 未发布 — 封装或使用自定义持久化 |
JOB_OPEN / JOB_CLOSE / JOB_SUBMIT | cl_apj_rt_api(应用程序作业) |
ENQUEUE_* / DEQUEUE_* | RAP 草稿 / 托管锁定,或 CL_ABAP_LOCK_OBJECT |
语言结构
| 不兼容的结构 | 兼容 Cloud 的替代方案 |
|---|---|
CALL TRANSACTION | 不可用 — 使用 API 或 RAP |
SUBMIT ... AND RETURN | 不可用 — 使用应用程序作业 |
WRITE / SKIP / ULINE(列表输出) | 不可用 — 使用 Fiori UI 输出 |
CALL SCREEN / CALL SELECTION-SCREEN | 不可用 — 使用 Fiori/UI5 |
MESSAGE ... RAISING | RAISE EXCEPTION TYPE ... |
CALL FUNCTION ... IN UPDATE TASK | RAP 保存器类 / 托管保存 |
EXEC SQL(原生 SQL) | ABAP SQL 或 AMDP |
GENERATE SUBROUTINE POOL | 不可用 — 使用策略/工厂模式 |
DESCRIBE FIELD ... TYPE | RTTI:cl_abap_typedescr=>describe_by_data( ) |
GET/SET PARAMETER ID | 不可用 — 使用方法参数 |
封装模式
如果没有已发布的 API,可在经典 ABAP软件组件中创建封装类,并将其发布,以供 **ABAP Cloud(级别 A)**使用。
封装级别分类:
- 封装经典 API(级别 B 对象)→ 封装类为级别 B
- 封装内部对象(级别 C 对象)→ 封装类为级别 C
- 封装不建议使用的(
noAPI)对象→ 级别 D,不要构建
封装还会将 N 条 ATC 检查结果合并为 1 条,因此单个细粒度豁免即可涵盖该用法。这是 SAP 推荐的使用 SAP 内部对象的做法。
第 1 步:创建封装接口(经典 ABAP,已发布供 Cloud 使用)
"Released for use in ABAP Cloud (C1 contract)
INTERFACE zif_text_handler
PUBLIC.
METHODS read_text
IMPORTING iv_id TYPE thead-tdid
iv_name TYPE thead-tdname
iv_object TYPE thead-tdobject
iv_language TYPE sy-langu DEFAULT sy-langu
RETURNING VALUE(rt_text) TYPE tline_tab
RAISING zcx_text_error.
METHODS save_text
IMPORTING iv_id TYPE thead-tdid
iv_name TYPE thead-tdname
iv_object TYPE thead-tdobject
iv_language TYPE sy-langu DEFAULT sy-langu
it_text TYPE tline_tab
RAISING zcx_text_error.
ENDINTERFACE.
第 2 步:创建封装类(经典 ABAP,已发布供 Cloud 使用)
"Implementation uses non-released FMs internally
"Released for use in ABAP Cloud (C1 contract)
CLASS zcl_text_handler DEFINITION
PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES zif_text_handler.
ENDCLASS.
CLASS zcl_text_handler IMPLEMENTATION.
METHOD zif_text_handler~read_text.
"Uses non-released FM internally — acceptable inside the wrapper
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = iv_id
name = iv_name
object = iv_object
language = iv_language
TABLES
lines = rt_text
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE zcx_text_error.
ENDIF.
ENDMETHOD.
METHOD zif_text_handler~save_text.
DATA ls_header TYPE thead.
ls_header-tdid = iv_id.
ls_header-tdname = iv_name.
ls_header-tdobject = iv_object.
ls_header-tdspras = iv_language.
CALL FUNCTION 'SAVE_TEXT'
EXPORTING header = ls_header
TABLES lines = it_text
EXCEPTIONS OTHERS = 1.
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE zcx_text_error.
ENDIF.
ENDMETHOD.
ENDCLASS.
第 3 步:发布封装类
在 ADT 中,打开封装类属性:
- 转到 API State 选项卡
- 添加 Use System-Internally (C1) 合约
- 将可见性设为 Use in ABAP Cloud
第 4 步:在 ABAP Cloud(级别 A)代码中使用
"ABAP Cloud code — uses released wrapper
DATA(lo_text) = NEW zcl_text_handler( ).
DATA(lt_text) = lo_text->zif_text_handler~read_text(
iv_id = 'ST'
iv_name = lv_doc_name
iv_object = 'VBBK' ).
步骤 5:处理授权和豁免
- 经典 API 通常会检查尚未发布的授权对象,这些对象无法在 ABAP Cloud 中使用。PFCG 角色可能混合使用已发布和未发布的授权对象。
- 发布包装器时,为其提供
SU22数据,并为每种指定用途创建SU22变体,以便维护角色。 - 针对包装器的内部用法创建单个细粒度 ATC 豁免,而不是为每个调用点分别创建豁免。
- SAP 发布该 API 后,停用包装器——替换该 API,并将代码移至 ABAP Cloud 软件组件。
按对象类型提供的包装器指南
- CDS 视图:基于未发布的 SAP CDS 视图创建自定义 CDS 视图并发布。关联目标和价值帮助视图可能也需要包装器。如果完全没有 SAP CDS 视图,则包装数据库表。
- 类 / 接口:包装未发布的 FM 或类。不要复制签名中使用的未发布数据类型(数据元素、结构、表类型)——通过包装器公共部分中的
TYPES声明来包装这些类型,这样只需发布包装器。
按对象类型制定迁移策略
报表 / 程序
Classic Report → Application Job class + CDS view + Fiori app
1. Extract data logic → CDS view entities
2. Extract business logic → ABAP Cloud class
3. Create Application Job catalog entry (CL_APJ_DT_CREATE_CONTENT)
4. Schedule via Fiori app "Application Jobs"
Dynpro 事务
Dynpro Transaction → RAP BO + Fiori Elements app
1. Identify CRUD operations → RAP behavior definition
2. Map screen fields → CDS view entity
3. Create service definition/binding
4. Generate Fiori Elements app
BAPI
BAPI → RAP BO with custom actions
1. Map BAPI parameters → CDS abstract entities
2. Implement as RAP actions or factory actions
3. Expose via OData service binding
RFC 函数组
RFC FM → Released API class or RAP service
1. If simple logic → Released ABAP class (Level A)
2. If CRUD → RAP BO with service binding (Level A)
3. If complex → Wrapper class in classic ABAP (Level B or C)
查找已发布的替代对象和经典对象的替代方案
在 ADT 中
- 已发布对象搜索:
Ctrl+Shift+A→ 按“Released”API 筛选 - API 状态筛选器:在 Project Explorer 中按 C1 发布状态筛选
- ABAP 元素信息:将鼠标悬停在未发布对象上 → 查看后继对象建议(如果有)
使用 Released Objects 应用
Fiori 应用 Released Objects(F5865):
- 按经典对象名称搜索
- 按发布状态(C1、C2)筛选
- 查看后继对象信息
使用 Cloudification Repository
确定对象的 clean core 级别及其后继对象:
- 经典 API(级别 B):
objectClassifications_SAP.json— 查看器:https://sap.github.io/abap-atc-cr-cv-s4hc/?version=objectClassifications_SAP.json - 不建议使用(级别 D):在查看器中按
state=noAPI筛选 - 有后继对象的内部对象(级别 C):标记为
internalAPI - 任何未分类且未发布的对象,默认级别为级别 C
以编程方式检查
"Check if an object is released for ABAP Cloud (Level A)
SELECT SINGLE *
FROM i_apistateofrepositoryobject
WHERE ObjectType = 'CLAS'
AND ObjectName = 'CL_NUMBERRANGE_RUNTIME'
AND ReleaseState = 'RELEASED'
INTO @DATA(ls_state).
分步整改检查清单
- 对包/对象运行 ATC clean core 检查(
ABAP_CLEAN_CORE_DEVELOPMENT) - 导出检查结果,并按 ATC 优先级 → clean core 级别分组(P1=D,P2=C,P3=B)
- 消除所有 D 级问题(优先级 1):
- 移除修改 → 使用已发布或经典 BAdI
- 移除隐式/显式增强 → 使用 BAdI
- 移除对 SAP 表的直接写入访问 → 使用已发布或经典 API
- 替换
noAPI对象的使用 → 检查后继信息 - 移除关键 ABAP 语句
- 移除对 SAP 子例程的调用
- 尽量减少 C 级问题(优先级 2):
- 替换对 SAP 表的直接读取访问 → 使用已发布或经典 CDS 视图
- 替换 SAP 内部 API → 使用已发布或经典 API
- 对于无法避免的内部用法:进行封装 + 单项 ATC 豁免
- 通过
SYCM导入 SAP 对象的变更日志,并检查是否存在不兼容变更
- 检查 B 级问题(优先级 3):
- 采用已弃用 API 的后继 API
- 保留稳定的经典 API 用法
- 对于每个没有替代方案的未发布 API:
- 在经典 ABAP 组件中创建封装,并将其发布以供 ABAP Cloud 使用
- 为封装提供
SU22数据和变式
- 对于每个不兼容的语言结构:重构为兼容云环境的替代方案
- 对于 Dynpro/ALV/基于列表的 UI:规划 Fiori 替代方案(独立项目)
- 将迁移后的对象移至 ABAP for Cloud Development 软件组件
- 在切换对象的语言版本之前,运行
ABAP_CLOUD_READINESS - 重新运行 ATC 检查 — 不应再有优先级 1 或 2 的问题
- 配置 ATC 传输设置,在存在优先级 1 和 2 问题时阻止发布
- 执行回归测试
输出格式
协助处理迁移相关主题时,请按以下结构组织回复:
## Migration Guidance
### Current Code Analysis
- Current clean core level: [A / B / C / D] (lowest level used)
- Level D findings (must fix): [list]
- Level C findings (minimize): [list]
- Level B findings (monitor): [list]
- Incompatible constructs: [list]
- Estimated effort: [low / medium / high]
### Remediation Strategy
[Ordered by level: D first, then C, then B]
[For each finding: original → replacement with code, target level]
### Wrapper Requirements
[Objects needing wrappers, with the resulting wrapper level (B or C)]
### Target State
- Achievable clean core level: [A / B]
- Residual exemptions required: [list with justification]
参考资料
- Clean Core Extensibility Whitepaper — 级别概念的权威来源
- Extend SAP S/4HANA in the cloud and on premise with ABAP based extensions(Version 2.3,August 2025)
- Custom Code Migration Guide:https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/custom-code-migration
- ABAP Cloud API Release Info:https://help.sap.com/docs/abap-cloud/abap-rap/released-abap-objects
- Cloudification Repository:https://github.com/SAP/abap-atc-cr-cv-s4hc
- Wrapper Pattern:https://github.com/SAP-samples/abap-cheat-sheets/blob/main/19_ABAP_Cloud.md
- ATC Cloud Readiness:https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/checking-abap-cloud-readiness
- SAP Note 3565942 — clean core ATC 检查
- SAP Note 3578329 — 经典技术分类
详细参考资料
- 整改检查清单:阅读
references/migration-checklist.md,了解完整的分级整改检查清单、工作量估算和回滚规划
相关技能
- abap-cloud:用于了解 clean core 级别定义、开发模型和封装分类
- atc-cloudification:用于配置 ATC clean core 检查和级别治理
- released-abap-classes:用于查找 A 级已发布 API 的替代方案
- badi-enhancement:用于使用 BAdI 替换修改和增强
- abap-sql-amdp:用于在迁移期间升级 ABAP SQL 和 AMDP