在开发软件中,记录软件的操作日志 是很有必要的,一来可以查找错误,二来可以优化性能,三来呢 要是碰到客户死活不承认这样操作,说你们软件又问题,打开数据库一查日志。。。。
要记录操作日志就要说一下FireDac 数据集的 delta ,这个对象中存储值数据的变化,在默认情况下 只有新增和修改的变化,没的删除的,需要FilterChanges的数据设置成
FDMemTable2.FilterChanges := [rtModified, rtInserted, rtDeleted, rtUnmodified];
部分源码 :
procedure TForm1.btn1Click(Sender: TObject);
var
strlog: string;
i: Integer;
begin
FDMemTable2.Close;
FDMemTable2.FilterChanges := [rtModified, rtInserted, rtDeleted, rtUnmodified];
// FDMemTable2.FilterChanges 要包含rtDeleted 才能看到删除数据,默认没有rtDeleted
FDMemTable2.Data := FDMemTable1.Delta;
with FDMemTable2 do
begin
First;
while not Eof do
//for 循环数据集的列 即可以记录操作日志,在系统中 记录操作人 操作了什么是很有必要的一个功能
begin
if UpdateStatus = usModified then
begin
Strlog := 'update: ';
for I := 0 to FieldCount - 1 do
begin
if Fields[i].Value <> Fields[i].OldValue then
Strlog := Strlog + Format('列:%s[旧值:%s > 新值:%s] ', [Fields[i].FieldName, Fields[i].OldValue, Fields[i].Value]);
end;
mmo1.Lines.Add(strlog);
end
else if UpdateStatus = usInserted then
begin
Strlog := 'insert: ';
for I := 0 to FieldCount - 1 do
begin
Strlog := Strlog + Format('列:%s[值:%s] ', [Fields[i].FieldName, Fields[i].Value]);
end;
mmo1.Lines.Add(strlog);
end
else if UpdateStatus = usDeleted then
begin
Strlog := 'delete: ';
for I := 0 to FieldCount - 1 do
begin
Strlog := Strlog + Format('列:%s[值:%s] ', [Fields[i].FieldName, Fields[i].Value]);
end;
mmo1.Lines.Add(strlog);
end;
Next;
end;
end;
end;
注意:
FDMemTable1.CachedUpdates:=True;
FDMemTable2.FilterChanges := [rtModified, rtInserted, rtDeleted, rtUnmodified];
全部源码 我已经上传到 :
http://download.csdn.net/detail/u013051638/9699098
Q群 Delphi Home 235236282,欢迎delphi 爱好者加入,一起学习、进步。