繰り返しコンテナでデータの変更履歴を管理する

最終更新日: 2021年5月6日
R8 | R9

変更履歴を有効にする

更新処理を行ったとき、ログファイル(logs/system.log)に次のような記録を残すことができます。

updateCustomer|DoUpdate:1000|
モデル'customer'の項目'顧客名'の値'鈴木 花子'が'佐藤 花子'に変更されました。 
実際には一行で出力されます。

この機能は標準では無効になっています。有効にする場合は「画面>その他>世代管理>ログに変更履歴を残す」を有効にします。

図1 変更履歴機能を有効にする

ワンポイント

本設定は変更のみならず、値の追加ならびに削除時にもログが出力されます。

モデルの詳細画面に変更履歴を表示する(1) - 先頭に追加される

ここでは繰り返しコンテナを用いて、任意のデータに関するすべての変更履歴を画面に表示する例を紹介します。

図2 変更履歴が繰り返しコンテナの先頭に追加される

定義方法

変更履歴を管理する5つの項目を追加します。(項目名、項目IDはここに示した以外でもかまいません。)

項目名 項目ID ラベルの幅 読み込み専用
変更履歴 changelog 繰り返しコンテナ - -
No changelog/cid 繰り返しコンテナID 5%
日付時刻 changelog/cdate 日付時刻 20%
ユーザID changelog/cuserid 文字列(ユーザID) 10%
内容 changelog/ccontent 文字列(テキストエリア) 65%
図3 用意する項目

繰り返しコンテナ changelog

  • 初期表示数を 0 に設定します。
  • 「繰り返し項目の自動増減」を設定します。ここでは増減タイミングを「初期値設定の前」とし、増減位置を「先頭に追加」とします。
  • 追加・挿入・削除・移動ボタンを表示しない、とします。
図4 繰り返しコンテナchangelogの設定

ワンポイント

コンテナの先頭に、最新の変更履歴を格納しようとしています。

繰り返しコンテナID changelog/cid

「出力制御>スタイル>ラベルの幅」を 5% とします。(以降、ラベルの幅設定の説明は省略します。)

日付時刻 changelog/cdate

日付時刻型とします。

図5 日付時刻型とする

読込専用とします。

図6 日付時刻項目を読取専用とする

日付時刻型の項目は標準でコンテナ内のソート機能が有効になっています。これを解除します。

図7 日付時刻項目によるコンテナ内のソート機能を解除する

ソートは無効とすること

上の日付項目だけでなく、コンテナのソート機能はすべて無効としてください。
本機能はコンテナの先頭(または末尾)に変更履歴を追加することを前提としてるため、ユーザが任意に(コンテナの並びを)ソートしてしまうと、動作を保証できなくなります。

登録・更新時の初期値を次のように式で設定します。

IF(CID()==FIRST(${changelog/cid}),NOW(),${changelog/cdate})

CIDは繰り返しコンテナでのみ使える特別な関数で、コンテナ内の位置を返します。この式は、先頭の行にはNOW関数の結果を適用し、それ以外は現時点の値をそのまま維持する、というものです。

図8 日付時刻項目の初期値

ユーザID changelog/cuserid

読込専用とします。

図9 ユーザID項目を読取専用とする

登録・更新時の初期値を次のように式で設定します。

IF(CID()==FIRST(${changelog/cid}),USERINFO("userid"),${changelog/cuserid})

この式は、先頭の行には現在ログオンしているアカウントのuseridを適用し、それ以外は現時点の値をそのまま維持する、というものです。

図10 ユーザID項目の初期値

内容 changelog/ccontent

入力項目の種類を「テキストエリア」とします。また、読込専用とします。

図11 内容項目を読取専用とする

内容の初期値を次のように式で設定します。

内容項目(新規登録)

IF(
  CID()==FIRST(${changelog/cid}),
  "データを新規に登録しました。",
  ${changelog/ccontent}
)

内容項目(更新)

IF(
  CID()==FIRST(${changelog/cid}),
  CHANGELOG(),
  ${changelog/ccontent}
)

この式は、先頭の行にはCHANGELOG関数の結果を適用し、それ以外は現時点の値をそのまま維持する、というものです。

図12 内容項目の初期値にCHANGELOG関数を適用する

注意

変更履歴内容を管理する項目の型が「テキストエリア」となっていない場合、標準で格納できる文字列の最大数は255文字に制限されます。

モデルの詳細画面に変更履歴を表示する(2) - 末尾に追加される

上の例は、繰り返しコンテナ「変更履歴」の先頭に、最新の更新履歴を追加するものでした。 これをコンテナの末尾に追加するように変更する方法を説明します。

図13 変更履歴が繰り返しコンテナの末尾に追加される

設定の変更

図4の「繰り返し項目の自動増減」を「先頭に追加」から「末尾に追加」に変更します。

図14 末尾に追加する設定

続いて、初期値の式でFIRST関数をLAST関数へ変更します。(日付時刻、ユーザID、内容項目のいずれも変更します。)

日付時刻項目

IF(CID()==LAST(${changelog/cid}),NOW(),${changelog/cdate})

ユーザID項目

IF(CID()==LAST(${changelog/cid}),USERINFO("userid"),${changelog/cuserid})

内容項目(新規登録)

IF(
  CID()==LAST(${changelog/cid}),
  "データを新規に登録しました。",
  ${changelog/ccontent}
)

内容項目(更新)

IF(
  CID()==LAST(${changelog/cid}),
  CHANGELOG(),
  ${changelog/ccontent}
)
図15 内容項目の初期値にCHANGELOG関数を適用する

ワンポイント

これでコンテナの末尾に、最新の変更履歴が格納されます。

テンプレートモデルとして用意する

複数のモデルで変更履歴を扱うような場合は、テンプレートモデルにすると便利です。 ここでは「システム」タブ内の jfcDesignerUserTemplateModelitem1 を「変更履歴」テンプレートとする例を示します。

図16 変更履歴テンプレートの作成

システムタブ一覧には、作成した変更履歴テンプレートを確認できます

図17 システムタブ内のモデル

適用例

任意のモデルに対して、ギアアイコンから「テンプレート>変更履歴」を選択してみます。

図18 変更履歴テンプレート項目群を追加する

変更履歴に関する5つの項目がモデルに追加されます。

図19 追加された項目

最後に、このモデルの変更履歴機能を有効にします。

図20 変更履歴機能を有効にする

仕様・制約

  • メール送信の成功、失敗条件と併用することができません。
  • 変更履歴として用いる繰り返しコンテナは、一つのモデルに「最大一つだけ」用意することができます。同じ(変更履歴を管理する目的の)コンテナを二つ以上、定義することはできません。
    具体的には、初期値の式に CHANGELOG() 関数を用いている繰り返しコンテナが一つだけという判定を行っています。
  • ファイル型項目で変更があった場合、実ファイル名部分が変更履歴に記録されます。