マスタメンテナンスアプリケーションで値を変更時にログを出力する方法。

概要

このCookBookでは、マスタメンテナンスアプリケーションで、すでに登録されたマスタデータの値を変更して更新する際に、どの項目がどのように変更されたかをログ出力する機能の実装方法を記載します。

重要なマスタデータでは、変更履歴のログを取得する必要があることがあり、そのようなケースにご活用頂けます。

出力するログ情報

'User 「ユーザID」 changes 「変更項目」 from 「修正前の値」 to 「修正後の値」.'

本サンプルではシステムログに出力する実装としております。

intra-mart Accel Platform ログ仕様書 システムログ

完成サンプル

以下の完成サンプルをダウンロードしてご活用ください。
このサンプルは、2025 Spring 版以降でインポートできます。

サンプルデータ:cookbook251313_sample.zip

AccelStudio のアプリケーションインポート機能を利用してインポートしてください。

手順

  1. マスタメンテナンスアプリケーションの作成
  2. 修正前の値を取得
  3. ログの生成
  4. ログの出力

マスタメンテナンスアプリケーションの作成

マスタメンテナンスアプリケーションと適当なデータを用意します。
以下に移動し、「example.xlsx」をダウンロードします。
「サイトマップ - Accel Studio - アプリケーション作成 - 業務テンプレート一覧 - マスタメンテナンス - Excelファイルを利用」

cookbook251313_01

「Select Files」ボタンをクリックし、ダウンロードした「example.xlsx」を選択します。

cookbook251313_02

「Upload」ボタンをクリックします。

cookbook251313_03

「Create Application」ボタンをクリックします。

cookbook251313_04

テンプレートビルドジョブのステータスが「COMPLETE」になったら、以下の詳細ボタンをクリックし、作成したアプリケーション詳細画面へ遷移します。

cookbook251313_05

cookbook251313_06

修正前の値を取得

更新時にログを出力する処理を作成します。
「Logic」タブをクリックし、「example edit process」をクリックします。

cookbook251313_07

修正前と修正後の値を比較するために、修正前の値を更新が行われる前に取得します。
修正前の値を保持する変数を用意します。
「Variable Settings」ボタンをクリックします。

cookbook251313_08

「IM-Repository」をクリックします。

cookbook251313_09

「sample」エンティティを選択し、「OK」ボタンをクリックします。

cookbook251313_10

変数が追加されます。
変数名をわかりやすい名前に変更するために、追加したIM-Repository変数を選択し、「Change Key Name」ボタンをクリックします。

cookbook251313_11

「before_entity」に名前を変更し、「OK」ボタンをクリックします。

cookbook251313_12

続いて、修正前の値を取得するロジックと取得した値を先程作成した変数に代入するロジックを作成します。
最初に、修正前の値を取得するロジックの作成を行います。
「IM-Repository - Acquire Entity Data」ロジックを追加します。

cookbook251313_13

cookbook251313_14

エンティティデータの生成を行うため、「Search」ボタンをクリックし、「Entity ID」を設定します。

cookbook251313_15

「sample」エンティティを選択し、「Submit」ボタンをクリックします。

cookbook251313_16

取得するエンティティデータの主キーを指定します。
「Mapping Setting」ボタンをクリックします。

cookbook251313_17

主キーの紐づけを行い、「OK」ボタンをクリックします。

cookbook251313_18

次は、取得したエンティティを変数に代入するロジックの作成を行います。
「Base - Variable Operation」ロジックを追加します。

cookbook251313_19

cookbook251313_20

マッピングの設定を行うため、追加した「Base - Variable Operation」ロジックを選択し、「Mapping Setting」ボタンをクリックします。

cookbook251313_21

ヘッダ左上に位置するセレクトボックスから、先程設定したエンティティデータ取得ロジックを選択し、「Add Input」ボタンをクリックします。

cookbook251313_22

追加したエンティティとbefore_entityの紐づけを行い、「OK」ボタンをクリックします。

cookbook251313_23

追加したロジックをエンティティの更新ロジックの前に配置します。

cookbook251313_24

cookbook251313_25

ログの生成

以上の手順で用意した値を元に、修正があった場合、ログを生成するロジックを作成します。
「Add User Definition - JavaScript Definition Create Newly」をクリックします。

cookbook251313_26

表示されたダイアログで、以下の内容に修正し、「Register」ボタンをクリックします。
Available Range:チェックあり
User Definition ID:generate_log
User Definition Name:generate_log
Input Value:before_entity(IM-Repository - sample), after_entity(IM-Repository - sample), user_cd(string)
※before_entity, after_entityは、IM-Repositoryからsampleエンティティを選択し、名前を変更。
Return Value:log_items(string[])
Script:以下、変更があった場合にログを生成し、文字列の配列を返す処理を記載します。

function run(input) {
    var beforeValue = input.before_entity;
    var afterValue = input.after_entity;
    var logItems = Object.keys(beforeValue)
        .filter(function(key) {
            if (
              beforeValue[key] !== null
              && afterValue[key] !== null
              && typeof beforeValue[key].getTime === 'function'
              && typeof afterValue[key].getTime === 'function'
            ) {
                return beforeValue[key].toDateString() !== afterValue[key].toDateString();
            } else {
                return beforeValue[key] !== afterValue[key];
            }
        })
        .map(function(key) {
            return 'User 「' + input.user_cd + '」 changes 「' + key + '」 from 「' + beforeValue[key] + '」 to 「' + afterValue[key] + '」.';
        });

    return {
        log_items: logItems
    };
}

cookbook251313_27

cookbook251313_68

マッピングの設定を行うため、追加した「generate_log」ロジックを選択し、「Mapping Setting」ボタンをクリックします。

cookbook251313_29

ヘッダ左上に位置するセレクトボックスから、「Account Context」を選択し、「Add Input」ボタンをクリックします。

cookbook251313_30

以下、紐づけを行い、「OK」ボタンをクリックします。
- Inputのエンティティをafter_entityに紐づけ。
- Variableのbefore_entityをbefore_entityに紐づけ。
- Account ContextのuserCdをuser_cdに紐づけ。

cookbook251313_31

ログの出力

生成したログの配列に対して繰り返し処理を行い、ログを出力します。
「Base - Loop Start」ロジックを追加します。

cookbook251313_32

繰り返し対象を選択します。
「Loop Start」を選択した状態で、「Loop Target」の「Select」ボタンをクリックします。

cookbook251313_33

ログの生成ロジックの返却値を選択し、「OK」ボタンをクリックします。

cookbook251313_34

続いて、ログを出力するために「Generic Tasks - Log Output」ロジックを追加します。

cookbook251313_35

マッピングの設定を行うため、追加した「Generic Tasks - Log Output」ロジックを選択し、「Mapping Setting」ボタンをクリックします。

cookbook251313_36

ヘッダ左上に位置するセレクトボックスから、先程追加した繰り返しロジックを選択し、「Add Input」ボタンをクリックします。

cookbook251313_37

追加した繰り返しロジックのitemをログ出力の出力項目に紐づけを行い、「OK」ボタンをクリックします。

cookbook251313_38

追加したロジックをエンティティの更新ロジックの後に配置します。

cookbook251313_39

cookbook251313_40

修正内容を保存します。
「Save」ボタンをクリックします。

cookbook251313_73

「Save」ダイアログの「OK」ボタンをクリックし、保存します。

cookbook251313_74

動作確認のため、更新を行います。
アプリケーション詳細画面の「example List Screen」をクリックします。

cookbook251313_41

「プレビュー」ボタンをクリックします。

cookbook251313_69

適当な値の編集アイコンをクリックし、編集画面へ移動します。

cookbook251313_75

値を編集後、「Update」ボタンをクリックします。

cookbook251313_43

ログが出力されていることを確認します。
ログ出力がデフォルトの場合「%RESIN_HOME%/webapps/imart/WEB-INF/log/platform/system.log」に出力されます。

cookbook251313_70

また、アプリケーション詳細画面から、システムログを確認することも可能です。
ヘッダーメニューの「Log - System Log List」をクリックします。

cookbook251313_71

cookbook251313_72