"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/

Тестовый проект прилагаю.

Вложения:
Комментарий к файлу: Тестовый проект
AggregateEh.7z [86.03 KiB]
Скачиваний: 55
Комментарий к файлу: Ошибка
Image 029.jpg
Image 029.jpg [ 64.55 KiB | Просмотров: 897 ]

Автор:  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;


Вложения:
sshot-304.png
sshot-304.png [ 13.07 KiB | Просмотров: 872 ]

Автор:  Waik [ 10 мар 2023, 11:15 ]
Заголовок сообщения:  Re: Подсчет агрегированных значений

Спасибо помогли. Тестовый естественно заработал.Попробую прикрутить к реальному проекту.

Страница 1 из 1 Часовой пояс: UTC
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/