如何仅在fkData上应用TClientDataSet StatusFilter

时间:2018-09-04 17:14:25

标签: delphi tclientdataset

跟踪ClientDataSet中的 just fkData字段的更改时,我遇到了一个问题。

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

我可以调用CDS.ChangeCount并获得0的结果(因为fkData字段实际上均未更改)。

但是当我呼叫CDS.StatusFilter:= [usModified]时,我会看到很多记录-因为虽然ChangeCount忽略fkInternalCalc,但StatusFilter却没有-它显示了对所有内容的更改。

我是否缺少某种机制来过滤(usmodified和fkData)?

(出于各种性能原因,我无法使用简单的fkCalculated)

使用Delphi Tokyo Enterprise。

TIA 干杯, 教育局

1 个答案:

答案 0 :(得分:1)

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

如您所见,每次将更改发布到第一个CDS时,ClientDataSet1Value字段都会更新,但是第二个CDS仅显示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;

Button2Click之后,第二个CDS的网格将仅显示其fKData字段已被修改的行,如果未修改fkData字段数据,则显示单个空白行。