データの世代管理最終更新日: 2021年3月8日

概要

世代管理とは、あるデータに対して何らかの操作(登録・更新・削除)が行われた際、その操作直前と操作後のデータ状態をバックアップしておき、後で確認できる機能です。
次の操作を行うたびに「元データ」に加えて以下の情報がデータごとに記録されます。

  • 操作日時
  • 操作種別(登録・更新・削除)
  • 操作者(ログオンID)
データの操作履歴(一覧)

「詳細」をクリックすると、その時点のデータが表示されます。

操作時点のデータを表示
※ 世代管理の詳細画面(図2)では「前へ」「次へ」ボタンは無効となっています。このボタンは後述する「管理処理から確認する」を行ったときに有効となります。

設定方法

顧客管理アドオン(JSHCUSTOMER)の「顧客」モデルに世代管理機能を追加する例で説明します。

顧客管理アドオンの顧客モデル
  1. 世代管理機能を追加したいモデルの編集画面から「画面>その他」タブを開きます。
    「世代管理>世代管理用モデルを用意する」にチェックを入れます。
    世代管理の設定

    その他の設定

    世代管理用モデルID

    世代管理用にデータベース内部で用意されるモデルのIDを指定することができます。
    通常は空白とします。(空白の場合、"JSH"+[モデルID]+"GEN" が自動設定されます。)

    詳細画面に履歴表示欄を用意する

    モデルの詳細表示画面に、このデータの世代を表示するかを設定します。
    標準で有効になっています。このページでは本設定を有効とした場合で説明します。

    ログに変更履歴を残す

    この設定は、変更された情報だけを履歴として残すという別機能になります。通常、データごとの世代管理(このページの内容)を設定する場合、ログに変更履歴を残す設定と併用する必要はありません。
    この設定の詳細は「繰り返しコンテナでデータの変更履歴を管理する」をお読みください。

  2. 「項目」タブに戻り、「ギアアイコン>テンプレート>世代管理項目」をクリックします。
    世代管理用のテンプレート追加
  3. 世代管理を行うのに必要なモデル項目が追加されました。
    これで、世代管理機能の追加は完了です。

    注意

    ここで追加された世代管理のための管理項目を変更することはできません。例えば検索や一覧表示の設定(チェックボックス)を追加したり削除することもできません。標準のままご利用ください。
    ※ 設定を変更するとビルドに失敗し、正常動作しなくなる可能性があります。

    世代管理用のテンプレート項目

    世代管理テンプレートの項目

    追加された項目とそれぞれの役割は次の通りです。

    項目名項目ID役割
    世代一覧JSHGLAYOUTITEMレイアウト専用項目です。このあと、レイアウトの設定方法を説明します。
    操作IDJSHGOPERATIONID自動採番される値です。システム内部で用いられます。
    操作日付JSHGOPERATIONDATE登録、変更、削除操作が行われた日付時刻です。
    操作種別JSHGOPERATIONTYPE登録、変更、削除といった操作の種別を記します。画面からの操作による変更の場合は (前) (後) を区別します。
    操作者JSHGOPERATIONUSERID操作を行ったユーザIDです。
    操作対象モデルJSHGOPERATIONMODELID通常は空白です。対象モデルがサブモデルの場合、サブモデルのIDが記録されます。
  4. 次に、世代管理機能の追加後、詳細画面で表示する更新履歴を折りたたみ可能にする手順を説明します。
    モデルの「レイアウト>詳細」を開くと、「世代一覧」というレイアウトが追加されています。
    レイアウト設定画面
  5. 左端メニューで「タイトルペイン」タブをクリックして開きます。
    ラベルは任意に設定できます。ここでは "世代管理" とします。「画面表示時に折り畳んで表示する」にチェックを入れることで、世代管理に関する情報を最初は非表示とすることができます。設定後、「追加」ボタンをクリックします。
    折り畳みレイアウトの適用(1)
  6. レイアウト専用項目 "世代一覧" をクリックして選択します。この項目だけを(前の手順で用意した)折り畳みレイアウトにドラッグ&ドロップします。
    折り畳みレイアウトの適用(2)
  7. 「レイアウト設定保存」ボタンをクリックし、編集したレイアウトを保存します。
    これで折り畳みレイアウトの設定は完了です。
    折り畳みレイアウトの適用(2)

管理処理から確認する

システム管理者権限を有したアカウントでログオンしたとき、管理処理メニューを操作できます。このとき「管理処理>モデル定義」から、世代管理を有効にしたモデルを選択し、これらのモデルについての世代情報を確認することもできます。

スクリプトでの利用

世代管理を有効にしたモデルでは、ヘルパクラスに saveAsGeneration というメソッドが生成されます。第一引数がストアモデル(entity)、第二引数がタイプ(後述)、第三引数は p です。

<モデルID>Helper.saveAsGeneration(entity, GenerationType.INSERT, p);//insert時

<モデルID>Helper.saveAsGeneration(entity, GenerationType.AFTERUPDATE, p);//update時

<モデルID>Helper.saveAsGeneration(entity, GenerationType.DELETE, p);//delete時

<モデルID>Helper.saveAsGeneration(entity, GenerationType.LOGICALDELETE, p);//logicalDelete(論理削除)時

第二引数はjp.jasminesoft.jfc.GenerationTypeとなっており、次のような定数が用意されています。

public interface GenerationType {
  int INSERT = 1;
  int BEFOREUPDATE = 2;
  int AFTERUPDATE = 3;
  int DELETE = 4;
  int LOGICALDELETE = 5;
}

更新の扱い

エンティティサービスの更新では、第二引数に GenerationType.AFTERUPDATE を指定しています。これを変更することはできません。

画面からの操作と同様に GenerationType.BEFOREUPDATE の状態も記録したい場合、EntityServiceを呼び出す*直前*に

<モデルID>Helper.saveAsGeneration(変更前のentity, GenerationType.BEFOREUPDATE, p);

を手動で呼び出すことで、変更前の状態を記録させることができます。

※ 変更前のentityをメモリ上にもっておく必要があります。こちらは開発するスクリプト内で意識して保持するようにしてください。

仕様・制約

  • 親子モデルで、子モデル同時更新を設定した場合、親モデルで世代管理を有効にすることができません。 R9.0.2で対応しました。
  • CSVアップロード更新からの修正は、世代管理に反映されません。 R9.0.2で対応しました。