移行の企画段階で、必ず同じ会議が開かれる。現行のアドオンが四百本あり、全部を移送すると工期と費用が計画に収まらない。だから各部門に一覧を配り、要否を確認してもらう。返ってくる回答は、ほぼ全件が「要」である。 部門から見れば、要らないと答えて後で困るより、要ると答えておくほうが合理的だからである。会議は三巡し、落ちたのは十数本。この会議の設計が間違っている。 要否を聞く相手が違うのではなく、要否を人に聞くという順序が違う。 SAPの移行ガイドは、この順序について明確な立場をとっている。

POINT
SAPは「Custom Code Migration Guide for SAP S/4HANA 2025」(PUBLIC、2026年2月25日版)で、カスタムコードのスコーピングを 「Custom code scoping enables you to determine the ABAP custom code that is frequently used and needs to be taken over to SAP S/4HANA. Unused custom code can be deleted using deletion transport requests during the system conversion.」(スコーピングにより、頻繁に使用されておりSAP S/4HANAへ引き継ぐ必要のあるABAPカスタムコードを特定できる。使用されていないカスタムコードは、システムコンバージョンの際に削除トランスポートリクエストを用いて削除できる)と説明する。判断の基礎に置かれているのは「必要かどうか」ではなく「使用されているかどうか」である。 そして同ガイドは注記として 「Scoping is only supported using the Custom Code Migration app.」(スコーピングはCustom Code Migrationアプリでのみサポートされる)とし、推奨事項として ABAP Call Monitor(トランザクションSCMON)を使用すること、および トランザクションSUSGで本番システムにおいて最低一年の使用データを収集すること を挙げている。使用データをプロジェクトに追加すると既定スコープが自動計算され、その既定スコープには 「all used objects, all objects which are statically referenced by the used objects, and objects for which no usage data is available, such as database tables or data elements」(すべての使用済みオブジェクト、使用済みオブジェクトから静的に参照されるすべてのオブジェクト、およびデータベーステーブルやデータ要素のように使用データが存在しないオブジェクト)が含まれる。スコープに残るのが既定であり、落ちるのは例外である。

スコープは、要不要の議論ではなく既定値の計算である

順序を入れ替えると、会議の議題が変わる。使用実績から既定スコープを機械が計算し、その結果に対して人が例外を申し立てる、という順序になる。

SAPはスコープの内外を、判定規則として書き下している。オブジェクトがスコープ内になるのは、明示的にオブジェクト単位でスコープに追加された場合、そのパッケージが明示的にスコープに追加された場合、スコープ内の少なくとも一つのリクエストエントリポイントから使用されている場合、スコープ内の他のオブジェクトから参照されている場合、またはそのオブジェクトタイプに使用データが存在しない場合である。スコープ外になるのは、明示的にオブジェクト単位でスコープから除外された場合、またはいずれのリクエストエントリポイントからも使用されていない場合の二つだけである。

この非対称性が効く。 落ちる条件は二つしかなく、そのうち一つは人の明示的な操作である。つまり 機械が自動で落とせるのは「どの入口からも呼ばれていない」ものだけであり、それ以外はすべて既定で残る。データベーステーブルやデータ要素のように使用データを取れないオブジェクトタイプは、使われていなくても残る。「機械的に切る」と言うとき、実際に機械が切っているのは呼び出し実績ゼロの入口だけである。 ここを誤解したまま「AIで棚卸しする」といった話に流れると、結局は人が全件を見る作業に戻る。

一年より短い使用実績は、使ってはいけない

移行の企画は、たいてい時間がない。使用実績の収集も「三か月分でとりあえず回そう」となりやすい。SAPはこの点に理由を書いている。

ガイドは、「Ideally, the usage data you add to your custom code migration project should cover at least one year of usage information, so that also usage data of quarter and year ending functionality is considered.」(プロジェクトに追加する使用データは、理想的には最低一年分の使用情報をカバーすべきである。四半期末および年度末の機能の使用データも考慮されるようにするためである)と述べる。四半期決算と年度決算でしか動かないプログラムを取りこぼさないため、というのが一年の根拠である。

経理と財務の領域では、この指摘の重みが他の領域と違う。アドオンの多くが、期末にしか動かない。 決算整理の一括仕訳、税務用の集計帳票、年一回の固定資産の実地棚卸リスト、償却資産申告の補助資料。三か月分の使用実績で切れば、これらは全部「未使用」に見える。そして削除トランスポートに載る。本番稼働の初回決算で、無いことに気づく。

裏返せば、使用実績の収集は移行の企画より先に始めなければならない。 SUSGでの集約をまだ有効にしていないなら、ガイドは 本番システムでトランザクションSUSGを起動し、Activateを選んで使用データの集約を有効化するよう 求めている。移行の意思決定が固まってから収集を始めると、一年分が溜まるまでスコープが切れない。「まだ移行を決めていないから」を理由に収集を止めている会社が、一年後に選択肢を失う。 これは投資でも要員でもなく、設定を一つ入れるかどうかの話である。

中央チェックシステムの選択が、捨てられるかどうかを決める

もう一つ、企画段階で見落とされる分岐がある。カスタムコード分析をどの環境で回すかで、できることが変わる。

SAPは三つの選択肢を挙げる。中央チェックシステムがSAP S/4HANA 1809以降であればCustom Code Migrationアプリを使え、SAP BTP ABAP environmentでも同アプリを使える。問題は二つ目の選択肢である。 中央チェックシステムをSAP NetWeaver Application Server for ABAP 7.52に置く場合について、ガイドは 「With this approach you can neither scope your custom code based on usage data nor filter the analysis results by scope or quick fix availability.」(このアプローチでは、使用データに基づくカスタムコードのスコーピングも、スコープやクイックフィックスの有無による分析結果の絞り込みも行えない)と明記している。

つまり、中央チェックシステムを既存のNetWeaver環境で済ませる判断をした時点で、使用実績で捨てるという方法そのものが選べなくなる。 これはインフラの都合として決められがちな論点で、経理側の会議に上がってこない。しかし結果として、移行スコープが四百本のまま固定される。 費用への跳ね返りはそのまま工数に出る。インフラの一行の判断が、移行費用の桁を変える。

なお、SAP Solution Manager経由で使用データを取り込む道もあるが、制約がある。ガイドは 「When loading usage data collected in SAP Solution Manager, the usage counter will not display usage numbers (0 usages). Usage counter data is not supported by the APIs of SAP Solution Manager.」(SAP Solution Managerで収集した使用データをロードする場合、使用回数カウンタは使用回数を表示しない(0 usages)。使用回数カウンタのデータはSAP Solution ManagerのAPIでサポートされていない)としている。使用の有無でスコープは切れるが、実行回数の多寡で優先順位をつけることはできなくなる。

ちなみに、SAPのガイドがカウンタとして示しているのは、リクエストエントリポイント配下のプロシージャごとの Number Usages(使用回数)である。利用者数はこの画面に出てこない。 「実行回数と利用者数で切る」という設計を置くなら、利用者数は別の経路で取る必要がある。ここを企画書に書いてから気づくと、判定基準の作り直しになる。

会議に上げるのは、二種類だけである

既定スコープが計算されれば、人が判断すべき対象は自動的に絞られる。SAPはガイドの中で、スコープを変更する必要が生じる場面を例示している。

第一の場面は、Business Suiteシステムで使用されているトランザクションを、S/4HANAでは業務プロセスを変えるためもう使わない場合である。この場合はリクエストエントリポイントでフィルタし、そのエントリポイントをスコープから外す。実績はあるが、業務ごとやめる。 これは使用実績では絶対に落ちない。落とせるのは、業務をどう変えるかを決めた人だけである。

第二の場面は、新しい機能が開発中で、まだ本番システムで使われていない場合である。ガイドは 「no usage data has been collected for this application and it has not been added to your scope automatically」(このアプリケーションについては使用データが収集されておらず、自動ではスコープに追加されていない)とし、開発物を含むパッケージをパッケージ単位でスコープに追加するよう説明する。実績はないが、これから使う。 これも機械では拾えない。

第三の場面は性質が違う。ガイドは、複雑なオブジェクトほど変更頻度も高い傾向があるとしたうえで、Custom Code Migrationアプリの複雑度分析でパッケージの Halstead Difficulty を表示し、再設計により単純化すべきかを判断できるとする。これは捨てるかどうかではなく、残すものを移送するか作り直すかの判断である。 スコープの議論と混ぜると会議が長くなる。分けて置く。

使用実績を縦軸、移行後の業務継続を横軸に置くと、人が判断すべき象限は二つに絞られる。
本番での実行実績 あり →
実績あり・業務は変える
使用実績では落ちない。リクエストエントリポイントを人が明示的にスコープから外す。会議に上げるべき第一の型
実績あり・業務は続ける
既定スコープに自動で入る。移送対象。複雑度の高いものだけ、作り直すか移送するかを別建てで検討する
実績なし・使う予定もない
どのリクエストエントリポイントからも使われていないため、既定スコープから自動で外れ、削除トランスポートに載る。会議に上げない
実績なし・これから使う
開発中の新機能は使用データが無く自動ではスコープに入らない。パッケージ単位で人が追加する。会議に上げるべき第二の型
移行後も同じ業務を続ける →
左上と右下だけが人の判断であり、右上と左下は計算で決まる。四象限すべてを会議に載せるから、アドオンは減らない。

機械的に切ることの限界を、先に書いておく

この方法には、明示しておくべき穴が二つある。穴を伏せたまま導入すると、稼働直後に信用を失う。

第一に、静的解析は動的な呼び出しを拾わない。 SAPはATCについて 「ATC is not able to find all potential issues (for example, dynamic coding is not covered by static code checks).」(ATCはすべての潜在的な問題を検出できるわけではない。たとえば動的コーディングは静的コードチェックの対象外である)と注記している。既定スコープが「静的に参照されるオブジェクト」を含める設計になっている以上、プログラム名を変数で組み立てて呼ぶような実装は、参照関係として捕捉されない。 使用実績で拾えていれば残るが、期末にしか動かない動的呼び出しは、一年分の使用実績を取っていなければ二重に漏れる。

第二に、削除は取り消しの安い作業ではない。 削除はシステムコンバージョンの中で削除トランスポートとして流れる。移行後に「やはり必要だった」と分かったとき、戻すのは旧環境からのコードの復元と再テストになる。 旧環境をどこまで、いつまで保持するかという判断と一体で決める必要がある(SAP移行で旧システムの過去データをどうするか|移行年数と旧環境の維持費)。

この二つを踏まえると、実務上の落としどころは明快になる。削除トランスポートの対象一覧は作るが、対象のうち期末・年度末にしか動かない可能性のある領域だけは、使用実績とは別に人が一度見る。 対象領域は限定できる。決算整理、税務、開示、固定資産、そして年一回の法定帳票である。四百本を全件レビューするのと、そのうち数十本を領域指定でレビューするのとでは、会議の回数が違う。

現場では
売上高1,100億円の食品メーカーで、SAP ERP 6.0からS/4HANAへのコンバージョンを計画していた。現行のアドオンは418本。企画段階の見積りでは、全量移送を前提にしたカスタムコード適応の工数が約9,400人日で、これだけで移行予算の四割を占めていた。最初に開いた会議は、各部門への要否照会である。 一覧を配り、二週間で回答を求めた。返ってきた「不要」は21本で、うち11本は同じ部門が二重に登録していた重複だった。二巡目の会議で、要否を聞く方式をやめている。 転換点になったのは、情報システム部門の担当者が「本番でSUSGの集約を有効にしていない」と報告したことだった。使用実績を取っていなかったため、そもそも機械的に切る手段が無い状態で議論していたことになる。その場でSUSGの集約を有効化し、ABAP Call Monitorの運用を開始した。移行の実行開始を九か月後ろ倒しし、その間に一年分の使用データを溜める判断をしている。 後ろ倒しの意思決定は、経理側からの一言で通った。「三か月分で切ったら、決算のアドオンが全部消える」。実際、SAPのガイドが一年を推奨する理由として四半期末と年度末の機能を挙げていることが、稟議の根拠として使われている。同時に、中央チェックシステムの構成を見直した。 当初案は既存のNetWeaver AS ABAP 7.52を流用するもので、インフラ費用は最も安かった。ガイドがこの構成では使用データに基づくスコーピングができないと明記していることが分かり、S/4HANAを中央チェックシステムとして立てる案に変更している。追加のインフラ費用は約1,800万円で、削減が見込まれる移送工数と比べれば議論にならなかった。 一年後、使用データを取り込んで既定スコープを計算した結果は次のとおりである。418本のうち、どのリクエストエントリポイントからも使用されていないものが137本。既定スコープに残ったのが281本。ここから、人が判断した分が二方向に動いた。業務プロセスを標準に寄せるためにやめると決めたトランザクションが24本あり、これはリクエストエントリポイント単位で明示的にスコープから外している。 逆に、稼働直前に開発した新機能が9本あり、使用実績が無いためパッケージ単位でスコープに追加した。この時点のスコープは266本である。会議に上がったのは、この24本と9本の合計33本だけだった。 残りの385本は計算で決まっている。なお、削除対象137本については、決算整理・税務・開示・固定資産・法定帳票の五領域に該当するものを抽出し、41本を経理部が個別に確認した。うち3本は年一回しか動かないが今後も必要と判断され、スコープに戻している。 最終スコープは269本で、当初の418本から36%減った。カスタムコード適応の工数見積りは約6,000人日となり、当初の9,400人日から3,400人日減っている。プロジェクトマネージャーの総括はこうである。九か月遅らせたのではない。九か月前に設定を一つ入れておかなかったツケを、そこで払っただけである。

決めるのは三つ

第一に、使用実績の収集を、移行の意思決定より先に始める。 SAPは本番システムでABAP Call Monitor(SCMON)を使用し、トランザクションSUSGで最低一年の使用データを収集することを推奨し、プロジェクトに追加する使用データは理想的には最低一年分をカバーすべきであるとしている。理由として挙げられているのは、四半期末および年度末の機能の使用データも考慮されるようにするためである。経理領域のアドオンは期末にしか動かないものが多く、短期間の実績で切ると体系的に取りこぼす。 収集の有効化はSUSGでActivateを選ぶだけの作業であり、移行を決めていない段階でも止める理由がない。

第二に、中央チェックシステムの構成を、経理側の論点として扱う。 SAPは、中央チェックシステムをSAP NetWeaver Application Server for ABAP 7.52に置く構成では、使用データに基づくスコーピングも、スコープやクイックフィックスの有無による絞り込みもできないと明記している。この一点で、捨てるという選択肢の有無が決まる。 SAP Solution Manager経由で使用データを取り込む場合も、使用回数カウンタは0 usagesと表示されるため、実行回数による優先順位づけができない。インフラ費用の比較だけで構成を決めると、移送工数の側で桁違いに支払うことになる。

第三に、会議に上げる対象を、二つの型に限定する。 既定スコープは、使用済みオブジェクト、それらから静的に参照されるオブジェクト、使用データが存在しないオブジェクトタイプを含む形で自動計算される。スコープから外れるのは、明示的に除外したものと、いずれのリクエストエントリポイントからも使用されていないものだけである。したがって人が判断すべきなのは、実績はあるが業務ごとやめるもの(リクエストエントリポイント単位で除外する)と、実績はないがこれから使う開発中の機能(パッケージ単位で追加する)の二つに限られる。 そのうえで、静的コードチェックが動的コーディングを対象外としていること、削除がシステムコンバージョン中の削除トランスポートとして流れることを踏まえ、決算整理・税務・開示・固定資産・法定帳票の領域に該当する削除候補だけは人が一度確認する。残すものを移送するか作り直すかは、複雑度分析(Halstead Difficulty)を使う別の議論として分けて置くSAPアドオン(追加開発)をどこまで作るか|Fit-to-Standardの判断基準)。

まとめ
移行スコープが膨らむのは新規要件ではなく既存アドオンの全量移送であり、要否を部門に聞く順序を変えないかぎり本数は減らない。SAPは「Custom Code Migration Guide for SAP S/4HANA 2025」(PUBLIC、2026年2月25日版)で、カスタムコードのスコーピングにより頻繁に使用されておりS/4HANAへ引き継ぐ必要のあるABAPカスタムコードを特定でき、使用されていないカスタムコードはシステムコンバージョンの際に削除トランスポートリクエストを用いて削除できるとし、スコーピングはCustom Code Migrationアプリでのみサポートされると注記する。前提として推奨されているのは、ABAP Call Monitor(トランザクションSCMON)の使用と、トランザクションSUSGによる本番システムでの最低一年の使用データ収集である。一年という下限には理由が書かれており、四半期末および年度末の機能の使用データも考慮されるようにするためとされる。決算整理・税務・開示・固定資産・法定帳票といった経理領域のアドオンは期末にしか動かないものが多いため、短期間の実績で切ると体系的に取りこぼす。使用データをプロジェクトに追加すると既定スコープが計算され、そこにはすべての使用済みオブジェクト、使用済みオブジェクトから静的に参照されるすべてのオブジェクト、およびデータベーステーブルやデータ要素のように使用データが存在しないオブジェクトが含まれる。オブジェクトがスコープ外になるのは、明示的にオブジェクト単位で除外された場合か、いずれのリクエストエントリポイントからも使用されていない場合の二つだけであり、残るのが既定で落ちるのが例外という非対称な構造になっている。したがって人が判断すべき対象は二つに絞られる。ひとつは、実績はあるが移行後に業務プロセスを変えるためもう使わないもので、リクエストエントリポイント単位で明示的にスコープから外す。もうひとつは、開発中で本番実績がないためスコープに自動追加されない新機能で、パッケージ単位で追加する。この前段として、中央チェックシステムの構成が決定的に効く。SAPは、中央チェックシステムをSAP NetWeaver Application Server for ABAP 7.52に置く構成では使用データに基づくスコーピングもスコープやクイックフィックスの有無による分析結果の絞り込みも行えないと明記しており、この構成を選んだ時点で使用実績で捨てるという方法自体が使えなくなる。SAP Solution Managerで収集した使用データを取り込む場合は、使用回数カウンタが0 usagesと表示され、実行回数による優先順位づけができない。なおSAPのガイドが示す使用実績のカウンタはリクエストエントリポイント配下のプロシージャごとのNumber Usagesであり、利用者数は示されていないため、利用者数を判定基準に置くなら別の経路でデータを取る必要がある。機械的な切り分けには二つの穴がある。SAPはATCについて、すべての潜在的な問題を検出できるわけではなく、たとえば動的コーディングは静的コードチェックの対象外であると注記している。既定スコープが静的参照を前提としている以上、動的呼び出しは参照関係として捕捉されない。また削除はシステムコンバージョン中の削除トランスポートとして流れるため、後から戻すには旧環境からの復元と再テストが必要になり、旧環境の保持期間の判断と一体で決めることになる。実務上の落としどころは、削除候補のうち期末・年度末に動く可能性のある領域だけを人が確認することであり、対象領域は決算整理・税務・開示・固定資産・法定帳票に限定できる。残すと決めたものを移送するか作り直すかは、Custom Code Migrationアプリの複雑度分析でパッケージのHalstead Difficultyを見る別の議論であり、スコープの議論と混ぜない。

関連記事