SQL 経由でフィールドが更新または挿入されるたびに、タイムスタンプ列を設定したいと考えています。
SqlComputed プロパティを使用してみましたが、フィールドが最初に null の場合、%Open または %New と ObjectScript でオブジェクトを設定するときに、フィールドを設定するという望ましくない副作用があります。オブジェクトが %Save (または INSERT/UPDATE) されるまで値を設定したくありません。
これどうやってするの?
SQL 経由でフィールドが更新または挿入されるたびに、タイムスタンプ列を設定したいと考えています。
SqlComputed プロパティを使用してみましたが、フィールドが最初に null の場合、%Open または %New と ObjectScript でオブジェクトを設定するときに、フィールドを設定するという望ましくない副作用があります。オブジェクトが %Save (または INSERT/UPDATE) されるまで値を設定したくありません。
これどうやってするの?
次の例からヒントを得ることができると思います。%OnBeforeSave は、COS を使用して %Save() メソッドを呼び出そうとするたびに呼び出されます。ただし、SQL tho を使用して 'insert' または 'update' を使用する場合、このメソッドは呼び出されないことに注意してください。
Property LastModified As %Date;
Property RegDate As %Date;
///
/// This callback method is invoked by the <METHOD>%Save</METHOD> method to
/// provide notification that the object is being saved. It is called before
/// any data is written to disk.
///
/// <P><VAR>insert</VAR> will be set to 1 if this object is being saved for the first time.
///
/// <P>If this method returns an error then the call to <METHOD>%Save</METHOD> will fail.
Method %OnBeforeSave(insert As %Boolean) As %Status [ Private ]
{
if insert s ..RegDate=$h
s ..LastModified = $h
quit $$$OK
}
クラスを制御できる場合は、プロパティを更新して、以下のように InitialExpression を持つことができます。
Property CreateTimeStamp As %TimeStamp [ InitialExpression = {$ZDateTime($H,3)} ];
プロパティが一時的または計算された場合、値が取得されるたびに SQLComputed 計算が実行されます。プロパティがどちらでもない場合、計算は変更時に実行され、探しているデータベースに保存されます。
SQLCompute On Change を定義しましたか。説明したケースに基づいて、%%INSERT、%%UPDATE として定義したいと思います。