在 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 [](空集)是如何恢复到默认视图(变形,未改性的,并插入)

确认任何未发布的变更已在此之前已张贴,否则未发布更改可能不被考虑。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top