Как можно вручную выполнить событие "OnCalcFields"?

Скажи, что я временно хочу отключить OnCalcFields событие (например, путем настройки cdsCalcFields := nil) во время трудоемкой операции над TClientDataSet. Как я могу сказать TClientDataSet выполнить пересчет вычисленных полей при повторном присоединении OnCalcFields метод?

Другая ситуация, которая может потребовать ручного пересчета, - это ситуация, когда некоторые из вычисляемых полей зависят от других наборов данных (например, вычисленное поле используется для временного хранения некоторого агрегированного значения из другого набора данных). Это будет работать нормально в большинстве случаев, потому что OnCalcFields события выполняются достаточно часто, чтобы получить правильное значение из другого набора данных. Но в некоторых случаях пересчет необходим для получения правильного значения из другого набора данных.

Настройка AutoCalcFields собственность на False может также привести вас к ситуации, когда желателен ручной пересчет.

Я видел несколько объяснений о том, как уменьшить исполнение OnCalcFields событие, но я не могу найти простой способ просто выполнить пересчет...

Какие-либо предложения?

3 ответа

Решение

Вычисляемые поля рассчитываются, когда записи извлекаются из базы данных, поэтому вызовите Refresh (или Закрыть -> Открыть) в наборе данных для принудительного пересчета.

(Что касается комментариев к вопросу), для принудительного пересчета только одной записи, которую вы можете вызвать RefreshRecord на наборе данных. Если конкретный потомок набора данных не реализует метод, Edit с последующим Cancel Позвонил бы достичь того же.

Вызов Refresh или Close-> может привести к перезагрузке всей таблицы из базы данных. Если это не то, что вам нужно, вы можете просто вызвать метод OnCalc и передать ему CDS. Хотя вам, возможно, придется двигать курсор вручную.

with DisplayAcctListCDS do begin
  First;
  while not Eof do begin
    Edit;
    DisplayAcctListCDSCalcFields(DisplayAcctListCDS);
    Next;
  end;
end;

Предполагая, что DisplayAcctListCDS - это ваш TClientDataSet с вычисленными полями, а DisplayAcctListCDSCalcFields - это сгенерированный метод события для OnCalcFields.

Это немного взломать, но 100% ответов на этот вопрос для меня!

DBGrid.Height := 30; 
DBGrid.Height := 200; // Refresh all Rows after first
CalculatedProc(DataSet); // Refresh first calculated fields. (Write name of your calculate procedure)
Другие вопросы по тегам