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. 02Level 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 移行とクリーンコアレベルの是正

従来の ABAP カスタムコードのクリーンコアレベルを体系的に引き上げるためのガイドです。レベル D を解消し、レベル C を最小限に抑え、レベル A(ABAP Cloud)を目指します。

用語に関する注意:従来の 3 段階の拡張性モデルは、クリーンコアのレベル概念(A、B、C、D)に置き換えられました。移行の目標は、もはや「すべてをティア 1 にする」ことではなく、「レベル D を解消し、レベル C を最小限に抑え、安定したレベル B を受け入れ、新規開発ではレベル A を目指す」ことです。レベルの定義については、abap-cloud スキルを参照してください。

ワークフロー

  1. 現状を評価する:既存のコードに対して ATC クリーンコアチェックを実行します
  2. 検出結果をレベル別に分類する:優先度 1 → レベル D、優先度 2 → レベル C、優先度 3 → レベル B
  3. 是正の優先順位を決める:まずレベル D(必須修正)、次にレベル C(最小化)、最後にレベル B(監視)
  4. 変換方法を選択する:廃止 · サイドバイサイドで改修 · スタック内で改修 · 適応
  5. 置き換えを実装する:リリース済み API、従来の API、または単一の ATC 免除を使ったラッパー
  6. 検証する:ATC チェックを再実行し、優先度 1/2 の検出結果が残っていないことを確認して、機能をテストします

移行評価

ATC クリーンコアチェックの実行
  1. ADT でパッケージを右クリックし、実行 → 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 — Code Vulnerability Analyzer(追加で推奨)
  3. オブジェクトの言語バージョンを切り替える前に、ABAP_CLOUD_READINESS を使用して ABAP Cloud のルールを満たしていることを確認します
  4. 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(警告)CSAP データベーステーブル/ビューへの直接の 読み取り アクセスリリース済み CDS ビューまたは従来の API を使用します
従来の API(内部)に分類されず、リリースもされていない SAP オブジェクトの使用リリース済みまたは従来の API を使用します
優先度 3(情報)B非推奨 API の使用後継を使用します
従来の API の使用— 許容され、対応は不要です

ATC の移送設定を構成し、優先度 1 および 2 の検出結果によって移送リリースがブロックされるようにしてください。

修正の優先順位
  1. レベル D — 完全に排除する

    • 変更を行わない → BAdI を使用します
    • 暗黙的または明示的な拡張を行わない → BAdI を使用します
    • SAP DB テーブルへの直接の書き込みアクセスを行わない → リリース済みまたは従来の API を使用します
    • 推奨されない(noAPI)API を使用しない → リリース済みまたは従来の API を使用します
    • 重大な ABAP ステートメントを削除する → リリース済みまたは従来の API を使用します
    • SAP プログラム内でフォームルーチンを呼び出さない → リリース済みまたは従来の API を使用します
  2. レベル C — 可能な限り最小限に抑える

    • SAP テーブルへの直接の読み取りアクセスを行わない → リリース済みまたは従来の CDS ビューを使用します
    • SAP 内部 API をリリース済みまたは従来の API に置き換えます
    • 内部 API が引き続き必要な場合は、SAP オブジェクトの変更履歴を確認し、互換性のない変更がないか調べます
    • 残りの内部オブジェクトをラップし、きめ細かな ATC 免除を 1 つ作成します
  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 オブジェクトの変更履歴(レベル 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 に切り替えます

変更履歴に記載されたオブジェクトが、自動的にレベル 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 ビューを使用する
関数モジュール → リリース済みクラス
従来の FMリリース済みの代替手段
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_COMMITRAP フレームワークが処理します(明示的なコミットは不要です)
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
言語構文
互換性のない構文クラウド互換の代替手段
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 免除を 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 での検索
  1. リリース済みオブジェクトの検索:Ctrl+Shift+A →「Released」API でフィルター
  2. API 状態フィルター:プロジェクトエクスプローラーで C1 リリース状態をフィルター
  3. 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).

段階的な修正チェックリスト

  1. パッケージ/オブジェクトに対して ATC クリーンコアチェック(ABAP_CLEAN_CORE_DEVELOPMENT)を実行します
  2. 検出結果をエクスポートし、ATC の優先度 → クリーンコアレベル(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 免除を 1 件だけ設定します
    • SYCM を使用して SAP オブジェクトの変更履歴をインポートし、非互換な変更がないか確認します
  5. レベル B の検出結果をレビューします(優先度 3):
    • 非推奨 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. 優先度 1 および 2 の検出結果がある場合にリリースをブロックするよう、ATC 輸送設定を構成します
  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: クリーンコアレベルの定義、開発モデル、ラッパーの分類に使用します
  • atc-cloudification: ATC クリーンコアチェックとレベルガバナンスの構成に使用します
  • released-abap-classes: レベル A のリリース済み API の代替手段を探す際に使用します
  • badi-enhancement: 改変や拡張を BAdI に置き換える際に使用します
  • abap-sql-amdp: 移行中に ABAP SQL と AMDP を最新化する際に使用します

コメント