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コード評価
- 02Level 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 移行とクリーンコアレベルの是正
従来の ABAP カスタムコードのクリーンコアレベルを体系的に引き上げるためのガイドです。レベル D を解消し、レベル C を最小限に抑え、レベル A(ABAP Cloud)を目指します。
用語に関する注意:従来の 3 段階の拡張性モデルは、クリーンコアのレベル概念(A、B、C、D)に置き換えられました。移行の目標は、もはや「すべてをティア 1 にする」ことではなく、「レベル D を解消し、レベル C を最小限に抑え、安定したレベル B を受け入れ、新規開発ではレベル A を目指す」ことです。レベルの定義については、
abap-cloudスキルを参照してください。
ワークフロー
- 現状を評価する:既存のコードに対して ATC クリーンコアチェックを実行します
- 検出結果をレベル別に分類する:優先度 1 → レベル D、優先度 2 → レベル C、優先度 3 → レベル B
- 是正の優先順位を決める:まずレベル D(必須修正)、次にレベル C(最小化)、最後にレベル B(監視)
- 変換方法を選択する:廃止 · サイドバイサイドで改修 · スタック内で改修 · 適応
- 置き換えを実装する:リリース済み API、従来の API、または単一の ATC 免除を使ったラッパー
- 検証する:ATC チェックを再実行し、優先度 1/2 の検出結果が残っていないことを確認して、機能をテストします
移行評価
ATC クリーンコアチェックの実行
- ADT でパッケージを右クリックし、実行 → 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— Code Vulnerability Analyzer(追加で推奨)
- オブジェクトの言語バージョンを切り替える前に、
ABAP_CLOUD_READINESSを使用して ABAP Cloud のルールを満たしていることを確認します - ATC Results ビューで検出結果を確認します
SYCM_USAGE_OF_APISまたはSYCM_ALLOWED_ENH_TECHNOLOGYを使用できない場合は、SAP Note 3565942 を実装してください。
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 DB テーブルへの直接の書き込みアクセスを行わない → リリース済みまたは従来の API を使用します
- 推奨されない(
noAPI)API を使用しない → リリース済みまたは従来の API を使用します - 重大な ABAP ステートメントを削除する → リリース済みまたは従来の API を使用します
- SAP プログラム内でフォームルーチンを呼び出さない → リリース済みまたは従来の API を使用します
-
レベル C — 可能な限り最小限に抑える
- SAP テーブルへの直接の読み取りアクセスを行わない → リリース済みまたは従来の CDS ビューを使用します
- SAP 内部 API をリリース済みまたは従来の API に置き換えます
- 内部 API が引き続き必要な場合は、SAP オブジェクトの変更履歴を確認し、互換性のない変更がないか調べます
- 残りの内部オブジェクトをラップし、きめ細かな ATC 免除を 1 つ作成します
-
レベル 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 オブジェクトの変更履歴(レベル C のリスク軽減)
内部 SAP オブジェクトを使用するカスタムコードは、定義上、アップグレード後の安定性が保証されません。内部オブジェクトは、アップグレード、フィーチャーパックのインポート、あるいは SAP Note のインポート時にも変更される可能性があります。
互換性のない変更には、以下が含まれます。
- オブジェクトの削除(例:汎用モジュール)
- 汎用モジュールパラメーターの名称変更または削除
- パラメーター型への互換性のない変更
- SAP クラス内のメソッドの名称変更または削除
- CDS ビューからのフィールドの削除
対象オブジェクトタイプ:FUNC、CLAS、INTF、STOB、BDEF。
使用方法:
- SAP Software Download Center(SAP Support Portal)から Simplification Database ファイルをダウンロードします
- トランザクション
SYCMを使用してインポートします - 開発中に変更履歴の ATC チェックを実行するか、他の簡素化項目チェックと同様にシステムアップグレード前に実行します
- 影響を受ける使用箇所をリファクタリングし、リリース済みまたはクラシック API に切り替えます
変更履歴に記載されたオブジェクトが、自動的にレベル 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 ビューを使用する |
関数モジュール → リリース済みクラス
| 従来の FM | リリース済みの代替手段 |
|---|---|
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 |
言語構文
| 互換性のない構文 | クラウド互換の代替手段 |
|---|---|
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 免除を 1 つだけ作成します。
- SAP が 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 状態フィルター:プロジェクトエクスプローラーで C1 リリース状態をフィルター
- ABAP 要素情報:未リリースのオブジェクトにカーソルを合わせる → 後継候補がある場合は表示されます
リリース済みオブジェクトアプリを使用する
Fiori アプリ Released Objects(F5865):
- 従来のオブジェクト名で検索
- リリース状態(C1、C2)でフィルター
- 後継に関する情報を表示
Cloudification Repository を使用する
オブジェクトのクリーンコアレベルと後継を確認します。
- 従来の 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 クリーンコアチェック(
ABAP_CLEAN_CORE_DEVELOPMENT)を実行します - 検出結果をエクスポートし、ATC の優先度 → クリーンコアレベル(P1=D、P2=C、P3=B)ごとに分類します
- レベル D の検出結果をすべて解消します(優先度 1):
- 改変を削除します → リリース済みまたはクラシック BAdI を使用します
- 暗黙的/明示的な拡張を削除します → BAdI を使用します
- SAP テーブルへの直接書き込みアクセスを削除します → リリース済みまたはクラシック API を使用します
-
noAPIオブジェクトの使用を置き換えます → 後継情報を確認します - 重大な ABAP 文を削除します
- SAP フォームルーチンの呼び出しを削除します
- レベル C の検出結果を最小限に抑えます(優先度 2):
- SAP テーブルへの直接読み取りアクセスを置き換えます → リリース済みまたはクラシック CDS ビューを使用します
- SAP 内部 API を置き換えます → リリース済みまたはクラシック API を使用します
- 内部機能の使用が避けられない場合:ラッパーで包み、ATC 免除を 1 件だけ設定します
-
SYCMを使用して SAP オブジェクトの変更履歴をインポートし、非互換な変更がないか確認します
- レベル B の検出結果をレビューします(優先度 3):
- 非推奨 API の後継を採用します
- 安定したクラシック API の使用はそのままにします
- 置き換えがないリリース対象外 API ごとに、次の作業を行います:
- クラシック ABAP コンポーネントにラッパーを作成し、ABAP Cloud 向けにリリースします
- ラッパーに
SU22データとバリアントを提供します
- 互換性のない言語構文ごとに、クラウド互換の代替手段へリファクタリングします
- Dynpro/ALV/リストベースの UI について、Fiori への置き換えを計画します(別プロジェクト)
- 移行したオブジェクトを ABAP for Cloud Development ソフトウェアコンポーネントに移動します
- オブジェクトの言語バージョンを切り替える前に、
ABAP_CLOUD_READINESSを実行します - ATC チェックを再実行します — 優先度 1 または 2 の検出結果が残っていないことを確認します
- 優先度 1 および 2 の検出結果がある場合にリリースをブロックするよう、ATC 輸送設定を構成します
- 回帰テストを実行します
出力形式
移行に関するトピックを支援する際は、次の形式で回答を構成します:
## 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(バージョン 2.3、2025 年 8 月)
- 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 — クリーンコア ATC チェック
- SAP Note 3578329 — クラシックテクノロジーの分類
詳細な参考資料
- 修正チェックリスト: レベルに基づく修正チェックリスト、工数見積もり、ロールバック計画の全容については、
references/migration-checklist.mdを参照してください
関連スキル
- abap-cloud: クリーンコアレベルの定義、開発モデル、ラッパーの分類に使用します
- atc-cloudification: ATC クリーンコアチェックとレベルガバナンスの構成に使用します
- released-abap-classes: レベル A のリリース済み API の代替手段を探す際に使用します
- badi-enhancement: 改変や拡張を BAdI に置き換える際に使用します
- abap-sql-amdp: 移行中に ABAP SQL と AMDP を最新化する際に使用します