Components for Delphi and C++ Builder.

Перейти в английский форум
Перейти на EhLib.com
Текущее время: 28 мар 2024, 17:38

Часовой пояс: UTC




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Подсчет агрегированных значений
СообщениеДобавлено: 09 мар 2023, 15:47 
Не в сети

Зарегистрирован: 02 дек 2020, 11:03
Сообщений: 6
Добрый день! Пытаюсь освоить применение нестандартных алгоритмов для подсчета агрегатных значений.
Тестовый проект 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]
Скачиваний: 49
Комментарий к файлу: Ошибка
Image 029.jpg
Image 029.jpg [ 64.55 KiB | Просмотров: 875 ]
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 10 мар 2023, 09:34 
Не в сети

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 1546
Добрый день.

Футтеры в гриде предназначены для отображения и не предназначены для промежуточного подсчета значений для других футтеров.
Это значит, что если вам надо подсчитать какое-то сложное значение для столбца 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 | Просмотров: 850 ]

_________________
Best regards
EhLib support Team
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 10 мар 2023, 11:15 
Не в сети

Зарегистрирован: 02 дек 2020, 11:03
Сообщений: 6
Спасибо помогли. Тестовый естественно заработал.Попробую прикрутить к реальному проекту.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB