记录更改时更新表时间戳字段

时间:2014-04-25 02:55:07

标签: delphi delphi-xe4 absolute-db

我使用绝对数据库作为我的数据库。由于绝对数据库不支持触发器,我必须编写自己的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;

2 个答案:

答案 0 :(得分:2)

这可以通过TDataSet.BeforePost事件非常直接地解决(也可以查看来自docwiki的code sample

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

答案 1 :(得分: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;