如何检测ApplyUpdates是否会插入或更新数据?
-
11-09-2019 - |
题
在 ClientDataSet 的 AfterPost 事件处理程序中,我需要当前记录的 ApplyUpdates 函数是否将执行更新或插入的信息。
AfterPost 事件将为新的和更新的记录执行,我不想声明一个新的 Flag 变量来指示“更新”或“插入”操作是否正在进行。
示例代码:
procedure TdmMain.QryTestAfterPost(DataSet: TDataSet);
begin
if IsInserting(QryTest) then
// ShowMessage('Inserting')...
else
// ShowMessage('Updating');
QryTest.ApplyUpdates(-1);
end;
ApplyUpdate 完成后,应用程序将在 AfterPost 方法中写入日志。所以这个方法是最接近动作的地方,我更喜欢一个完全可以插入到这个事件处理程序中的解决方案。
如何使用 ClientDataSet 实例 QryTest 中的信息来实现 IsInserting 函数?
编辑: :我将尝试 ClientDataSet.UpdateStatus 的解释 这里.
解决方案
ApplyUpdates方法不会给你的信息 - 因为它可以插入,更新和删除
的ApplyUpdates应用存储德尔塔阵列上的变化的信息。该改变信息可以,例如,包含任意数量的不同类型的(插入,缺失和修正方面)的变化,并且所有这些将在相同的呼叫来施加。
在的TDataSetProvider你有BeforeUpdateRecord事件(或类似的东西,睡不上的内存:-)有趣的事情)。前三角洲的每个记录应用到底层数据库/数据集,因此,地方得到这样的信息,该事件被称为...但Showmessage将停止应用程序。
编辑:现在,我记得有另一种选择:您可以指定三角洲另一个ClientDataSet的数据属性和读取数据集UpdateStatus该记录。 当然,你需要做到这一点的前的做的ApplyUpdates ...
var
cdsAux: TClientDataset;
begin
.
.
<creation of cdsAux>
cdsAUx.Data := cdsUpdated.Delta;
cdsAux.First;
case cdsAux.UpdateStatus of
usModified:
ShowMessage('Modified');
usInserted:
ShowMessage('Inserted');
usDeleted:
ShowMessage('Deleted'); // For this to work you have to modify
// TClientDataset.StatusFilter
end;
<cleanup code>
end;
其他提示
上的TDataSetProvider BeforeUpdateRecord事件定义为:
procedure BeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet; DeltaDS:
TCustomClientDataSet; UpdateKind: TUpdateKind;
var Applied: Boolean);
参数UpdateKind
说的话将记录来完成:ukModify, ukInsert or ukDelete
。可对其进行测试是这样的:
procedure TSomeRDM.SomeProviderBeforeUpdateRecord(Sender: TObject;
SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind;
var Applied: Boolean);
begin
case UpdateKind of
ukInsert :
// Process Insert;
ukModify :
// Process update
ukDelete :
// Process Delete
end;
end;
注:本次活动签名是德尔福7,我不知道这是否在以后的版本德尔福的变化。
设置ClientDataSet.StatusFilter到TUpdateStatus值,然后读取ClientDataSet.RecordCount
例如
ClientDataSet1.StatusFilter := [usDeleted];
ShowMessage(IntToStr(ClientDataSet1.RecordCount));
将返回将要执行删除查询的数量。
请注意两件事情,但是。设置StatusFilter到usModified总是既包括改性和未改性的记录,所以你采取的值的一半(值4单元2个更新查询将被执行)。此外,设置到StatusFilter [](空集)是如何恢复到默认视图(变形,未改性的,并插入)
确认任何未发布的变更已在此之前已张贴,否则未发布更改可能不被考虑。