Delphi 如何仅对fkData应用TClientDataSet StatusFilter

Delphi 如何仅对fkData应用TClientDataSet StatusFilter,delphi,tclientdataset,Delphi,Tclientdataset,我在跟踪ClientDataSet中数据字段的更改时遇到了一些问题 在使用该程序时,我会填充并更改一些fkInternalCalc字段(我将使用fkInternalCalc字段将计算驱动到其他fkInternalCalc字段) 我可以调用CDS.changecont并得到0的结果(因为fkData字段都没有实际更改) 但是当我调用CDS.StatusFilter:=[usModified]时,我看到了很多记录,因为ChangeCount忽略fkInternalCalc,而StatusFilter

我在跟踪ClientDataSet中数据字段的更改时遇到了一些问题

在使用该程序时,我会填充并更改一些fkInternalCalc字段(我将使用fkInternalCalc字段将计算驱动到其他fkInternalCalc字段)

我可以调用CDS.changecont并得到0的结果(因为fkData字段都没有实际更改)

但是当我调用CDS.StatusFilter:=[usModified]时,我看到了很多记录,因为ChangeCount忽略fkInternalCalc,而StatusFilter不忽略fkInternalCalc,它显示对所有内容的更改

我是否遗漏了一些可以通过(usmodified和fkData)进行过滤的机制

(由于各种性能原因,我无法使用simple FKComculated)

使用Delphi Tokyo Enterprise

短暂性脑缺血发作 干杯
EdB

如果我理解正确,我认为下面的代码可以满足您的要求。它只是一个测试平台,需要2个CDS,每个CDS都有一个数据源和网格

如您所见,每次将更改发布到第一张CD时,ClientDataSet1Value字段都会更新,但第二张CD仅显示更改了fkData字段的行

procedure TForm1.FormCreate(Sender: TObject);
var
  i : Integer;
begin
  {
  ClientDataSet1ID: TIntegerField;  // fkData
  ClientDataSet1Name: TStringField;  // fkData
  ClientDataSet1SaveCount: TIntegerField;  // fkInternalCalc
  }
  ClientDataSet1.CreateDataSet;
  for i := 1 to 3 do
    ClientDataSet1.InsertRecord([i, 'name of ' + IntToStr(i)]);
end;

procedure TForm1.ClientDataSet1BeforePost(DataSet: TDataSet);
begin
  if ClientDataSet1SaveCount.IsNull then
    ClientDataSet1SaveCount.AsInteger := 1
  else
    ClientDataSet1SaveCount.AsInteger := 1 + ClientDataSet1SaveCount.AsInteger;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ClientDataSet2.Data := ClientDataSet1.Data;
  ClientDataSet2.StatusFilter := [usModified];
end;

单击
按钮2
,第二张CD的网格将仅显示其fKData字段已修改的行,或者如果没有任何行已修改fKData字段数据,则显示一个空白行。

这有助于解决您的问题吗?