如何在插入/更新期间设置行的时间戳

时间:2012-08-28 20:22:30

标签: intersystems-cache

我希望每次通过SQL更新或插入字段时都设置一个时间戳列。

我尝试使用SqlComputed属性,但是如果该字段最初为null,则在I%Open或%New和ObjectScript中的对象时设置字段会产生不必要的影响。我不希望在对象为%Save'd(或INSERT'ed / UPDATE'd)之前设置该值。

我该怎么做?

4 个答案:

答案 0 :(得分:0)

如果属性是瞬态或计算的,那么每次检索到值时都会运行SQLComputed计算。如果属性不是,那么计算将在修改时运行并存储在数据库中,这就是您要查找的内容。

答案 1 :(得分:0)

您是否定义了SQLCompute On Change。根据您描述的情况,我认为您要将其定义为%% INSERT,%% UPDATE。

答案 2 :(得分:0)

我猜您可以从以下示例中获得线索。每当您尝试使用COS调用%Save()方法时,都会调用%OnBeforeSave。请注意,当您使用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
}

答案 3 :(得分:0)

如果您可以控制该类,则可以将属性更新为具有如下所示的InitialExpression:

Property CreateTimeStamp As %TimeStamp [ InitialExpression = {$ZDateTime($H,3)} ];