サポート > リポジトリ > 繰り返し > [応用] 繰り返しコンテナでデータの変更履歴を管理する

任意のデータに関するすべての変更履歴を画面に表示する例を紹介します。

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

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

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

図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関数を適用する

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

図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() 関数を用いている繰り返しコンテナが一つだけという判定を行っています。
  • ファイル型項目で変更があった場合、実ファイル名部分が変更履歴に記録されます。7.10
    R7.9.2までは、upload_dir フォルダを起点とする相対パス名が記録されました。この動作に戻すこともできます。