FireDAC 学习 - 6:CachedUpdates 模式下查看被删除的记录

概念

前面的文章 FireDAC 学习 - 5 讲到,将 FdQuery 和 FdMemTable 的 CachedUpdates 设置为 True,然后在 FdMemTable 里面编辑后,可以读取到编辑改动的记录,将编辑改动过的记录输出为 Stream,再通过网络将 Stream 送给 FdQuery 然后提交到数据库。

CachedUpdates 方式下,所有对 FdQuery 或者 FdMemTable 里面的记录的修改,比如用户在绑定的 DBGrid 里面对数据做的修改,都缓存在内存里面,用户可以随时对修改进行 Cancel 等操作(类似于一个 Undo 操作),直到执行了 ApplyUpdates 才会真正写入数据库。

问题

用户在 DGBrid 里面对数据进行操作,修改了一条记录的某个字段的内容,或者新增了几条记录,用户都是能看到的。但删除的记录,用户看不到。如果用户想 Undo 删除的记录,用户如果看不到,想不起来之前删除的是哪条记录,不知道是否该 Undo,怎么办?

解决方法

FdMemTable 有一个属性:FilterChanges,这是一个集合属性。在设计期属性面板可以看到:

FireDAC 学习 - 6:CachedUpdates 模式下查看被删除的记录_第1张图片

 

这里默认没有 rtDeleted,如果把 rtDeleted 加入集合(属性面板里面把 False 改为 True),则即使删除掉的记录,在 DBGrid 里面也显示。

不过这样带来一个界面反馈的问题,删除了一条记录,DBGrid 里面它仍然显示,用户搞不清楚刚才那个删除操作成功了没有,会把人搞糊涂。

一个办法是为 FdMemTable 加上一个计算字段,用于显示每条记录的状态,这样即使该记录存在,状态显示为删除,用户就不会被搞糊涂。当当当,先看效果图:

FireDAC 学习 - 6:CachedUpdates 模式下查看被删除的记录_第2张图片

实现上图功能

1. 在 FdMemTable 里面,增加一个计算字段。这个计算字段在所有字段排列的最后。

2. 为 FdMemTable 的 OnCalcFields 事件增加事件代码如下:

procedure TForm1.FDMemTable2CalcFields(DataSet: TDataSet);
begin
  //  FilterChanges 属性默认包含 rtModified, rtInserted, rtUnmodified,没包含 rtDeleted;
  // 在CachedUpdate 状态下,如果加上 rtDeleted,则被删除的记录,同样显示在 DGBrid 里面。
  //这里增加一个计算字段来显示每条记录的编辑状态,包括已经删除的记录。
  case DataSet.UpdateStatus of
    usUnmodified:
    DataSet.Fields[DataSet.FieldCount -1].AsString :=
    'Unmodified';
    usModified:
    DataSet.Fields[DataSet.FieldCount -1].AsString :=
    'Modified';
    usInserted:
    DataSet.Fields[DataSet.FieldCount -1].AsString :=
    'Inserted';
    usDeleted:
    DataSet.Fields[DataSet.FieldCount -1].AsString :=
    'Deleted';
    end;
end;

3. 设置 FdMemTable 的 FilterChanges 属性。这里我增加了代码,用于切换显示/不显示被删除的记录,不想看到被删除的记录的时候就不显示,增加一个按钮,按钮的事件代码如下:

procedure TForm1.Button8Click(Sender: TObject);
begin
  if rtDeleted in FdMemTable2.FilterChanges then
  begin
    FdMemTable2.FilterChanges := FdMemTable2.FilterChanges - [rtDeleted];
  end
  else
  begin
    FdMemTable2.FilterChanges := FdMemTable2.FilterChanges + [rtDeleted];
  end;
end;

上述代码是对 FilterChanges 这个集合进行操作,减号就是从集合中去掉一个元素,加号是为集合增加一个元素。如果增加了 rtDeleted 则会在 DBGrid 里面显示出已经被删除的记录。

上面效果图的第三条,运行时点击这个 Button8,则会显示/不显示切换。切换到不显示,则上面效果图的第三条不会出现在 DBGrid 里面。

这个功能非常好,提供给了用户一个非常直观的观察自己对这些记录做了什么操作的机会,用户因此可以决定是否需要撤回之前的操作。如何撤回,这里就不多说了,最简单的办法是调用 FdMemTable 的 CancelUpdates 方法。

你可能感兴趣的:(FireDAC,Delphi)