背景と目的

物料マスタへ独自項目を追加したい。
さて、既存のタブへ追加するべきか、それとも新しいタブを作るべきか……。

今回は新しいタブ(拡張ビュー)を作ることにしました。
既存画面への影響を最小限に抑えながら、
関連項目をまとめて管理できるためです。
1.業務上の課題
- 標準項目の不足: 標準の物料主データ(MARA/MARC等)には多くの項目があるが、業界特有の要件や自社独自の管理値(例:旧基幹システムのID、特殊なフラグ)を保持する場所がない。
- 画面の複雑化: 既存の標準タブに項目を増設しすぎると、ユーザーが必要な情報を見つけにくくなる。
2.この手法を選ぶ理由
- 独立性の確保: 「拡張」という専用タブにまとめることで、標準機能への影響を最小限に抑えつつ、ユーザーが迷わず入力できる環境を作る。
- メンテナンス性: ABAP開発とカスタマイズを分離することで、将来のシステム変更にも柔軟に対応できる。
3.技術的なゴール
- 単に項目を増やすだけでなく、「データ保存(DB)」「画面表示(UI)」「制御(SPRO)」の3つの整合性を完璧に保つこと。
ステップ1 難易度 ★ データの入れ物を作る(MARAテーブル拡張)

まずは、追加したいデータを保存するための『器』をデータベースに用意するよ。今回は物料の基本情報だから、MARAテーブルを拡張するんだ。
「Append 構造」 ボタンをクリックする。

任意の構造名(例:ZMARA_ENHANCE_ATTR)を入力して新規作成、項目を追加する

任意の構造名(例:ZMARA_ENHANCE_ATTR)を入力して新規作成、項目を追加する



もし数量や金額の項目を追加した場合は、『参照フィールド』 の設定を忘れないようにね。これを怠ると、有効化でエラーが出て先に進めないよ。
ステップ 2 難易度 ★★★ 入力画面を作る(サブスクリーン開発)

器(DB)はできたぜ! 次は何をすればいい?

次は中身の『サブスクリーン』開発だ、標準の MGD1 を ZMGD1 にコピーする。話はそれからだよ。
独自Viewを追加する前に、
まずは標準のMM01/MM02がどのような構造で動いているかを確認する。
品目マスタ関連の画面は、
主に「SAPLMGMM」プログラムを中心に構成されている。
SE80で SAPLMGMM を開くと、大量のScreenが存在していることが分かる。
最初は複雑に見えるが、
実際には各Viewがサブスクリーン単位で分割され、
Screen Sequenceによって動的に制御されている。
つまり、独自View追加の本質は、「新しいサブスクリーンをMMの画面制御に組み込むこと」とも言える。
以下のメニューパスで汎用モジュール登録


ZMGD2 の中に新規スクリーン(例:9001)を作成。





エレメント一覧(一般タブ)にしっかり項目が並んでいます。これで「器(DB)」と「画面(UI)」が紐付いた状態だ。

・PBOは画面表示前に実行される処理です。
ここではMARAに保存されている値を取得し、画面項目へ設定します。
・PAIはユーザ操作後に実行される処理です。
ここでは画面で入力された値を取得し、保存対象の構造へ受け渡します。

入力したデータを MARA に運んだり、保存されているデータを画面に表示したりする『橋渡し』が必要なんだ。
スクリーン(9001)の 「制御ロジック(Flow Logic)」 タブを開く。

MODIFY_SCREEN OUTPUT

MM03(照会モード)の場合は、入力できないようにしたいですよね。
この処理では、追加した独自項目を参照専用(入力不可)にしています。
MODULE MODIFY_SCREEN OUTPUT.
IF SY-TCODE CS '3'.
LOOP AT SCREEN.
IF SCREEN-GROUP1 = 'Z1'.
SCREEN-INPUT = 0.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ENDIF.
ENDMODULE.
- SY-TCODEでMM03を判定
- SCREEN-GROUP1=’Z1’の項目を対象
- SCREEN-INPUT=0で入力不可
GET_DATA OUTPUT

せっかく保存したデータも画面を開くたびに空欄では意味がありません。
そこで、画面表示前に SAP標準の「MARA_GET_SUB」を呼び出し、
保存済みの品目情報を取得します。
これにより、ユーザーは常に最新の値を確認できます。
MODULE GET_DATA OUTPUT.
CALL FUNCTION 'MARA_GET_SUB'
IMPORTING
WMARA = MARA
XMARA = *MARA
YMARA = LMARA.
ENDMODULE.
- PBOで実行される
- MARA_GET_SUBで標準データを取得
- 画面表示時に最新値を反映
MODIFY_DATA INPUT

せっかく入力した値も、
そのまま標準処理へ渡すと消えてしまうことがあります。
そこで一度大切に預かっておき、
標準データを取得した後で戻してあげるわけですね。
MODULE MODIFY_DATA INPUT.
DATA:LV_MAT TYPE MARA-ZZ_MAT_LEVEL,
LV_ECO TYPE MARA-ZZ_ECO_TYPE,
LV_CHG TYPE MARA-ZZ_CHG_DATE,
LV_IS TYPE MARA-ZZ_IS_CRITICAL.
LV_MAT = MARA-ZZ_MAT_LEVEL.
LV_ECO = MARA-ZZ_ECO_TYPE.
LV_CHG = MARA-ZZ_CHG_DATE.
LV_IS = MARA-ZZ_IS_CRITICAL.
CALL FUNCTION 'MARA_GET_SUB'
IMPORTING
WMARA = MARA
XMARA = *MARA
YMARA = LMARA.
MARA-ZZ_MAT_LEVEL = LV_MAT.
MARA-ZZ_ECO_TYPE = LV_ECO.
MARA-ZZ_CHG_DATE = LV_CHG.
MARA-ZZ_IS_CRITICAL = LV_IS.
CALL FUNCTION 'MARA_SET_SUB'
EXPORTING
WMARA = MARA.
ENDMODULE.
- 入力値を先に退避する
- MARA_GET_SUBで標準データを取得する
- 独自項目を再設定する
- MARA_SET_SUBで保存処理へ引き渡す
ステップ3 難易度 ★★★ MM01へ組み込む(拡張プロジェクト登録・画面シーケンス設定)

プログラムと画面の作成、お疲れ様!でも、これだけじゃまだMM01を開いてもアドオン画面は出てこないんだ。最後に、作った画面を標準機能にガッチャンコさせる『紐付け設定』をしていくよ!
SPROパス:ロジスティクス – 一般→品目マスタ→品目マスタのシステム設定→定義:データ画面の構造(画面順序別)


先ほど作成したサブスクリーンを、画面シーケンス21へ追加します。
これにより、MM01/MM02の「標準産業(短)」タブ内で
独自画面が表示されるようになります。

「従属画面」を選択します。
ここでは、タブページ内に表示されるサブスクリーンを管理します。
作成したDynproを登録することで、MM01/MM02画面から呼び出せるようになります。

先ほど作成したDynproを登録します。
Program:SAPLZMGD2
Screen:9001
を指定し、追加画面を呼び出せるようにします。
※一番下などの空いている行(または置き換えたい標準のダミー行)を見つけ、以下のように書き換えます。

完成イメージと動作確認

カサカサ!ついに設定が終わりました!緊張のMM01テストですね……!

そうだよ!さっそく MM01(または MM02/ MM03)を開いて、設定したタブを確認してみて!

MARA


これで『汎用モジュールの作成』から『SPROでの画面配置・テスト』まで、MM01画面拡張の全工程が完了したよ!
さあ、次の冒険に出発だ!
※記事が役に立ったら「いいね」してね👍





コメント