Платформа A2v10 довідкова система
EN


Моделі з групуванням

Модель даних з групуванням включає набір записів з співвідношенням батько-нащадок. Глибина вкладеності не обмежена.

На відміну від ієрархічних (деревовидних) моделей, в яких співвідношення батько-нащадок визначаються за допомогою ідентифікатора батьківського запису, в моделях з групуванням співвідношення визначаються на основі значень, що повторюються.

Зверніть увагу. Для формуваня наборів даних з групуванням зазвичай використовується оператор 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/DateAmount
Total1 040,00
Agent 1450,00
01.05.2020150,00
02.05.2020300,00
Agent 2590,00
01.05.2020320,00
02.05.2020270,00