現在参画中のプロジェクトでちょっと試してみたいことがあるので、今回は暗黙拡張を取り扱ってみます。
暗黙拡張(Implicit Enhancement)とは、BADIの一種で、特定のルールの基にプログラム中に拡張ロジックを追加できるものです。標準、アドオン関係なく追加できます。
これだとモディフィケーションじゃないの?と思う人もいるかもしれません。私もほぼモディフィケーションのようなものだと思っています。
そのため、プロジェクトでは禁止にされることが多く、目にする機会は少ないかもしれません。私の場合は1社だけガッツリ使われている会社を経験したことがありますが、最初は暗黙拡張の存在を知らずに入ったので非常に苦労した覚えがあります。
それでは前置きが長くなりましたが、暗黙拡張を見ていきましょう。
モディフィケーションと暗黙拡張の違い
モディフィケーション | 暗黙拡張 | |
標準プログラムの拡張 | 可能 | 可能 |
オブジェクトキー | 必要 | 不要 |
ロジック追加位置 | 任意の場所 | 文頭、文末など特定箇所のみ |
移送依頼 | 必須 | 任意($TMP可) |
SAPサポート | 不可 | 不可 |
ざっくりとまとめてみました。
暗黙拡張は厳密に言えば、プログラムに直接拡張ロジックを書き込むのではありません。拡張する位置をプログラム中で指定して、拡張ロジック自体は別オブジェクトとして作成します。
移送依頼不要でローカルパッケージを使用できるのはそのためです。
続いて、実装方法を見ていきます。
暗黙拡張の実装方法
対象機能
標準プログラム「DEMO_DYNPRO_MODULE」に対して暗黙拡張を入れてみます。

実装手順
SE38でプログラム照会し、拡張ボタン押下
渦巻アイコンが拡張ボタンです。GUIのバージョンやテーマによってアイコンが変わることもあるので、ツールチップ(アイコン上にカーソルを置くと表示される情報)を見て確認してください。テーマがBelizeだと渦巻アイコンではなかったと思います。

拡張可能箇所の表示
メニューバー⇒編集⇒拡張操作⇒暗黙的拡張オプションを表示

拡張位置を決めて登録ボタン押下
form文の先頭と最後、そしてform文の外(プログラム全体の最後)が拡張可能(エディタの左側が「⇒」)として表示されます。
今回はform文の最後に拡張ロジックを入れます。

拡張オブジェクト登録
「コード」を選択

拡張オブジェクトのIDとテキストを入力してENTER押下

今回は移送しないのでローカルオブジェクトとして登録します。

拡張有効化
指定した箇所が白抜きになります。ここにコードを書いて拡張有効化ボタン押下で有効化されます。


今回実装したコードがこちらです。標準プログラムの変数をクリアしてみました。
有効化後は拡張オブジェクトIDの右側(ソースコードの54行目)が「active version」に変わります。

プログラム属性を見てみると、最終変更者は「SAP」で変更日が拡張実行日に変わってますね。
ちなみに、実行ユーザIDは「DEVELOPER」ですが、変更者は一律で「SAP」になるようですね。
暗黙拡張の更新・削除
ソースコードの変更・削除については、登録時と同様にSE38から可能です。
しかし、拡張オブジェクト自体は専用のトランザクションから実行しなければいけません。
SE19を実行
上のブロックの「New BAdI」を選択し、拡張オブジェクトを指定します。
変更ボタンなら変更、ごみ箱ボタンなら削除になります。

(変更の場合)行選択して「Source」ボタン押下

「Source」ボタンを押下するとエディタが表れて拡張部分のみ出てきます。
ベースになるプログラムの変数が一切見えないので、ソースコードに手を加えるならSE38からの方が楽ですね。

(削除の場合)確認画面で続行ボタン押下


削除後にSE38で拡張箇所を見ると、拡張オブジェクトがなくなっていることがわかります。

削除後のプログラム属性を見ると、変更日は元には戻らず、拡張の削除を実行した日に更新されるようです。

まとめ
暗黙拡張は拡張機能の一種であるとは言え、SAPのサポートは受けられないので、シンプルな処理にするなど、使用する際は慎重に判断してくださいね。