mcpField
A
abap-cloud-migration

abap-cloud-migration

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

关于 abap-cloud-migration

abap-cloud-migration 是一份指南,帮助评估并整改经典 ABAP 代码,使其逐步符合 ABAP Cloud clean core 级别。它面向 ABAP 开发者和迁移团队,结合 ATC 优先级、改造路径以及 API 替换和包装模式。

主要功能

  1. 01ATC clean core 评估
  2. 02将检查结果映射到 clean core 级别
  3. 03按级别安排整改优先级
  4. 04旧代码改造选项
  5. 05API 替换与包装指导

适用场景

  1. 01迁移前评估经典 ABAP 代码
  2. 02优先处理 Level D 和 C 问题
  3. 03替换旧 API 和语言结构
  4. 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 技能。

工作流

  1. 评估当前状态:对现有代码运行 ATC Clean Core 检查
  2. 按 Level 对发现的问题分类:优先级 1 → Level D,优先级 2 → Level C,优先级 3 → Level B
  3. 确定修正优先级:先处理 Level D(必须修复),再处理 Level C(降至最低),最后处理 Level B(监控)
  4. 选择转换方案:退役 · 并行改造 · 栈内改造 · 适配
  5. 实施替代方案:使用已发布 API、经典 API,或仅带有一项 ATC 豁免的包装器
  6. 验证:重新运行 ATC 检查,确认不再存在优先级 1/2 的发现,并测试功能

迁移评估

运行 ATC Clean Core 检查
  1. 在 ADT 中:右键单击软件包 → Run As → ABAP Test Cockpit
  2. 使用检查变体 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 — 代码漏洞分析器(另建议添加)
  3. 使用 ABAP_CLOUD_READINESS,在切换对象的语言版本前验证 ABAP Cloud 规则
  4. 在 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 的发现阻止传输发布。

修复优先级
  1. 级别 D — 完全消除

    • 不做修改 → 改用 BAdI
    • 不使用隐式或显式增强 → 改用 BAdI
    • 不直接写入 SAP 数据库表 → 使用已发布或经典 API
    • 不使用不推荐的(noAPI)API → 使用已发布或经典 API
    • 移除关键 ABAP 语句 → 使用已发布或经典 API
    • 不要在 SAP 程序中调用子例程 → 使用已发布或经典 API
  2. 级别 C — 尽可能减少

    • 不直接读取 SAP 表 → 使用已发布或经典 CDS 视图
    • 将 SAP 内部 API 替换为已发布或经典 API
    • 如果仍需使用内部 API,请查阅SAP 对象变更日志,了解不兼容变更
    • 封装剩余的内部对象,并创建单个细粒度的 ATC 豁免
  3. 级别 B — 监控

    • 对已弃用 API 的发现采用后续替代项
    • 监控 SAP 发布等效 API 的时间,然后迁移到级别 A
    • 没有业务理由时,不要重写稳定的经典代码
  4. 级别 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。

使用方法:

  1. 从 SAP Software Download Center(SAP Support Portal)下载 Simplification Database 文件
  2. 通过事务 SYCM 导入
  3. 在开发期间运行变更日志 ATC 检查,或像其他简化项检查一样,在系统升级前运行
  4. 重构受影响的用法,使其改用已发布或经典 API

变更日志中的对象不会自动降级为 Level D——根据变更的范围和关键程度,可能允许继续使用。

常见 API 替换方案

数据库访问
经典模式ABAP Cloud 替代方案
SELECT FROM maraSELECT FROM i_product
SELECT FROM bkpf / bsegSELECT FROM i_journalentry
SELECT FROM vbak / vbapSELECT FROM i_salesorder
SELECT FROM ekko / ekpoSELECT FROM i_purchaseorder
SELECT FROM kna1SELECT FROM i_customer
SELECT FROM lfa1SELECT FROM i_supplier
SELECT FROM t001SELECT FROM i_companycode
直接访问表使用已发布的 I_* CDS 视图
函数组 → 已发布的类
经典函数模块已发布的替代方案
GUID_CREATEcl_system_uuid=>create_uuid_x16_static( )
CONVERSION_EXIT_ALPHA_INPUTcl_abap_format=>alpha_input( )
CONVERSION_EXIT_ALPHA_OUTPUTcl_abap_format=>alpha_output( )
POPUP_TO_CONFIRM不可用 — 使用 Fiori UI
NUMBER_GET_NEXTcl_numberrange_runtime=>number_get( )
BAPI_TRANSACTION_COMMIT由 RAP 框架处理(无需显式提交)
SO_NEW_DOCUMENT_ATT_SEND_API1cl_bcs_mail_message(发送电子邮件)
READ_TEXT / SAVE_TEXT未发布 — 封装或使用自定义持久化
JOB_OPEN / JOB_CLOSE / JOB_SUBMITcl_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 ... RAISINGRAISE EXCEPTION TYPE ...
CALL FUNCTION ... IN UPDATE TASKRAP 保存器类 / 托管保存
EXEC SQL(原生 SQL)ABAP SQL 或 AMDP
GENERATE SUBROUTINE POOL不可用 — 使用策略/工厂模式
DESCRIBE FIELD ... TYPERTTI: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 中,打开封装类属性:

  1. 转到 API State 选项卡
  2. 添加 Use System-Internally (C1) 合约
  3. 将可见性设为 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 中
  1. 已发布对象搜索:Ctrl+Shift+A → 按“Released”API 筛选
  2. API 状态筛选器:在 Project Explorer 中按 C1 发布状态筛选
  3. ABAP 元素信息:将鼠标悬停在未发布对象上 → 查看后继对象建议(如果有)
使用 Released Objects 应用

Fiori 应用 Released Objects(F5865):

  • 按经典对象名称搜索
  • 按发布状态(C1、C2)筛选
  • 查看后继对象信息
使用 Cloudification Repository

确定对象的 clean core 级别及其后继对象:

以编程方式检查
"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).

分步整改检查清单

  1. 对包/对象运行 ATC clean core 检查(ABAP_CLEAN_CORE_DEVELOPMENT)
  2. 导出检查结果,并按 ATC 优先级 → clean core 级别分组(P1=D,P2=C,P3=B)
  3. 消除所有 D 级问题(优先级 1):
    • 移除修改 → 使用已发布或经典 BAdI
    • 移除隐式/显式增强 → 使用 BAdI
    • 移除对 SAP 表的直接写入访问 → 使用已发布或经典 API
    • 替换 noAPI 对象的使用 → 检查后继信息
    • 移除关键 ABAP 语句
    • 移除对 SAP 子例程的调用
  4. 尽量减少 C 级问题(优先级 2):
    • 替换对 SAP 表的直接读取访问 → 使用已发布或经典 CDS 视图
    • 替换 SAP 内部 API → 使用已发布或经典 API
    • 对于无法避免的内部用法:进行封装 + 单项 ATC 豁免
    • 通过 SYCM 导入 SAP 对象的变更日志,并检查是否存在不兼容变更
  5. 检查 B 级问题(优先级 3):
    • 采用已弃用 API 的后继 API
    • 保留稳定的经典 API 用法
  6. 对于每个没有替代方案的未发布 API:
    • 在经典 ABAP 组件中创建封装,并将其发布以供 ABAP Cloud 使用
    • 为封装提供 SU22 数据和变式
  7. 对于每个不兼容的语言结构:重构为兼容云环境的替代方案
  8. 对于 Dynpro/ALV/基于列表的 UI:规划 Fiori 替代方案(独立项目)
  9. 将迁移后的对象移至 ABAP for Cloud Development 软件组件
  10. 在切换对象的语言版本之前,运行 ABAP_CLOUD_READINESS
  11. 重新运行 ATC 检查 — 不应再有优先级 1 或 2 的问题
  12. 配置 ATC 传输设置,在存在优先级 1 和 2 问题时阻止发布
  13. 执行回归测试

输出格式

协助处理迁移相关主题时,请按以下结构组织回复:

## 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]

参考资料

详细参考资料

  • 整改检查清单:阅读 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

评论

支持 Markdown