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


Перехресні моделі даних

Перехресна модель даних містить одне або декілька полів, які будуть розгорнуті або в горизонтальний масив елементів (тип CrossArray), або в об`єкт з ключами (тип CrossObject). Частіше за все такі моделі використовуються для побудови перехресних звітів, в яких кількість стовпчиків змінна і визначається отриманими даними. Це схоже на sql-оператор pivot, але, на відміну від нього, не потрібно заздалегідь знати, які стовпчики будуть включені в результуючий набір.

Зверніть увагу, що використовувати перехресні моделі для об'єктів (не масивів) не має сенсу (хоч і не забороняється). Замість цього просто використовуйте MapObject.

Для перехресних масивів відміності від простих вкладених масивів полягають в наступому:

  • Всі перехресні масиви в усіх записах будуть мати однаквий розмір.
  • Порядок елементів буде визначатися ключем (Key) перехресного елементу.
  • Основний масив (той, в якому містяться елементи з перехресними масивами) буде мати додаткову властивість $cross, в якій будуть представлені масиви ключів для кожного з перехресних масивів.

Для перехресних об'єктів логіка наступна:

  • Всі перехресні об'єкти в усіх записах будуть мати однакову структуру.
  • Основний масив (той, в якому містяться елементи з перехресними масивами) буде мати додаткову властивість $cross, в якій будуть представлені масиви ключів для кожного з перехресних масивів.

Простіше за все розібратися з принципами роботи перехресних моделей на прикладі.

Приклад обробки перехресного масива

Нехай маємо фрагмент коду 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