explain-abap-code について
explain-abap-codeは、ABAP開発者向けにソースコードと依存関係をもとにオブジェクトを説明するスキルです。必要に応じてATCの指摘を分析し、SAPドキュメントも参照します。
主な機能
- 01ABAPオブジェクト型の自動判定
- 02ソースと関連オブジェクトの読み取り
- 03依存グラフとAPI情報の取得
- 04必要に応じたATC指摘の分析
- 05SAPドキュメントとベストプラクティスの検索
活用シーン
- 01ABAPクラス、CDSエンティティ、プログラムの把握
- 02RAPビヘイビア定義とハンドラークラスの追跡
- 03依存関係と下流への影響の確認
- 04ATC指摘の解釈
MCP 対応
ARC-1でSAPシステムにアクセスし、mcp-sap-docsでドキュメントとベストプラクティスを調べます。MCPクライアント向けのサービス提供については記載されていません。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ arc-mcp/ arc-1 --skill explain-abap-codeインストール後、Claude Code で/explain-abap-codeを入力して読み込まれたか確認します。
詳細
ABAP コードを説明する
完全な依存関係のコンテキストと、オプションの ATC コード品質分析を含めて ABAP オブジェクトを説明します。
このスキルは、ARC-1(SAP システムへのアクセス)と mcp-sap-docs(ドキュメントとベストプラクティス)を組み合わせて、SAP Joule の「コードの説明」機能を再現します。SAPContext を使用して圧縮された依存関係グラフを提供することで、J4D を超える機能を実現します。
スマートなデフォルト設定(暗黙的に適用し、質問しない)
| 設定 | デフォルト | 理由 |
|---|---|---|
| オブジェクトタイプ | SAPSearch で自動検出 | ユーザーがタイプを調べる必要がありません |
| 深さ | 概要 | まずは概要を示し、必要に応じて詳細を求めてもらいます |
| ATC | なし | ユーザーがコード品質について尋ねた場合にのみ実行します |
| 依存関係 | SAPContext で取得 | 常に依存関係グラフを取得します |
| BDEF ハンドラークラス | implementation in class 句から特定 | 動作ロジックはバインドされたプールクラスにあります |
入力
ユーザーは ABAP オブジェクト名(例:ZCL_TRAVEL_HANDLER、ZI_SALESORDER、Z_REPORT_POSTING)を指定します。
必要なのはオブジェクト名だけです。ユーザーがオブジェクト名のみを指定した場合は、タイプを自動検出し、すぐに概要を説明します。
ユーザーは任意で次の項目を指定できます。
- オブジェクトタイプ(デフォルト:自動検出)
- ATC の検出結果を説明しますか?(デフォルト:いいえ)
- 深さ — 「概要」または「詳細」(デフォルト:概要)
ステップ 1:オブジェクトを読み取る
1a. タイプを特定する(指定されていない場合)
ユーザーがタイプを指定しなかった場合は、オブジェクトを検索します。
SAPSearch(query="<object_name>")
最初の結果のタイプを使用します。複数の候補があり曖昧な場合は、ユーザーに確認します。
1b. ソースコードを読み取る
SAPRead(type="<type>", name="<object_name>")
1c. クラスの場合 — メソッド一覧も取得する
SAPRead(type="CLAS", name="<class_name>", method="*")
これにより、シグネチャ、可視性(public/protected/private)、パラメータータイプを含むすべてのメソッドが返されます。クラスの API を理解するうえで不可欠です。
1d. CDS エンティティの場合 — 構造化されたフィールド一覧も取得する
SAPRead(type="DDLS", name="<entity_name>", include="elements")
キーのマーカー、エイリアス、アソシエーション、式のタイプを含む、すべてのフィールドの整形済み一覧が返されます。
1e. (オプション)関連する成果物を読み取る
タイプに応じて、関連オブジェクトも読み取ります。
- CLAS:
SAPRead(type="CLAS", name="<class>", include="testclasses")— テストが存在するか確認します - DDLS:
SAPRead(type="BDEF", name="<entity>")— 動作定義が存在するか確認します。SAPRead(type="DCLS", name="<entity>_DCL")— CDS アクセス制御を確認します。SAPRead(type="DDLX", name="<entity>")— メタデータ拡張が存在するか確認します - BDEF:
SAPRead(type="DDLS", name="<entity>")— 関連付けられた CDS ビューを読み取ります
関連する成果物が存在しない場合、これらの読み取りは失敗することがあります。その場合は問題ありません。スキップしてください。
1f. 動作定義(BDEF)の場合 — RAP グラフをたどる
動作定義は、バインドされた CDS ルートエンティティおよび動作プール(ハンドラー)クラスと組み合わせて初めて意味を持ちます。対象オブジェクトが BDEF の場合は、上記の手順の代わりに(または追加で)次の操作を行います。
BDEF のソースを読み取ります。
SAPRead(type="BDEF", name="<bdef_name>")
ソースを読んで実装タイプとバインドされたプールクラスを特定します。
- コメント以外で最初に現れるトークン:
managed/unmanaged/projection/abstract/interface— これが実装の種類です strict ( 2 )→ 最新の RAP 構文チェックが有効です。with draft/with collaborative draft→ ドラフトが有効です- 句
... implementation in class <ZBP_NAME> unique;で動作プールクラスを指定します。正規表現implementation\s+in\s+class\s+(\S+)などを使って<ZBP_NAME>を抽出します。(projection;BDEF にはプールクラスがなく、use ...を介してベースの動作を再利用する場合があります。)
動作プールクラスを読み取ります(ハンドラーのロジックはローカルインクルード(通常は CCIMP)にあります)。
SAPRead(type="CLAS", name="<ZBP_NAME>", include="implementations")
結果が空の場合は、include="definitions"(CCDEF)とメインインクルードも試してください。ローカルハンドラークラスの名前は lhc_<alias> です。各 FOR DETERMINE / FOR VALIDATE / FOR MODIFY メソッドが、対応する BDEF 宣言を実装します。
バインドされた CDS ルートエンティティを読み取り、動作が対象とするデータモデルを把握します。
SAPRead(type="DDLS", name="<root_cds>", include="elements")
ルート CDS 名は define behavior for <root_cds> alias <alias> に記載されています。
projection BDEF の場合は、その基となる BDEF(投影元の BDEF)も読み取り、どの操作が再利用されるか(use create; use update; use action ...)を確認します。
アーティファクトが存在しない場合(純粋な abstract BDEF など)は、読み取りに失敗することがあります。その場合は適切にスキップしてください。
1g. 関数グループ(FUGR)の場合 — コードツリー全体を読み取る
関数グループのロジックは、ネストされたインクルードに分散しています。メインプログラムは TOP(グローバルデータ)および UXX(関数モジュールのディスパッチャー)インクルードを参照し、実際の FUNCTION … ENDFUNCTION 本体は、UXX から読み込まれるさらにネストされた LZ<grp>U01/U02… インクルードにあります(PBO/PAI サブルーチンは …O…/…I… インクルードにあります)。expand_includes を使い、1 回の呼び出しですべてのツリーを読み取ります。
SAPRead(type="FUGR", name="<group>", expand_includes=true)
メインソースに加え、ネストされたすべてのインクルードが(再帰的に、深さと件数に上限を設けて)返され、それぞれに === <name> === マーカーが付きます。これにより、すべての関数モジュール本体とフローロジックを一度に読み取れます。expand_includes を指定しない場合は、関数モジュールの一覧しか取得できません。
画面フローは利用できません。 Dynpro(画面)と GUI ステータス(CUA)は ADT over REST では公開されていません。これらは SAPGUI 専用(SE51/SE41)であり、エンドポイントは 404 を返します。そのため FUGR については、コードから業務上の目的、関数モジュールの役割、フローロジックを説明できますが、画面レイアウトや、PBO/PAI モジュールのコードから読み取れる範囲を超える PBO-PAI 画面シーケンスは説明できません。ユーザーから画面フローについて具体的に尋ねられた場合は、この制約を伝えてください。
Step 2: 依存関係のコンテキストを取得する
SAPContext(type="<type>", name="<object_name>")
これにより、すべての依存関係が自動的に抽出され、それぞれの圧縮された公開 API コントラクトが取得されます。以下の情報が得られます。
- クラスの場合:使用されるインターフェース、スーパークラス、注入された依存関係、他のクラスに対して呼び出されるメソッド
- CDS ビューの場合:データソース(FROM、JOIN)、アソシエーション、コンポジション、プロジェクションのベース
- プログラムの場合:呼び出される汎用モジュール、使用されるクラス、インクルードプログラム
依存関係が深く複雑につながるオブジェクトの場合は、depth=2 を使用します。
SAPContext(type="<type>", name="<object_name>", depth=2)
SAPContext が失敗した場合(未対応のタイプなど)は、ソースコードから特定した主要な依存関係を手動で読み取ってください。
対応タイプ: SAPContext は、(オンプレミスでは)CLAS、INTF、PROG、FUNC、DDLS、(BTP では)CLAS、INTF、DDLS を受け付けます。BDEF は受け付けません。そのため、BDEF を説明する際は、代わりにバインドされた CDS ルートエンティティに対して依存関係/影響分析を実行してください。
SAPContext(action="impact", name="<root_cds>")
action="impact"(DDLS のみ)は、下流への影響範囲、つまりその振る舞いを基に構築されるプロジェクションビュー、コンシュンプションビュー、サービスを返します。これは、振る舞い定義についての「依存関係/これを利用しているもの」の回答です。ハンドラークラスの内部については、SAPContext(type="CLAS", name="<ZBP_NAME>") を実行してください。
Step 3: (任意)ATC チェックを実行する
ユーザーがコード品質や ATC の指摘事項について説明を求めた場合:
SAPDiagnose(action="atc", type="<type>", name="<object_name>")
特定の ATC バリアントが必要な場合(例:S/4HANA 対応状況):
SAPDiagnose(action="atc", type="<type>", name="<object_name>", variant="<variant>")
指摘事項を優先度別に分類します。
- 優先度 1(エラー):必ず修正すべき問題 — 非推奨 API、構文上の問題
- 優先度 2(警告):修正が望ましい問題 — パフォーマンス、保守性
- 優先度 3(情報):修正するとよい問題 — スタイル、規約
- 各指摘事項の
hasQuickfixフラグを確認します。trueの場合、その箇所に SAP が機械適用可能なクイックフィックス案を提供していることを伝えてください。
Step 4: (任意)mcp-sap-docs で調査する
ソースコード内で見つかった、なじみのない SAP API について:
search("<class_or_function_name> ABAP documentation")
説明が必要な ATC の指摘事項について:
search("<checkTitle> simplification item S/4HANA")
利用可能な SAP Notes について:
sap_notes_search(q="<finding_or_api_name>")
ドキュメントの検索結果を使って、SAP の公式な情報を補足しながら説明を充実させます。
Step 5: 説明する
以下のセクションを含む、構造化された説明を提示します。ユーザーの希望(概要または詳細)に応じて説明の詳しさを調整してください。
概要
- 目的:オブジェクトの機能を一文で説明
- タイプ:オブジェクトのタイプと分類(例:「RAP ビヘイビアプール」、「インターフェース CDS ビュー」、「ALV レポート」)
- 範囲:メソッド/フィールド/行の数、複雑さの評価
公開 API
クラスの場合:
- 主な公開メソッドとそのシグネチャおよび目的
- 実装されているインターフェース
- コンストラクターのパラメーター(特に注入された依存関係)
- 発生するイベント
CDS ビューの場合:
- ビジネス上の意味を含む公開フィールド
- パラメーター(ある場合)
- ナビゲーションに使用できるアソシエーション
ビジネスロジック
- 中核となる処理フロー(主要なメソッドが呼び出されたときの動作)
- 重要なビジネスルールと条件
- データ変換と計算
- エラー処理の方法
動作定義(オブジェクトが BDEF の場合)
ステップ 1f で確認した RAP 動作グラフに沿って説明を構成します。
- 実装の種類:managed/unmanaged/projection/abstract/interface のいずれかと、それが意味すること(フレームワークが提供する CRUD、カスタムハンドラー、再利用/型定義レイヤー)。
strict(2)とwith draftがあれば記載します。 - ビジネス上の目的:バインドされた CDS ルートエンティティと BDEF ヘッダーコメントから導きます。
- エンティティごとのモデル:
define behavior for <CDS> alias <alias>ごとに、永続テーブル、lock master/lock dependent、authorization master/authorization dependent、etagを示します。 - 操作(CRUD グラフ):
create/update/delete、関連付けによる作成(association _X { create; })、およびドラフトアクション(Edit、Activate、Discard、Resume、Prepare)の有無を示します。 - 判定:
determination <name> on save|on modifyごとに、何を導出するかをプールクラス内の対応するFOR DETERMINEメソッドから読み取ります。 - 検証:
validation <name> on saveごとに、何を強制するかをFOR VALIDATEメソッドから読み取ります。 - アクション/関数:
action <name>(static/factory/parameter/resultを含む)をFOR MODIFY/FOR READメソッドから示します。 - 副作用:
side effects { ... }の宣言と、それが引き起こす UI の更新/再計算を示します。 - フィールド制御:
field ( readonly | mandatory | numbering : managed )、mapping for <table>を示します。 - projection BDEF の場合:
use ...で再利用される基底の操作/アクションを示します。
依存関係
SAPContext の結果から、以下を示します。
- 直接的な依存関係とその役割(データソース、ヘルパー、フレームワーク)
- 使用されている主要なインターフェイス/クラスとその理由
- 外部システム呼び出し(RFC、HTTP など)があれば、その内容
- アクセスされるデータベーステーブル
セキュリティ/認可
- CDS アクセス制御(
DCLS)ルールがあれば、その内容(行レベルの制限、ロールのマッピング) - BDEF に
authorization master、authorization dependent byがあれば、動作レベルの認可に関するヒントを示します。 - 実際の影響:実行時に制限される可能性のあるデータ/操作を示します。
コード品質(ATC が実行されている場合)
ATC の結果から、以下を示します。
- 概要:優先度別の指摘件数
- 主な指摘とその影響の説明
- 改善の推奨事項
次のステップ
ユーザーに次のステップを提案します。
- 「特定のメソッドについて詳しく説明しましょうか?」
- 「ATC の指摘に対する SAP のクイックフィックス案を取得しましょうか?」(→
SAPDiagnose(action="quickfix")) - 「 に対する SAP のクイックフィックスを適用しましょうか?」(SAP が検証した修正案と
apply_quickfixを使用) - 「ATC の指摘を分析して、修正案を提案しましょうか?」(→ migrate-custom-code スキル)
- 「このクラスの単体テストを生成しましょうか?」(→ generate-abap-unit-test スキル)
- 「依存関係グラフ全体を表示しましょうか?」(→ depth=2 の SAPContext)
- BDEF の場合:「不足している判定/検証/アクションの本体を実装しましょうか?」(→ generate-rap-logic スキル)、または「動作プールのハンドラーをスキャフォールドしましょうか?」(→
SAPWrite(action="scaffold_rap_handlers"))
エラー処理
よくある問題と対処方法
| エラー | 原因 | 対処方法 |
|---|---|---|
| オブジェクトが見つからない | 名前のスペルミス、またはオブジェクトが存在しない | SAPSearch を使って類似した名前を探します |
| SAPContext が失敗する | オブジェクトの種類が依存関係の分析に対応していない | ソース内で見つかった主要な依存関係を手動で読み取ります |
| ATC チェックで検出事項がない | ATC の設定がない、またはコードに問題がない | 検出事項がないのは良い知らせだとユーザーに伝えます |
| ATC バリアントが見つからない | 指定されたバリアントがシステムに存在しない | デフォルトの ATC を実行し、利用可能なバリアントを一覧表示します |
| メソッド一覧が空 | オブジェクトがクラスではない、またはメソッドがない | メソッド一覧の取得を省略し、ソースのみをもとに説明します |
| ソースが空 | オブジェクトは存在するもののソースがない(生成されたプロキシなど) | ユーザーに伝え、代わりに関連オブジェクトを読み取ります |
SAPContext が BDEF 型を拒否する | BDEF はサポート対象の SAPContext 型ではない | 代わりに、バインドされた CDS ルートで SAPContext(action="impact", name="<root_cds>") を実行します |
| BDEF のプールクラスが見つからない | projection; BDEF(独自のプールがない)、またはクラス名の解析ミス | クラスの読み取りを省略し、プロジェクションの use 句とベース BDEF に基づいて説明します |
注意事項
BTP とオンプレミスの違い
- BTP:利用できるオブジェクトの種類が少なく、PROG、INCL、FUGR はありません。リリース済み API と ABAP Cloud オブジェクトに重点を置きます。主な種類は DDLS、DCLS、CLAS、INTF、BDEF、DDLX、SRVD です。ATC バリアントはクラウド対応チェックに限られます。
- オンプレミス:すべての種類のオブジェクトを利用できます。すべての ATC バリアントを利用できます。レガシーオブジェクト(FORM ルーチン、汎用モジュール、従来型レポート)について説明できます。
このスキルで行わないこと
- コードの変更なし:このスキルは読み取りと説明のみを行い、コードの書き込みや変更は行いません
- リファクタリングの提案なし:改善案については、ATC 分析または移行スキルを使用してください
- テストの生成なし:テストの生成には、generate-abap-unit-test または generate-cds-unit-test スキルを使用してください
- システム間の比較なし:一度に 1 つのシステム上のオブジェクトについて説明します
このスキルを使用するタイミング
- 不慣れなコードベースのオンボーディング時
- バグを調査するとき、または既存の動作を理解するとき
- 移行前にコード品質を確認するとき
- ドキュメントのないオブジェクトを文書化するとき
- 共有クラスや CDS ビューの変更による影響を理解するとき