グローバルスタンプの使い方
概要
4D は内部的な グローバル変更スタンプ を自動的に管理します。これは、アクティビティの監視、バックアップ、増分同期の実行など、データ変更追跡の実装をするのに便利です。
グローバル変更スタンプは、データベースの復元やインポートなどの場合も含め、4D が常に管理する番号です。 ただし、.setGlobalStamp()
関数を使用すればスタンプを変更できることに注意してください。
データ変更追跡を設定および有効化 すると、レコードの変更 (追加・変更・削除) ごとに、以下のアクションが 4D によって自動的に実行されます:
-
グローバル変更スタンプのカレント値は、関連エンティティの特別な "__GlobalStamp" 属性に保存されます。 削除処理の場合には、削除されたエンティティの情報を持つ新しいエンティティが
__DeletedRecords
テーブルに追加され、グローバル変更スタンプのカレント値が "__Stamp" 属性に保存されます。 -
グローバル変更スタンプの値が増分されます。
この仕組みにより、ある時点以降に変更、追加、または削除されたエンティティを特定し、適切なアクションを実行することができます (例題参照)。
グローバル変更スタンプ と、オプティミスティック・ロック機能 に使用される内部的な エンティティスタンプ を混同しないでください。
データ変更追跡の設定
デフォルトでは、グローバル変更スタンプは作成されません (.getGlobalStamp()
関数は 0 を返します)。 データ変更追跡を有効にするには、特別なフィールドとテーブルをストラクチャーに追加する必要があります。 ストラクチャーエディターのコンテキストメニューを使用すると、必要な要素をすべて自動的に作成できます。
ストラクチャー要件
データ変更追跡を有効にするには、__GlobalStamp __01
フィールドを持つテーブルが少なくとも 1つ、アプリケーションストラクチャーに含まれていなければなりません。
また、本機能を適切に動作させるためには、以下の条件が必要です:
__GlobalStamp
フィールドは、自動インデックス、RESTリソースとして公開、および 非表示 プロパティが選択された、64ビット整数 である必要があります。- 次のフィールドを含む
__DeletedRecords
テーブルを追加する必要があります:
フィールド | 型 | 説明 |
---|---|---|
__PrimaryKey | Text | 削除されたエンティティのプライマリーキー |
__Stamp | Integer 64 bits | 削除直前のグローバルスタンプ |
__TableName | Text | 削除されたエンティティのテーブル名 |
__TableNumber | Long Integer | 削除されたエンティティのテーブル番号 |
__GlobalStamp
フィールドを持つテーブルのデータ変更のみ追跡できます。
4Dランゲージでは、__GlobalStamp
フィールドの値は Real
型変数を介して処理される必要があります。
ストラクチャーエディターを使用する
4Dストラクチャーエディターでは、データ変更追跡の有効化・無効化が、たった一つのメニュー項目で切り替えられます。
データ変更追跡を有効化するには:
- データ変更追跡を有効にするテーブルを選択します。
- 選択したテーブルを右クリックし、コンテキストメニューから データ変更トラッキングを有効化 を選択します。
- 確認用のダイアログボックスが表示されます。 OK をクリックします。
すると、4D は次の変更をおこないます:
- 設定済みの
__GlobalStamp __01
フィールドがテーブルに追加されます。 - まだ存在していなければ、
__DeletedRecords
テーブルがストラクチャーに追加されます。
データ変更追跡を無効化するには:
- データ変更追跡を無効にするテーブルを選択します。
- 選択したテーブルを右クリックし、コンテキストメニューから データ変更トラッキングを無効化 を選択します。
- 確認用のダイアログボックスが表示されます。 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