メインコンテンツまでスキップ
バージョン: 20 R6

グローバルスタンプの使い方

概要

4D は内部的な グローバル変更スタンプ を自動的に管理します。これは、アクティビティの監視、バックアップ、増分同期の実行など、データ変更追跡の実装をするのに便利です。

グローバル変更スタンプは、データベースの復元やインポートなどの場合も含め、4D が常に管理する番号です。 ただし、.setGlobalStamp() 関数を使用すればスタンプを変更できることに注意してください。

データ変更追跡を設定および有効化 すると、レコードの変更 (追加・変更・削除) ごとに、以下のアクションが 4D によって自動的に実行されます:

  1. グローバル変更スタンプのカレント値は、関連エンティティの特別な "__GlobalStamp" 属性に保存されます。 削除処理の場合には、削除されたエンティティの情報を持つ新しいエンティティが __DeletedRecords テーブルに追加され、グローバル変更スタンプのカレント値が "__Stamp" 属性に保存されます。

  2. グローバル変更スタンプの値が増分されます。

この仕組みにより、ある時点以降に変更、追加、または削除されたエンティティを特定し、適切なアクションを実行することができます (例題参照)。

info

グローバル変更スタンプ と、オプティミスティック・ロック機能 に使用される内部的な エンティティスタンプ を混同しないでください。

データ変更追跡の設定

デフォルトでは、グローバル変更スタンプは作成されません (.getGlobalStamp() 関数は 0 を返します)。 データ変更追跡を有効にするには、特別なフィールドとテーブルをストラクチャーに追加する必要があります。 ストラクチャーエディターのコンテキストメニューを使用すると、必要な要素をすべて自動的に作成できます。

ストラクチャー要件

データ変更追跡を有効にするには、__GlobalStamp __01 フィールドを持つテーブルが少なくとも 1つ、アプリケーションストラクチャーに含まれていなければなりません。

また、本機能を適切に動作させるためには、以下の条件が必要です:

  • __GlobalStamp フィールドは、自動インデックスRESTリソースとして公開、および 非表示 プロパティが選択された、64ビット整数 である必要があります。
  • 次のフィールドを含む __DeletedRecords テーブルを追加する必要があります:
フィールド説明
__PrimaryKeyText削除されたエンティティのプライマリーキー
__StampInteger 64 bits削除直前のグローバルスタンプ
__TableNameText削除されたエンティティのテーブル名
__TableNumberLong Integer削除されたエンティティのテーブル番号

__GlobalStamp フィールドを持つテーブルのデータ変更のみ追跡できます。

4Dランゲージでは、__GlobalStamp フィールドの値は Real 型変数を介して処理される必要があります。

ストラクチャーエディターを使用する

4Dストラクチャーエディターでは、データ変更追跡の有効化・無効化が、たった一つのメニュー項目で切り替えられます。

データ変更追跡を有効化するには:

  1. データ変更追跡を有効にするテーブルを選択します。
  2. 選択したテーブルを右クリックし、コンテキストメニューから データ変更トラッキングを有効化 を選択します。
  3. 確認用のダイアログボックスが表示されます。 OK をクリックします。

すると、4D は次の変更をおこないます:

  • 設定済みの __GlobalStamp __01 フィールドがテーブルに追加されます。
  • まだ存在していなければ、__DeletedRecords テーブルがストラクチャーに追加されます。

データ変更追跡を無効化するには:

  1. データ変更追跡を無効にするテーブルを選択します。
  2. 選択したテーブルを右クリックし、コンテキストメニューから データ変更トラッキングを無効化 を選択します。
  3. 確認用のダイアログボックスが表示されます。 OK をクリックします。

すると、4D は __GlobalStamp フィールドを当該テーブルから削除します。 __DeletedRecords テーブルを削除したい場合には、手動でおこなう必要があることに注意してください。

例題

var $oldStamp : Real
var $tableName : Text
var $modifiedEmps : cs.EmployeeSelection
var $deletedEmpsInfo : cs.__DeletedRecordsSelection

$tableName:="Employee"
$oldStamp:=... //l 前のスタンプ値をロードして
// カレントスタンプと比較します

If ($oldStamp # ds.getGlobalStamp())
// 新規の、または変更されたエンティティをすべて取得します

$modifiedEmps:=ds[$tableName].query("__GlobalStamp > :1"; $oldStamp)
// 削除されたエンティティをすべて取得します

$deletedEmpsInfo:=ds.__DeletedRecords.query("__Stamp > :1 and __TableName = :2";\
$oldStamp; $tableName)
End if