SM30でアドオンテーブルや更新ビューを保守するとき、変更者・変更日などを毎回手入力させず、保存時に自動設定したいことがあります。テーブル更新ジェネレータ(TMG)のイベント01「データベース保存前」を使うと、登録・変更された行を保存直前に処理できます。この記事では設定手順と、複数行を更新する場合の実装例を示します。
目的に合わせてイベントを選ぶ
| 目的 | 候補 | 実行タイミング |
|---|---|---|
| 保存時に変更者・変更日を入れる | イベント01 | 新規・変更・削除をデータベースに書く前 |
| 新規行の入力初期値を画面に出す | イベント05 | 「新規エントリ」または「コピー」で行を作るとき |
| 画面に出さない項目を埋める | イベント21 | ディクショナリで非表示とした項目を埋めるとき |
「保存したときのユーザー・日付」を記録するならイベント01が適しています。イベント05だけでは、既存行の変更時には処理されません。また、イベント01は削除行にも呼ばれるため、登録・変更行だけを対象にする条件が必要です。
設定前に確認すること
- SE11で対象のアドオンテーブルまたは更新ビューを確認し、SM30用の保守ダイアログが生成されていること。テーブル更新ジェネレータはビューそのものを作成する機能ではありません。
- 自動設定する項目が対象のテーブル/更新ビューに含まれ、ユーザー名・日付と互換性のある型で定義されていること。以下のコードの項目名は例です。
- 生成した保守ダイアログの汎用グループと、イベント用のユーザーインクルードを確認すること。生成済みの標準処理を直接書き換えると、再生成で失われる可能性があります。
イベント01を登録する手順
- SE11またはSE54で対象テーブル/ビューのテーブル更新ジェネレータを開きます。
- メニューの環境 → 修正 → イベントを開き、イベント番号01とFORM名(例:
SET_COMMON_FIELDS)を登録します。画面の表記はリリースによって異なります。 - イベント画面からFORMのエディタを開き、生成汎用グループのユーザーインクルードに処理を書きます。保存・有効化して、必要な開発オブジェクトを移送依頼に含めます。
- SM30で新規行の登録、既存行の変更、複数行の保存を試し、保存後に対象項目を照会します。
実装例:変更者と変更日を保存時に設定する
例では保守対象にZZ_CHANGED_BYとZZ_CHANGED_ONという項目があるものとします。実際の項目名に置き換え、対象ビューの構造と型を確認してください。
FORM set_common_fields.
DATA lv_extract_index TYPE sy-tabix.
FIELD-SYMBOLS: <changed_by> TYPE any,
<changed_on> TYPE any.
LOOP AT total.
CHECK <action> = neuer_eintrag OR
<action> = aendern.
CLEAR lv_extract_index.
READ TABLE extract WITH KEY <vim_xtotal_key>.
IF sy-subrc = 0.
lv_extract_index = sy-tabix.
ENDIF.
ASSIGN COMPONENT 'ZZ_CHANGED_BY'
OF STRUCTURE <vim_total_struc> TO <changed_by>.
IF sy-subrc = 0.
<changed_by> = sy-uname.
ENDIF.
ASSIGN COMPONENT 'ZZ_CHANGED_ON'
OF STRUCTURE <vim_total_struc> TO <changed_on>.
IF sy-subrc = 0.
<changed_on> = sy-datum.
ENDIF.
MODIFY total.
IF lv_extract_index > 0.
extract = total.
MODIFY extract INDEX lv_extract_index.
ENDIF.
ENDLOOP.
sy-subrc = 0.
ENDFORM.
TOTALには保守対象の行が保持され、EXTRACTには画面で扱う行が保持されます。イベント01で値を変更したら両方の整合を取ります。<action>で新規行(NEUER_EINTRAG)と変更行(AENDERN)だけを選び、削除行や未変更行は触れません。SAPのイベント01の仕様では、FORMの終了時にSY-SUBRCを0にします。
項目を画面から編集させたくない場合は、画面項目の入力可否や非表示項目の扱いも設計してください。非表示項目を埋める専用のイベント21もあります。生成画面のレイアウトを直接変更する場合は、再生成時の影響を確認します。
テスト時の確認ポイント
- 新規登録と既存行の変更で、保存したユーザーと日付が入るか。
- 複数行の保存時に全対象行へ値が入り、変更していない行は更新されないか。
- コピー・削除・保存せず終了した場合に、意図しない更新が起きないか。
- SM30以外のプログラムやインターフェースから直接テーブルを更新する場合も同じ項目が必要か。TMGイベントはSM30の保守ダイアログ上の処理であり、全更新経路に共通の仕組みではありません。
- 変更者・変更日を記録しても、変更前後の値の監査履歴を代替するわけではないため、必要に応じてテーブルログや変更伝票を検討すること。
参考・関連記事
- SE16Nでテーブルデータを変更する方法と注意点:SM30を使う場面と、直接更新を避ける理由。
- 更新ビューの値をクライアント間で同期する方法:保守した設定値を別クライアントと比較・反映する手順。
- カスタマイズのクライアント依存・非依存の見方:更新対象の影響範囲を確認する。
- ABAPデバッグの進め方:保存時に値が入らない場合の調査方法。
コメント