跟踪ClientDataSet中的 just fkData字段的更改时,我遇到了一个问题。
在使用该程序时,我会填充并更改很多fkInternalCalc字段(我将使用fkInternalCalc字段将计算驱动到其他fkInternalCalc字段)。
我可以调用CDS.ChangeCount并获得0的结果(因为fkData字段实际上均未更改)。
但是当我呼叫CDS.StatusFilter:= [usModified]时,我会看到很多记录-因为虽然ChangeCount忽略fkInternalCalc,但StatusFilter却没有-它显示了对所有内容的更改。
我是否缺少某种机制来过滤(usmodified和fkData)?
(出于各种性能原因,我无法使用简单的fkCalculated)
使用Delphi Tokyo Enterprise。
TIA 干杯, 教育局
答案 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字段数据,则显示单个空白行。