Перехресна модель даних містить одне або декілька полів,
які будуть розгорнуті або в горизонтальний масив елементів (тип CrossArray
), або в об`єкт з ключами (тип CrossObject
).
Частіше за все такі моделі використовуються для
побудови перехресних звітів, в яких кількість стовпчиків змінна і визначається отриманими даними.
Це схоже на sql-оператор pivot, але, на відміну від нього, не потрібно заздалегідь знати, які стовпчики будуть включені в результуючий набір.
Зверніть увагу, що використовувати перехресні моделі для об'єктів (не масивів) не має сенсу (хоч і не забороняється). Замість цього
просто використовуйте MapObject
.
Для перехресних масивів відміності від простих вкладених масивів полягають в наступому:
Key
) перехресного елементу.Для перехресних об'єктів логіка наступна:
Простіше за все розібратися з принципами роботи перехресних моделей на прикладі.
Нехай маємо фрагмент коду SQL:
І він повертає наступні дані:
RepData!TData!Array | Id!!Id | S1 | N1 | Cross1!TCross!CrossArray |
---|---|---|---|---|
null | 10 | Str1 | 100 | null |
null | 20 | Str2 | 200 | null |
!TCross!CrossArray | Key!!Key | Val | !TData.Cross1!ParentId |
---|---|---|---|
null | K1 | 111 | 10 |
null | K2 | 222 | 20 |
При обробці першого набору створюється простий масив RepData
елементів типу TData
. В кожному елементі цього масива буде поле
Cross1
, яке в подальшому стане перехресним масивом елементів типу TCross
. Зверніть увагу, що в елементах основного обов'язково
повинен бути присутнім ідентифікатор (поле з типом !Id
), для того, щоб наступні набори даних могли посилатися на елемент масива.
Другий набір обробляється наступним чином.
Спочатку шукається поле посилання на перехресне поле основного елементу масиву (поле з типом !ParentId
).
Тип посилання вказує на ім'я типу та ім'я поля через крапку. !TData.Cross1!ParentId
- поле Cross1
в елементі типу TData
.
Вміст перекрестнго запису зберігається у внутрішньому буфері знайденого основного запису.
Зверніть увагу, що перехресний масив обов'язково повинен містити текстове поле з типом !Key
. Воно використовується для внутрішньої обробки.
Саме це поле буде міститися в масиві, який повертається властивістю $cross
. Цю властивість буде додано в сам масив (не елемент!) об'єктів типу
TData
. Звернення до списку ключів буде виглядати як RepArray.$cross.Cross1.
Після обробки всех записів перехресних наборів, система знаходить об'єднання всіх можливих ключів в усіх записах TData
і перетворює внутрішні
буфери в масиви. В результаті всі перехресні масиви будуть мати однакову довжину.
Результуюча модель вийде такою:
Частіше за все перехресні моделі використовуються для побудови звітів спільно з таблицями Sheet. Для того, щоб приклад був більш реалістичним, додамо виведення підсумкових значень. Для виведення перехресних масивів використовується елемент SheetCellGroup.
Шаблон
XAML:
Результат:
Id | S1 | N1 | Cross1 | ||
---|---|---|---|---|---|
K1 | K2 | Total | |||
Total | 111 | 222 | 333 | ||
10 | Str1 | 100 | 111 | 111 | |
20 | Str2 | 200 | 222 | 222 |