SM30更新ビューの保存時に変更者・変更日を自動設定する方法|TMGイベント01

SM30でアドオンテーブルや更新ビューを保守するとき、変更者・変更日などを毎回手入力させず、保存時に自動設定したいことがあります。テーブル更新ジェネレータ(TMG)のイベント01「データベース保存前」を使うと、登録・変更された行を保存直前に処理できます。この記事では設定手順と、複数行を更新する場合の実装例を示します。

目的に合わせてイベントを選ぶ

目的 候補 実行タイミング
保存時に変更者・変更日を入れる イベント01 新規・変更・削除をデータベースに書く前
新規行の入力初期値を画面に出す イベント05 「新規エントリ」または「コピー」で行を作るとき
画面に出さない項目を埋める イベント21 ディクショナリで非表示とした項目を埋めるとき

「保存したときのユーザー・日付」を記録するならイベント01が適しています。イベント05だけでは、既存行の変更時には処理されません。また、イベント01は削除行にも呼ばれるため、登録・変更行だけを対象にする条件が必要です。

設定前に確認すること

  • SE11で対象のアドオンテーブルまたは更新ビューを確認し、SM30用の保守ダイアログが生成されていること。テーブル更新ジェネレータはビューそのものを作成する機能ではありません。
  • 自動設定する項目が対象のテーブル/更新ビューに含まれ、ユーザー名・日付と互換性のある型で定義されていること。以下のコードの項目名は例です。
  • 生成した保守ダイアログの汎用グループと、イベント用のユーザーインクルードを確認すること。生成済みの標準処理を直接書き換えると、再生成で失われる可能性があります。

イベント01を登録する手順

  1. SE11またはSE54で対象テーブル/ビューのテーブル更新ジェネレータを開きます。
  2. メニューの環境 → 修正 → イベントを開き、イベント番号01とFORM名(例:SET_COMMON_FIELDS)を登録します。画面の表記はリリースによって異なります。
  3. イベント画面からFORMのエディタを開き、生成汎用グループのユーザーインクルードに処理を書きます。保存・有効化して、必要な開発オブジェクトを移送依頼に含めます。
  4. 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の保守ダイアログ上の処理であり、全更新経路に共通の仕組みではありません。
  • 変更者・変更日を記録しても、変更前後の値の監査履歴を代替するわけではないため、必要に応じてテーブルログや変更伝票を検討すること。

参考・関連記事

コメント

この記事へのコメントはありません。

関連記事

PAGE TOP