"EhLib.Com" https://forum.ehlib.com/ru/ |
|
Подсчет агрегированных значений https://forum.ehlib.com/ru/viewtopic.php?f=4&t=3309 |
Страница 1 из 1 |
Автор: | Waik [ 09 мар 2023, 15:47 ] | |||
Заголовок сообщения: | Подсчет агрегированных значений | |||
Добрый день! Пытаюсь освоить применение нестандартных алгоритмов для подсчета агрегатных значений. Тестовый проект c MemTable c генерируемыми цифрами. Группировка по одному полю. Из документации(почти) беру код Код: procedure TfrMailBox.DBGridEh1Columns5DataGroupFooterAggregateValue( Grid: TCustomDBGridEh; Column: TColumnEh; GroupFooter: TGridDataGroupFooterEh; FooterColumnItem: TGridDataGroupFooterColumnItemEh; var AValue: Variant; Node: TGroupDataTreeNodeEh; var Processed: Boolean); 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; При запуске сразу ошибка - см картинку. Что-то упустил и не могу понять что. Что хотел получить: В футер группы в поле F3 правой таблицы записать Сумма F2/Сумму F1 Но ошибка гораздо раньше происходит. Что забыл сделать? D11 Александрия. EhLib - 11/ Тестовый проект прилагаю.
|
Автор: | EhLibSupport [ 10 мар 2023, 09:34 ] | ||
Заголовок сообщения: | Re: Подсчет агрегированных значений | ||
Добрый день. Футтеры в гриде предназначены для отображения и не предназначены для промежуточного подсчета значений для других футтеров. Это значит, что если вам надо подсчитать какое-то сложное значение для столбца 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;
|
Автор: | Waik [ 10 мар 2023, 11:15 ] |
Заголовок сообщения: | Re: Подсчет агрегированных значений |
Спасибо помогли. Тестовый естественно заработал.Попробую прикрутить к реальному проекту. |
Страница 1 из 1 | Часовой пояс: UTC |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |