Введение
Comindware Platform позволяет с помощью выражений на N3 получать значение атрибута по его системному имени, когда само системное имя хранится в атрибуте другой записи в отдельном шаблоне.
Такой приём полезен, когда набор атрибутов, из которых требуется брать значения, не определён заранее, а формируется динамически.
Здесь представлен пример настройки вычисления на N3, демонстрирующий, как на основании значения, хранящегося в одном шаблоне, динамически выбрать атрибут второго шаблона по его системному имени и использовать его значение для заполнения записи в третьем шаблоне.
Прикладная задача
Имеется приложение «Учёт нагрузки сотрудников».
- На форме «Карточка сотрудника» пользователь заполняет данные сотрудника и выбирает его профиль нагрузки в раскрывающемся списке на форме: Низкая нагрузка, Стандартная нагрузка, Высокая нагрузка.
- Для каждого профиля нагрузки задан числовой лимит количества одновременно открытых задач (например, 1 — для низкой нагрузки, 3 — для стандартной, 10 — для высокой).
Особенность бизнес-логики и модели данных:
- в карточке сотрудника хранится только ссылка на выбранный профиль нагрузки;
- в каждом профиле нагрузки хранится только системное имя атрибута из справочника лимитов нагрузки;
- числовое значение лимита хранится в справочнике лимитов нагрузки.
Требуется:
- при выборе профиля нагрузки в карточке сотрудника автоматически вычислять соответствующий числовой лимит нагрузки для сотрудника.
Исходные данные
Имеются следующие шаблоны записей:
- Лимиты нагрузки (системное имя:
workloadLimits) с атрибутами:
| Название | Системное имя | Тип данных | Описание |
|---|---|---|---|
| Лимит низкий | limitLow |
число | Значение лимита задач для профиля с низкой нагрузкой |
| Лимит стандартный | limitStandard |
число | Значение лимита задач для профиля со стандартной нагрузкой |
| Лимит высокий | limitHigh |
число | Значение лимита задач для профиля с высокой нагрузкой |
- Профили нагрузки (системное имя:
WorkloadProfiles) с атрибутами:
| Название | Системное имя | Тип данных | Описание |
|---|---|---|---|
| Название | — | текст | Наглядное название профиля (например, Низкая нагрузка, Стандартная нагрузка, Высокая нагрузка) |
| Системное имя атрибута лимита | limitAttributeSystemName |
текст | Системное имя атрибута шаблона «Лимиты нагрузки», из которого требуется брать значение лимита |
- Карточки сотрудников (системное имя:
employeeCards) с атрибутами:
| Название | Системное имя | Тип данных | Описание |
|---|---|---|---|
| Профиль нагрузки | workloadProfile |
запись | Выбранный профиль нагрузки сотрудника; связан с шаблоном «Профили нагрузки» |
| Лимит задач | maxTasks |
число | Атрибут, значение которого будет вычисляться на основе выбранного профиля нагрузки |
Настройка вычисления
Логика вычисления
Представленное здесь выражение на N3 выполняет следующие шаги:
- Определяет профиль нагрузки, выбранный в карточке сотрудника.
- Из профиля нагрузки извлекает системное имя атрибута, хранящего числовое значение лимита в шаблоне «Лимиты нагрузки».
- По этому системному имени получает атрибут в шаблоне «Лимиты нагрузки» и считывает из него числовой лимит.
- Возвращает числовой лимит, соответствующий выбранному профилю нагрузки, в атрибут «Лимит задач» шаблона «Карточки сотрудников».
- В шаблоне «Карточки сотрудников» откройте для настройки атрибут «Лимит задач».
- В свойствах атрибута установите флажок «Вычислять автоматически».
-
В поле «Вычисляемое значение введите следующее выражение на языке N3:
# Импортируем префиксы для работы# с объектами, системными сущностями и шаблонами.@prefix object: <http://comindware.com/ontology/object#>.@prefix cmw: <http://comindware.com/logics#>.@prefix container: <http://comindware.com/ontology/container#>.{# Получаем атрибут «Профиль нагрузки» в шаблоне «Карточки сотрудников».("employeeCards" "workloadProfile") object:findProperty ?profileAttribute.# Получаем атрибут «Системное имя атрибута лимита» в шаблоне «Профили нагрузки».("WorkloadProfiles" "limitAttributeSystemName") object:findProperty ?limitAttributeSystemNameAttribute.# Получаем из текущей записи выбранный профиль нагрузки.?item ?profileAttribute ?profile.# В выбранном профиле читаем системное имя# требуемого атрибута шаблона «Лимиты нагрузки».?profile ?limitAttributeSystemNameAttribute ?limitAttributeSystemName.# Находим шаблон «Лимиты нагрузки» по его системному имени.?workloadLimitsTemplate container:alias "workloadLimits".# В шаблоне «Лимиты нагрузки» получаем атрибут# по системному имени, которое указано в профиле нагрузки.?limitAttribute object:alias ?limitAttributeSystemName.?workloadLimitsTemplate object:property ?limitAttribute.# Получаем ID шаблона шаблона «Лимиты нагрузки».?workloadLimitsTemplateId object:alias "workloadLimits".# Получаем все записи шаблона «Лимиты нагрузки» по его ID.?workloadLimitsItems cmw:container ?workloadLimitsTemplateId.# Получаем числовое значение лимита# из найденного атрибута limitAttribute.?workloadLimitsItems ?limitAttribute ?.# Возвращаем полученное значение лимита задач.?workloadLimitsItems ?limitAttribute ?value.}
Тестирование
-
В шаблоне «Лимиты нагрузки» создайте три записи и заполните значения лимитов:
Название лимита Значение Лимит низкий 1Лимит стандартный 3Лимит высокий 10 -
В шаблоне «Профили нагрузки» создайте три записи и задайте для них системные имена соответствующих атрибутов лимитов из шаблона «Лимиты нагрузки»:
Название профиля Системное имя атрибута лимита Низкая нагрузка limitLowСтандартная нагрузка limitStandardВысокая нагрузка limitHigh -
В шаблоне «Карточки сотрудников» создайте новую запись.
- Выберите Профиль нагрузки.
- Сохраните карточку сотрудника.
-
Убедитесь, что:
- в поле «Лимит задач» отображается значение соответствующего атрибута шаблона «Лимиты нагрузки»;
- при смене профиля нагрузки значение поля «Лимит задач» изменяется в соответствии выбранным профилем.