Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 TcxGrid: кастомные расчёты на группах таблицы  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 476
Всем привет!
Перерыл весь KB у девекспресса, и пол интернета - не могу найти решение задачи. Может кто сталкивался и решал подобное?
Суть: нужно на группах (разные типы данных у полей) выводить кастомные значения, основанные на некоторых вычислениях.
Например нужно на группе, в отдельном поле, выводить разницу между максимальной и минимальной датой (два отдельные поля с датами).
Есть обработчик CustomDrawGroupSummaryCell у TcxGridDBTableView (именно это TV и использую) - но мне надо расчитывать данные на группах , по некоторым полям, основываясь на данных (в группе), из других полей.

Суть - на скрине во вложении

К сообщению приложен файл. Размер - 141Kb
2 апр 21, 12:16    [22303309]     Ответить | Цитировать Сообщить модератору
 Re: TcxGrid: кастомные расчёты на группах таблицы  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 476
По мин-максдатам - вопроса нет, это решается штатным функционалом группировки в TcxGrid.
2 апр 21, 12:17    [22303310]     Ответить | Цитировать Сообщить модератору
 Re: TcxGrid: кастомные расчёты на группах таблицы  [new]
DimaBr
Member

Откуда:
Сообщений: 12043
тынц
2 апр 21, 12:39    [22303326]     Ответить | Цитировать Сообщить модератору
 Re: TcxGrid: кастомные расчёты на группах таблицы  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 476
DimaBr,

Спасибо! разбираю код в примере. Но это ж только для "штатных" функций агрегации? и отображение и ф футере и в заголовке группы. А мне надо для "рисования" данных на группах одних полей использовать данные из групп других полей. Причём их тоже нужно расчитывать по своей формуле.
Т.е. надо сделать свою кастомную функцию, по аналогии с теми, как это есть "из коробки". (см. скрин).

К сообщению приложен файл. Размер - 31Kb
2 апр 21, 13:07    [22303348]     Ответить | Цитировать Сообщить модератору
 Re: TcxGrid: кастомные расчёты на группах таблицы  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 476
Romka-Fes,

Я делал аналогичные расчёты для дерева, на "группах" (парентах) в дереве.
и надо анаогично сделать в таблице. Это вообще реально?

К сообщению приложен файл. Размер - 95Kb
2 апр 21, 13:20    [22303358]     Ответить | Цитировать Сообщить модератору
 Re: TcxGrid: кастомные расчёты на группах таблицы  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 476
Romka-Fes,

в дереве (на последнем скрине) - длительность - это разница между мин. датой начала и макс. датой окончания.
я данные гружу из БД в TdxMemData и в нём уже (в ОЗУ) идут расчёты и запись данных в поля TdxMemData.
но это сами данные, в таблице, которая отображается в виде дерева черех TcxDBTreeList.
А как бы это сделать в TcxGrid - вот вопрос.
Готов перейти в личку или в раздел "Работа". главное сумму согласовать. Ибо надо уже ASAP (((.
2 апр 21, 13:24    [22303359]     Ответить | Цитировать Сообщить модератору
 Re: TcxGrid: кастомные расчёты на группах таблицы  [new]
DimaBr
Member

Откуда:
Сообщений: 12043
А мне надо для "рисования" данных на группах одних полей использовать данные из групп других полей

Подсовываете нужные индексы.
Т.е. надо сделать свою кастомную функцию, по аналогии с теми, как это есть "из коробки".

Зачем какие то кастомные функции ?
длительность - это разница между мин. датой начала и макс. датой окончания

Почему бы не рассчитать Длительность в запросе ?
2 апр 21, 14:45    [22303407]     Ответить | Цитировать Сообщить модератору
 Re: TcxGrid: кастомные расчёты на группах таблицы  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 476
DimaBr,

Можно и в запросе сделать. Но пользователи могут группировки сами менять. Это musthave. в итоге надо для каждого варианта группировки делать отдельные поля, это всё на сервере рассчитывать и потом..., проверять каждый вариант группировки и брать данные из соответствующего поля?
2 апр 21, 14:54    [22303410]     Ответить | Цитировать Сообщить модератору
 Re: TcxGrid: кастомные расчёты на группах таблицы  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 476
Romka-Fes,

"Подсовываете нужные индексы." - индексы полей? Так надо сначала одну группу посчитать, а потом на основании этих данных (из рассчитанных групп) - считать другие группы.
2 апр 21, 14:57    [22303411]     Ответить | Цитировать Сообщить модератору
 Re: TcxGrid: кастомные расчёты на группах таблицы  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 476
DimaBr,

"Зачем какие то кастомные функции ?" - так как те штатные, которые есть - не дают нужного функционала, на группах.
1. мне надо вычислить мин. и макс. дату.
2. надо в группе вывести разницу дат (длительность).
3. надо проссумировать кол-во по всем строкамв группе.
4. для 3-х полей (с разными кол-вами) отобразть частное от деления п.3 на п.2.
2 апр 21, 15:01    [22303414]     Ответить | Цитировать Сообщить модератору
 Re: TcxGrid: кастомные расчёты на группах таблицы  [new]
DimaBr
Member

Откуда:
Сообщений: 12043
1. мне надо вычислить мин. и макс. дату. - это стандартная функция
2. надо в группе вывести разницу дат (длительность). - это можно вычислить в запросе
3. надо проссумировать кол-во по всем строкамв группе. - сумма - это стандартная функция
4. для 3-х полей (с разными кол-вами) отобразть частное от деления п.3 на п.2. - поделить ИТОГО одной колонки на ИТОГО другой колонки
2 апр 21, 15:26    [22303426]     Ответить | Цитировать Сообщить модератору
 Re: TcxGrid: кастомные расчёты на группах таблицы  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 476
DimaBr,
1. я об это таки писал. Тут задача взять эти данные для дальнейших вычислений.
2. нельзя в запросе. ибо группы могут быть разные. т.е. разные группировки, поля "юзер" может сам "тягать", как ему надо. Это надо на клиенте считать. "вячилст в запросе" - завести отдельное поле с результатом разницы дат? так, выходит, надоделать каждое отдельное поле для кажого возможного варианта группировки.
3. тут не просто проссумировать и показать сумму на группе (как есть в стандартной skSum), а надо это в коде почситать и вывести частное от деления этой суммы на результат разницы дат.
4. дело не в самих данных "колонок", а в том чтобы это на уровне групп отобразить.

сами строки посчитаны на сервере давно.

Или я не корректно описываю суть проблемы?

Было бы так, как Вы пишите, просто, - то я и сам знаю как сделать. Тут немного друго поля задача, увы (((
2 апр 21, 16:36    [22303454]     Ответить | Цитировать Сообщить модератору
 Re: TcxGrid: кастомные расчёты на группах таблицы  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 476
DimaBr,

Можно ли как-то в одном обработчике сослатся на данные его прошлых вычислений?
Тут несколько "проходов" надо делать. Посчитать на группе одно, а потом из этих результатов нарисовать, по кастомной логике вчислений, на том же уровне, другое.
А как это сделать - я пока не придумал и не нашёл неких вариантов.
2 апр 21, 16:39    [22303456]     Ответить | Цитировать Сообщить модератору
 Re: TcxGrid: кастомные расчёты на группах таблицы  [new]
DimaBr
Member

Откуда:
Сообщений: 12043
>завести отдельное поле с результатом разницы дат
У вас 5 полей с датами. Как вы опредяете с какого поля какое нужно вычесть, чтобы написать эту разницу в группировке ?
Может стоит завести Бэнд, и тогда две колонки с датами находящиеся под этим Бэндом и бутут минусоваться ?
>а надо это в коде почситать и вывести частное от деления этой суммы на результат разницы дат
Частное от деление чего на чего ? Какие колонки вы хотите обсчитывать, если пользователь их таскает как хочет ?
>дело не в самих данных "колонок", а в том чтобы это на уровне групп отобразить.
Как отобразить я вам дал пример.
>Или я не корректно описываю суть проблемы?
Конечно не корректно, вы сами не можете понять какие колонки на какие делить/вычитать.
>Тут немного друго поля задача
Думаете, что вы сами не понимаете уровня задачи.
2 апр 21, 21:30    [22303536]     Ответить | Цитировать Сообщить модератору
 Re: TcxGrid: кастомные расчёты на группах таблицы  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 476
DimaBr,

"У вас 5 полей с датами. Как вы опредяете с какого поля какое нужно вычесть, чтобы написать эту разницу в группировке ?"
по DataBinding свойства у поля.

"Может стоит завести Бэнд, и тогда две колонки с датами находящиеся под этим Бэндом и бутут минусоваться ?"
BandedTable - не вариант. в силу самой изначальной постановки задачи. да и бенды не решат текущую проблему (задачу).


"Частное от деление чего на чего ? Какие колонки вы хотите обсчитывать, если пользователь их таскает как хочет ?" - писал выше ж.
Нужно в трёх полях, отдельных учесть результат вычислений на одном поле (длительность) и поделить его на суммы соответствующих количеств. всё ясно ж описал.

"Как отобразить я вам дал пример." нет нужного примера. архив по ссылке я смотрел. там совсем другое, уж сорри.

"Конечно не корректно, вы сами не можете понять какие колонки на какие делить/вычитать." - я понимаю всё более чем. Кроме того ,как решить эту, не совсем тривиальную задачу.

"Думаете, что вы сами не понимаете уровня задачи. " - тут явно имелось в виду "Думаю...", повторюсь, я чётко понимаю суть задачи, кроме того, она показана на скриншотах, которые более, чем красноречивы.

Я, вообще-то хотел спросить, делал ли кто-то подобные вещи, но пока, явно - никто. Если поможете - я готов оплатить работу. И в "Работе" сделал топик со ссылкой на этот пост.
2 апр 21, 21:41    [22303542]     Ответить | Цитировать Сообщить модератору
 Re: TcxGrid: кастомные расчёты на группах таблицы  [new]
DimaBr
Member

Откуда:
Сообщений: 12043
>"У вас 5 полей с датами. Как вы опредяете с какого поля какое нужно вычесть, чтобы написать эту разницу в группировке ?" по DataBinding свойства у поля.
Так и не понятно, как из ПЯТИ полей формата Дата, выбрать именно два, которые нужно вычесть

>Нужно в трёх полях, отдельных учесть результат вычислений на одном поле (длительность) и поделить его на суммы соответствующих количеств. всё ясно ж описал.
Если всё заранее известно, то в чём проблема ?

>"Как отобразить я вам дал пример." нет нужного примера.
Сочувствую

>я чётко понимаю суть задачи, кроме того, она показана на скриншотах, которые более, чем красноречивы.
Красноречивость скриншотов для вас, не означает что их понимают другие.

>Я, вообще-то хотел спросить, делал ли кто-то подобные вещи, но пока, явно - никто.
Все всё делали, не нужно думать, что вы первооткрыватель.

>Если поможете - я готов оплатить работу.
Если вы не заметили, то я бесплатно пытаюсь понять вашу проблему.

Если вы действительно хотите решить свою задачу, а не ждёте, что добрый дяденька придёт и всё сделает, то пишется тестовый пример, с конкретной целью, нарисовать нужное конкретное ТЕСТОВОЕ значение в конкретном месте.
2 апр 21, 22:40    [22303567]     Ответить | Цитировать Сообщить модератору
 Re: TcxGrid: кастомные расчёты на группах таблицы  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 476
DimaBr,

Ещё раз приветствую!

Спасибо за фидбек. Я подготовил тестовый проект.

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

К сообщению приложен файл. Размер - 26Kb
3 апр 21, 12:19    [22303679]     Ответить | Цитировать Сообщить модератору
 Re: TcxGrid: кастомные расчёты на группах таблицы  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 476
DimaBr,

во вложении исходники тестового проекта.

К сообщению приложен файл (grid_custom_group_values.zip - 54Kb) cкачать
3 апр 21, 12:22    [22303681]     Ответить | Цитировать Сообщить модератору
 Re: TcxGrid: кастомные расчёты на группах таблицы  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 476
DimaBr,

По ожидаемым результатам:
1. на обеих группах длительность должны быть равна 33 (даты на группах одинаковые). Т.е. это разница между 03.03.2021 и 05.04.2021
2. Интенсивность должна быть равна 5.45. Как частное, от деления 180 на 33.
3 апр 21, 12:45    [22303694]     Ответить | Цитировать Сообщить модератору
 Re: TcxGrid: кастомные расчёты на группах таблицы  [new]
DimaBr
Member

Откуда:
Сообщений: 12043
Всё строго по примеру по ссылке тынц

К сообщению приложен файл. Размер - 64Kb
3 апр 21, 19:05    [22303879]     Ответить | Цитировать Сообщить модератору
 Re: TcxGrid: кастомные расчёты на группах таблицы  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 476
DimaBr,

Добрый день!
Спасибо за пример.
Но пока получаю Variant cast error.

"Could not convert variant of type (Null) into type (Double)" как на своём реальном проекте, так и на тестовом.

Ошибка в cxGridTableView.pas
в этой процедуре
procedure TcxGridTableView.DoCustomDrawGroupCell(ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableCellViewInfo; var ADone: Boolean);
begin
  if HasCustomDrawGroupCell then
    FOnCustomDrawGroupCell(Self, ACanvas, AViewInfo, ADone);
end;


Но это из-за того что Result := NULL, по умолчанию в функции
  function GetSummary (Item:TcxGridColumn): Variant;
  var i:Integer;
      ASummaryItems: TcxDataSummaryItems;
      PSummaryValues: PVariant;
  begin
    Result:= NULL;
    with tvGrid1DBTableView_TestData.DataController.Summary do
    begin
      for i:=0  to DefaultGroupSummaryItems.Count-1 do
        if TcxGridItemDBDataBinding(Item.DataBinding).FieldName = TcxGridDBTableSummaryItem(DefaultGroupSummaryItems[i]).FieldName then
          if GetGroupSummaryInfo(AViewInfo.GridRecord.Index,ASummaryItems,PSummaryValues) then
            Result := PSummaryValues^[i];
    end;
  end;


Пытаюсь разобраться с этим - но пока, увы безуспешно.
Есть идеи, как с этим NULL решить проблему с ошибкой?

К сообщению приложен файл (grid_custom_group_values.zip - 55Kb) cкачать
5 апр 21, 11:23    [22304287]     Ответить | Цитировать Сообщить модератору
 Re: TcxGrid: кастомные расчёты на группах таблицы  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 476
И можно ли для такого варианта реализации использовать не DefaultGroups - а просто группы?
Т.е. не DefaultGroupSummaryItems использовать, а GroupSummaryItems
Но надо как-то по всем Levels ещё пробежатся, чтобы индекс уровней группировки получить. А я не знаю как (((. Не могу найти коллекцию уровней на группах. Или таковой не существует?
5 апр 21, 12:01    [22304323]     Ответить | Цитировать Сообщить модератору
 Re: TcxGrid: кастомные расчёты на группах таблицы  [new]
DimaBr
Member

Откуда:
Сообщений: 12043


К сообщению приложен файл. Размер - 30Kb
5 апр 21, 13:35    [22304399]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить