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


Робота з масивами

Масив може бути як самостійним елементом моделі (тоді у нього є ім'я і він буде відображений в корені моделі), так і дочірнім елементом того чи іншого об'єкта.

Масив визначається типом Array (або LazyArray для "лінивого" масива) в дескрипторі (перше поле) набіру даних.

Зверніть увагу! Не слід використовувати масиви з занадто великою кількістю елементів. Крім того, що це призводить до зниження швидкодії, з цим ще й дуже незручно працювати кінцевому користувачу. Для роботи з великими масивами (таблицями) використовуйте серверне сортування, фільтрацію і розбиття на сторінки. Детальніше....

Рекомендований розмір масиву на клієнті - не більше 100 елементів. Максимальний, який не призводить до помітного падіння швидкодії - близько 200 елементів.

Звичайні масиви

Це просто набір даних. Кожен рядок набіру буде відповідним об'єктом масива. Тип об'єкта визначається дескриптором набору.

Приклад

Нехай маємо фрагмент коду SQL:


Він сформує в корені моделі масив Agents. Кожен елемент масива буде мати тип TAgent з наступними властивостями: Id, Name, Code.

Дочірні масиви

Дочірній масив завжди є вкладеним і являє собою властивість іншого об'єкта. Як правило не має імені. В батьківському об'єкті повинна бути властивість-заповнювач зі заченнями null і типом елементів дочірнього масива. Зверніть увагу, що дочірній набір повинен оброблятися після основного.

Для того, щоб зв'язати масив з батьківським об'єктом, в наборі даних обов'язково повинно бути присутнім поле з посиланням на батьківський об`єкт у вигляді [Name!ParentType.PropertyName!ParentId], де

  • [Name] - необов'язкове ім'я поля. Може бути пустим.
  • ParentType.PropertyName - Ім'я типу і ім'я властивості батьківського об'єкта, куди буде записаний елемент масиву.
  • ParentId - модифікатор поля.

Зв'язування працює наступним чином:

  1. Береться значення поля !ParentId.
  2. В моделі шукається об`єкт з типом ParentType з відповідним ідентифікатором (зрозуміло, що цей ідентифікатор повинен бути помічений модифікатором !Id).
  3. В знайденому об'єкті шукається поле з іменем PropertyName. В масив, що відповідає цьому полю, додається елемент.

Приклад

Нехай маємо фрагмент коду SQL:


Він сформує в корені об`єкт Document типу TDocument з наступними властивостями: Id, Date, Rows. Властивість Rows буде являти собою масив елементів типу TRow з наступними властивостями: Id, Qty, Price, Sum.

"Ліниві" масиви

Ліниві (on demand) масиви не додаються в модель в процесі, а завантажуються при першому зверненні до властивості. Частіше за все цей механізм використовується у випадку, якщо основна модель являє собою масив, а дочірні масиви будуть потрібні не завжди, а тільки при спробі їх відобразити. Типовий приклад - перелік контрагентів, кожен з яких містить пов'язані з ним документи.

Ліниві масиви можуть бути тільки дочірніми і визначаються модифікатором LazyArray.

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

Для завантаження лінивого масиву буде викликана збережена процедура завантаження моделі з суфіксом, відповідним імені властивості основної моделі. В якості параметра @Id їй буде переданий ідентифікатор основного елементу. Вона повинна повернути набір, що відповідає опису масиву в основній моделі. Властивість з модифікатором !ParentId не обов'язкова.

Приклад

Нехай маємо перелік контрагентів з переліком документів.


Він сформує в корені об`єкт Document типу TDocument з наступними властивостями: Id, Date, Rows. Властивість Rows буде являти собою масив елементів типу TRow з наступними властивостями: Id, Qty, Price, Sum.

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

Зверніть увагу! Є можливість оновити (перезавантажити з бази даних) тільки вміст лінивого масива без основної моделі. Для цього просто передайте масив в якості аргумента в команду Refresh (Reload) або в метод $reload контролера.