2014-04-25 143 views
0

我正在使用絕對數據庫作爲我的數據庫。由於絕對數據庫不支持觸發器,我必須編寫自己的UPDATE觸發器。我試過這種方式:記錄更改時更新表時間戳字段

procedure TDataModule2.ABSQuery6AfterPost(DataSet: TDataSet); 
begin 
    ABSQuery4.Close; 
    ABSQuery4.SQL.Clear; 
    ABSQuery4.SQL.Text :='UPDATE MYTABLE SET RECORDCHANGED=CURRENT_TIMESTAMP'; 
    ABSQuery4.ExecSQL; 
end; 

但是這樣我更新整個表。我如何只更新已更改的記錄(行)?

編輯:這是我如何使它工作

procedure TDataModule2.ABSQuery6AfterPost(DataSet: TDataSet); 
begin 
with ABSQuery4 do begin 
ABSQuery4.Close; 
ABSQuery4.SQL.Clear; 
ABSQuery4.SQL.Text :='UPDATE MYTABLE SET RECORDCHANGED=CURRENT_TIMESTAMP WHERE T_ID=:a1'; 
ABSQuery4.Params.ParamByName('a1').AsInteger := ABSQuery6.FieldByName('T_ID').AsInteger; 
ABSQuery4.ExecSQL; 
end; 
end; 

回答

0

您需要添加到您的查詢「其中」條款。在SQL成爲

update mytable 
set recordchanged = current_timestamp 
where id = id_of_last_changed_record 

最好是通過最後的ID通過參數變更記錄,使您的代碼

with ABSQuery4 do 
begin 
    Close; 
    SQL.Clear; 
    SQL.Text :='UPDATE MYTABLE SET RECORDCHANGED=CURRENT_TIMESTAMP WHERE ID = :P1'; 
    sql.params[0].asinteger:= id_of_last_changed_record; 
    ExecSQL; 
end; 
+0

我在哪裏得到 「id_of_last_changed_record」 ...:)...... ???? – user763539

+1

當然你知道你剛剛更新的記錄的ID。你如何在不知道ID的情況下更新它? –

2

這是可以解決的非常簡單與TDataSet.BeforePost事件(也有看code sample從docwiki)

procedure TDataModule2.ABSQuery6BeforePost(DataSet: TDataSet); 
begin 
    DataSet['RECORDCHANGED'] := now; 
end; 
+1

+1,但請注意服務器和客戶端不會同步時間的問題。實際上,服務器甚至可能處於不同的時區,在這種情況下,記錄的時間將毫無意義。 – Johan

+0

@Sir Rufo - 數據集不處於插入模式。把它放入插入模式,然後調用post會使程序崩潰。 – user763539

+0

你確定你有這種方法連接到'BeforePost'事件嗎?文檔很清楚,在發佈數據之前會調用它,並且數據集必須處於插入或編輯狀態。也許你在'TABSQuery'裏面有一個bug –