Создание дочерней коллекции документа

Материал из Lexema.ru
Перейти к: навигация, поиск

Структура многих видов документов предполагает наличие двух частей - головной части ("шапки") документа и дочерней коллекции ("тела", табличной части, дитейла (detail)). С точки зрения хранения информации дочерняя коллекция представляет собой набор строк-записей дочерней (зависимой) модели. Например, пункты выполненных работ в акте сдачи-приёмки, перечень позиций материалов в приходной накладной и т.д. В экранной форме дочерняя модель отображается в виде таблицы.

Для создания дочерней коллекции и его привязки к родительскому документу необходимо выполнить следующие действия:

  • создание дочерней модели
  • привязка дочерней модели к родительской
  • обновление БД
  • добавление в ЭФ нового элемента управления - таблицы

Создание дочерней модели

Процесс создания модели подробно описан в разделе статьи руководства "Создание документа на основе модели". Следует особо подчеркнуть, что дочерняя модель должна иметь поле типа BigInt для хранения кодов записей родительской таблицы. Рекомендуется называть это поле PCode (от англ. Parent Code - родительский код). Дочерняя модель также может иметь поля-справочники. Пример параметров дочерней таблицы показан на рисунке:

ChildModel.png

Привязка дочерней модели к родительской

Для создания связи между родительской и дочерней моделями необходимо открыть для редактирования родительскую модель (пункт меню "Модели"). На вкладке "Дочерние таблицы" необходимо выбрать из списка тип, автоматически созданный на основе дочерней модели, указать ключевое поле для хранения кодов записей родительской таблицы (например, PCode) и ввести имя дочерней коллекции (оно может быть произвольным). Пример параметров привязки дочерней модели к родительской показан на рисунке:

ChildModelParams.png

После создания дочерней модели и настройки связей между таблицами необходимо выполнить обновление БД (этот процесс подробно описан в соответствующем разделе руководства). Перечень обновляемых объектов при создании и привязки дочерней таблицы показан на рисунке:

UpdateDbChild.png

В результате создания и привязки дочерней модели будут сгенерированы и выполнены следующие SQL-запросы:

  • создание дочерней таблицы
  • создание триггеров обновления системных полей и создания записей исторической таблицы

Добавление в экранную форму дочерней таблицы

Для использования дочерней коллекции необходимо добавить таблицу в экранную форму для редактирования родительского документа. Для этого откройте форму, раскройте дерево элементов (RootItem - LayoutForm - LayoutGroup), выберите контейнер, в который необходимо добавить дочернюю таблицу или создайте новый контейнер (например, LayoutGroup). Нажмите правую кнопку мыши на группе, в контекстном меню выберите пункт "Добавить свойство модели", в списке найдите имя дочерней коллекции и выберите его:

AddChildTable.png

В результате будет создана таблица (Grid), содержащая колонки-поля дочерней модели. Таблица доступна для редактирования - пользователь может добавлять и удалять строки, менять содержимое ячеек. Рекомендуется удалить системные поля (VCode, PCode и др.), т.к. они устанавливаются системой не должны корректироваться пользователем.

Проверка работоспособности документа с дочерней коллекцией

Для проверки работоспособности документа с дочерней коллекцией необходимо открыть экранную форму для его редактирования. Если все вышеописанные действия были выполнены верно, на экране будет отображена таблица с элементами управления:

ChildCollectionTest.png

По умолчанию, таблица для работы с записями дочерней коллекции доступна для редактирования. Необходимо добавить строки, нажав на соответствующую кнопку, и ввести значения в ячейки таблицы:

ChildCollectionTestValues.png

Внимание! Для сохранения изменений дочерней коллекции необходимо сохранить весь документ целиком, нажав на соответствующую кнопку ("Сохранить", либо "Сохранить и закрыть"). В противном случае изменения дочерней коллекции будут потеряны.

Создание дочерней коллекции 2-го уровня

В некоторых задачах возникает необходимость организовать 3-уровневую структуру хранения данных. Например, в модуле автоматизации ресторана требуется хранение информации о сменах, в каждой смене - информации о заказах, а в каждом заказе - о его позициях (блюдах). Такая схема требует создания дочерней коллекции 2-го уровня. Для этого необходимо:

  • создать 3 модели для родительской таблицы, дочерних коллекций 1 и 2 уровня. В дочерних моделях должно быть поле PCode типа BigInt для хранения кода родительской записи
  • указать дочерние таблицы для родительской и для дочерней коллекции 1-го уровня

В качестве примера рассмотрим хранение данных в процессе управления проектами по методологии Scrum:

  • проект (Project, родительская таблица)
  • этап проекта (Stage, дочерняя коллекция 1-го уровня)
  • спринт этапа (Sprint, дочерняя коллекция 2-го уровня)

Дочерние коллекции модели Проект:

ProjectChildTables.png

Дочерние коллекции модели Этап:

StageChildTables.png

Поля PCode в дочерних моделях имеют тип BigInt.

Примечание: в данном примере все три модели базируются на одной таблице Stages. Подробнее о нескольких моделях на одной таблице см. раздел руководства.

Создание формы с двумя дочерними таблицами

В данный момент в системе Lexema.ru отсутствуют стандартные механизмы для работы с дочерними коллекциями двух уровней. Для создания документа, позволяющего работать с такой структурой данных, можно реализовать следующую схему:

  • для создать реестр и форму

Для работы с документом, имеющим два уровня дочерних коллекций, необходимо создание формы с двумя связанными между собой таблицами. Например, в форме редактирования проекта при выборе строки в таблице этапов (дитейл 1-го уровня) должна обновляться таблица спринтов (дитейл 2-го уровня). Для этого после создания иерархии из трёх моделей создайте форму и реестр для родительской модели (процесс создания документа подробно описан в отдельной статье).

Настройка параметров отображения формы с дочерней коллекцией

По умолчанию параметры отображения дочерней коллекции, задаваемые при автоматической генерации, не являются оптимальными. В формах, предназначенных для работы конечного пользователя, крайне рекомендуется провести ряд изменений:

  • удалить системные поля
  • переименовать заголовки колонок
  • настроить ширину колонок

Удаление системных полей

При добавлении таблицы дочерней коллекции в форму документа автоматически создаются колонки, отображающие информацию из системных полей:

  • VCode
  • CDate
  • CUser
  • CHost
  • WDate
  • WUser
  • WHost
  • COrg
  • WOrg
  • PCode

В большинстве случаев у пользователя не возникает необходимость редактировать эти данные вручную, т.к. они заполняются автоматически. В этих случаях рекомендуется удалять ненужные колонки.

Для удаления колонки разверните в дереве элементов таблицу дочерней коллекции. Выберите поле, которое необходимо удалить, нажмите правую кнопку мыши. В контекстном меню выберите пункт "Удалить":

DeleteFieldFromGrid.png

Подтвердите удаление в диалоговом окне. Повторите эти действия для всех полей, которые необходимо удалить.

Переименование колонок

По умолчанию подписи колонок совпадают с именами полей модели. В большинстве случаев это неприемлемо, т.к. имена полей модели обычно англоязычные. Для переименования колонки разверните в дереве элементов таблицу дочерней коллекции. Выберите поле, которое необходимо переименовать. В списке свойств выберите text, смените его значение на корректное название колонки:

RenameFieldInDetail.png

Повторите эти действия для всех полей.

Изменение размеров колонок

При автоматической генерации колонкам дочерней таблицы назначается определённая ширина (100px, 150px или др.). Во многих случаях необходимо увеличить или уменьшить ширину колонки (например, для полей "Наименование", "Примечание" и т.п.). Для изменения ширины колонки необходимо изменить свойство width, установив значение в пикселах (точках) - число+px, например, 200px.