EZH
xy
Данные могут откатываться и в момент редактирования еще до попадания их в БД, тогда это делать надо на уровне приложения. В этом случае изменения данных нужно записывать в лог и откатывать по шагам. Организовать это можно через ClientDataSet он подерживает откат изменений по шагам
ClientDataSet1.CheckBrowseMode;
ClientDataSet1.UndoLastChange(true);
единственный недостаток данные должны проийти Post;
Если делать все самому то можно повесится на событие DataSource.OnDataChange и логировать изменения
затем откатывать
Очень примитивный пример: [more]
var
Form1: TForm1;
Log : TStrings;
isUndo : boolean;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
isUndo:=true;
if log.Count>0 then begin
ClientDataSet1.Fields[1].AsString:=Log.Strings[Log.Count-1];
if log.Count>1 then Log.Delete(Log.Count-1);
end;
isUndo:=false;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
isUndo:=false;
Log:=TStringList.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Log.Free;
end;
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
if (Field=nil) or isUndo then Exit;
if Field.FieldName='Test' then
Log.Add(Field.AsString);
end;
[/more]
xy
Данные могут откатываться и в момент редактирования еще до попадания их в БД, тогда это делать надо на уровне приложения. В этом случае изменения данных нужно записывать в лог и откатывать по шагам. Организовать это можно через ClientDataSet он подерживает откат изменений по шагам
ClientDataSet1.CheckBrowseMode;
ClientDataSet1.UndoLastChange(true);
единственный недостаток данные должны проийти Post;
Если делать все самому то можно повесится на событие DataSource.OnDataChange и логировать изменения
затем откатывать
Очень примитивный пример: [more]
var
Form1: TForm1;
Log : TStrings;
isUndo : boolean;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
isUndo:=true;
if log.Count>0 then begin
ClientDataSet1.Fields[1].AsString:=Log.Strings[Log.Count-1];
if log.Count>1 then Log.Delete(Log.Count-1);
end;
isUndo:=false;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
isUndo:=false;
Log:=TStringList.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Log.Free;
end;
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
if (Field=nil) or isUndo then Exit;
if Field.FieldName='Test' then
Log.Add(Field.AsString);
end;
[/more]