Модель даних з групуванням включає набір записів з співвідношенням батько-нащадок. Глибина вкладеності не обмежена.
На відміну від ієрархічних (деревовидних) моделей, в яких співвідношення батько-нащадок визначаються за допомогою ідентифікатора батьківського запису, в моделях з групуванням співвідношення визначаються на основі значень, що повторюються.
Зверніть увагу. Для формуваня наборів даних з групуванням
зазвичай використовується оператор GROUP BY ROLLUP
мови T-SQL.
Детальніше в документації Microsoft.
Модель з групуванням представлена типом об'єкта !Group
.
Для правильної роботи кожен запис повинен мати два додаткових обов'язкових поля:
!GroupMarker
- маркери групування. Їх буде стільки, скільки рівнів групування буде використано.
Фактично являють собою просто значення T-SQL функції grouping
для відповідного поля.
Таких полів буде стільки ж, скільки вказано в операторі groupby rollup
!Items
- масив дочірніх записів.
В наборі даних це значення завжди буде дорівнювати null. Поле необхідне для того, щоб система змогла
побудувати іерархію виходячи з отриманих даних.
Зверніть увагу, що тип даних елементів завжди повинен співпадати з типом даних кореневого об'єкта (з модифікатором !Group
).
Через особливості обробки моделей НЕОБХІДНО спочатку відсортувати набір даних по маркерах групування в зворотньому порядку, так, щоб спочатку видавалися групи.
Зверніть увагу. Якщо для моделі заданий тільки один рівень групування, то фактично це
означає, що ви просто підрахуєте підсумки для визначень полів (тих, які виводяться за допомогою функції sum
).
Роботу з моделями з групуванням простіше всього продемострувати на прикладі.
Нехай є таблиця Documents
наступного вигляду:
Id | Date | Agent | Amount |
---|---|---|---|
10 | 2021-05-01 | 10 | 150.00 |
11 | 2021-05-02 | 10 | 300.00 |
12 | 2021-05-01 | 20 | 320.00 |
13 | 2021-05-02 | 20 | 270.00 |
і таблиця Agents
наступного вигляду:
Id | Name |
---|---|
10 | Agent 1 |
20 | Agent 2 |
Побудуємо набір даних з групуванням по даті і контрагенту.
В результаті роботи цієї процедури сформується такий набір даних:
ReportData!TData!Group | Agent | Date | Amount | Agent!!GroupMarker | Date!!GroupMarker | Items!TData!Items |
---|---|---|---|---|---|---|
null | null | null | 1040.00 | 1 | 1 | null |
null | Agent 1 | null | 450.00 | 0 | 1 | null |
null | Agent 2 | null | 590.00 | 0 | 1 | null |
null | Agent 1 | 01.05.2020 | 150.00 | 0 | 0 | null |
null | Agent 1 | 02.05.2020 | 300.00 | 0 | 0 | null |
null | Agent 2 | 01.05.2020 | 320.00 | 0 | 0 | null |
null | Agent 2 | 02.05.2020 | 270.00 | 0 | 0 | null |
Перші три рядки набору являють собою підсумки по всьом звіту (перший рядок) і по кожному з контрагентів (другий і третій рядки). Маркери групування показують для якого поля цей підсумок.
Після обробки цього набору сформується така модель (службові властивості для простоти не показані).
Зверніть увагу на властивості $level
і $groupName
.
Властивість $level
- визначає рівень в дереві (з 0), а $groupName
-
ім'я групи, фактично просто вибирається одне зі значень набору в залежності від рівня.
Відобразити таку модель можна, наприклад, за допомогою об'єкта Sheet.
Результат (тільки відображення, згортка групп не працює)
Agent/Date | Amount | |
Total | 1 040,00 | |
Agent 1 | 450,00 | |
01.05.2020 | 150,00 | |
02.05.2020 | 300,00 | |
Agent 2 | 590,00 | |
01.05.2020 | 320,00 | |
02.05.2020 | 270,00 |