Добрый день.
Футтеры в гриде предназначены для отображения и не предназначены для промежуточного подсчета значений для других футтеров.
Это значит, что если вам надо подсчитать какое-то сложное значение для столбца F3, то и все расчеты футера вам надо вести в событии OnDataGroupFooterAggregateValue для этого столбца.
Для Grid.DataGrouping.Footers[0][F3] указываем тип расчета значений, пользовательский - ValueType = gfvCustomEh
Расчет производится по следующему алгоритму:
Вначале по каждой записи накапливаем значения по полям F1 и F2.
Код:
procedure TForm1.DBGridEh2DataGroupFooterAggregateValue(Grid: TCustomDBGridEh;
Column: TColumnEh; GroupFooter: TGridDataGroupFooterEh;
FooterColumnItem: TGridDataGroupFooterColumnItemEh; var AValue: Variant;
Node: TGroupDataTreeNodeEh; var Processed: Boolean);
begin
if (Column.Field = mtF3) then
begin
if VarIsEmpty(AValue) then
begin
AValue := VarArrayCreate([0,1], varDouble);
AValue[0] := 0;
AValue[1] := 0;
end;
AValue[0] := AValue[0] + mtF1.AsInteger;
AValue[1] := AValue[1] + mtF2.AsFloat;
Processed := true;
end;
end;
В конце группы и для всего грида вызывается событие OnDataGroupFooterFinalizeValue. Грид сам знает когда заканчивается группа, и когда надо вызвать это событие.
В обработчике события выполняем финальную операцию.
Код:
procedure TForm1.DBGridEh2DataGroupFooterFinalizeValue(Grid: TCustomDBGridEh;
Column: TColumnEh; GroupFooter: TGridDataGroupFooterEh;
FooterColumnItem: TGridDataGroupFooterColumnItemEh; var AValue: Variant;
var Processed: Boolean);
begin
if (Column.Field = mtF3) then
begin
if (VarIsArray(AValue)) and (AValue[0] <> 0) then
begin
AValue := AValue[1] / AValue[0];
Processed := True;
end;
end;
end;
В обработчике события OnDataGroupFooterToDisplayText переводим подсчитанное событие в текст для отображения.
Код:
procedure TForm1.DBGridEh2DataGroupFooterToDisplayText(Grid: TCustomDBGridEh;
Column: TColumnEh; GroupFooter: TGridDataGroupFooterEh;
FooterColumnItem: TGridDataGroupFooterColumnItemEh; var AValue: Variant;
var DisplayValue: string; var Processed: Boolean);
begin
if (Column.Field = mtF3) then
begin
if (not VarIsEmpty(AValue))then
begin
DisplayValue := FormatFloat(',#.00', AValue);
Processed := True;
end;
end;
end;