Как применить TClientDataSet StatusFilter только для fkData - PullRequest
0 голосов
/ 04 сентября 2018

У меня возникла небольшая проблема с отслеживанием изменений в просто полях fkData в ClientDataSet.

Существуют поля fkInternalCalc, которые я заполняю и изменяю при использовании программы (я буду использовать поле fkInternalCalc для переноса вычислений в другие поля fkInternalCalc).

Я могу вызвать CDS.ChangeCount и получить результат 0 (поскольку ни одно из полей fkData фактически не изменилось).

Но когда я вызываю CDS.StatusFilter: = [usModified], я вижу много записей - потому что, хотя ChangeCount игнорирует fkInternalCalc, StatusFilter этого не делает - он показывает изменения во всем.

Мне не хватает какого-то механизма, с помощью которого я могу фильтровать (usmodified и fkData)?

(я не могу использовать простой fkCalculated по ряду причин производительности)

Использование Delphi Tokyo Enterprise.

ТИА Ура, EDB

1 Ответ

0 голосов
/ 04 сентября 2018

Я думаю, что код ниже будет делать то, что вы хотите, если я вас правильно понимаю. Это всего лишь испытательный стенд, требующий 2 CDS каждый с источником данных и сеткой.

Как вы можете видеть, поле ClientDataSet1Value обновляется каждый раз, когда публикуется изменение в первом CDS, но второй 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.

...