Как можно вручную выполнить событие "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)