如何仅在fkData上应用TClientDataSet StatusFilter

问题描述 投票:1回答:1

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

我使用该程序填充fkInternalCalc字段并进行相当多的更改(我将使用fkInternalCalc字段将计算驱动到其他fkInternalCalc字段)。

我可以调用CDS.ChangeCount并得到0的结果(因为没有fkData字段实际发生了变化)。

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

我错过了一些可以过滤的机制(usmodified和fkData)吗?

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

使用Delphi Tokyo Enterprise。

TIA干杯,EdB

delphi tclientdataset
1个回答
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字段数据,则显示单个空白行。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.