Перейти к содержанию

Получение значения из атрибута по системному имени, хранящемуся в другом шаблоне с помощью N3

Введение

Comindware Platform позволяет с помощью выражений на N3 получать значение атрибута по его системному имени, когда само системное имя хранится в атрибуте другой записи в отдельном шаблоне.

Такой приём полезен, когда набор атрибутов, из которых требуется брать значения, не определён заранее, а формируется динамически.

Здесь представлен пример настройки вычисления на N3, демонстрирующий, как на основании значения, хранящегося в одном шаблоне, динамически выбрать атрибут второго шаблона по его системному имени и использовать его значение для заполнения записи в третьем шаблоне.

Прикладная задача

Имеется приложение «Учёт нагрузки сотрудников».

  • На форме «Карточка сотрудника» пользователь заполняет данные сотрудника и выбирает его профиль нагрузки в раскрывающемся списке на форме: Низкая нагрузка, Стандартная нагрузка, Высокая нагрузка.
  • Для каждого профиля нагрузки задан числовой лимит количества одновременно открытых задач (например, 1 — для низкой нагрузки, 3 — для стандартной, 10 — для высокой).

Особенность бизнес-логики и модели данных:

  • в карточке сотрудника хранится только ссылка на выбранный профиль нагрузки;
  • в каждом профиле нагрузки хранится только системное имя атрибута из справочника лимитов нагрузки;
  • числовое значение лимита хранится в справочнике лимитов нагрузки.

Требуется:

  • при выборе профиля нагрузки в карточке сотрудника автоматически вычислять соответствующий числовой лимит нагрузки для сотрудника.

Исходные данные

Имеются следующие шаблоны записей:

  • Лимиты нагрузки (системное имя: workloadLimits) с атрибутами:
Название Системное имя Тип данных Описание
Лимит низкий limitLow число Значение лимита задач для профиля с низкой нагрузкой
Лимит стандартный limitStandard число Значение лимита задач для профиля со стандартной нагрузкой
Лимит высокий limitHigh число Значение лимита задач для профиля с высокой нагрузкой
  • Профили нагрузки (системное имя: WorkloadProfiles) с атрибутами:
Название Системное имя Тип данных Описание
Название — текст Наглядное название профиля (например, Низкая нагрузка, Стандартная нагрузка, Высокая нагрузка)
Системное имя атрибута лимита limitAttributeSystemName текст Системное имя атрибута шаблона «Лимиты нагрузки», из которого требуется брать значение лимита
  • Карточки сотрудников (системное имя: employeeCards) с атрибутами:
Название Системное имя Тип данных Описание
Профиль нагрузки workloadProfile запись Выбранный профиль нагрузки сотрудника; связан с шаблоном «Профили нагрузки»
Лимит задач maxTasks число Атрибут, значение которого будет вычисляться на основе выбранного профиля нагрузки

Настройка вычисления

Логика вычисления

Представленное здесь выражение на N3 выполняет следующие шаги:

  1. Определяет профиль нагрузки, выбранный в карточке сотрудника.
  2. Из профиля нагрузки извлекает системное имя атрибута, хранящего числовое значение лимита в шаблоне «Лимиты нагрузки».
  3. По этому системному имени получает атрибут в шаблоне «Лимиты нагрузки» и считывает из него числовой лимит.
  4. Возвращает числовой лимит, соответствующий выбранному профилю нагрузки, в атрибут «Лимит задач» шаблона «Карточки сотрудников».
  1. В шаблоне «Карточки сотрудников» откройте для настройки атрибут «Лимит задач».
  2. В свойствах атрибута установите флажок «Вычислять автоматически».
  3. В поле «Вычисляемое значение введите следующее выражение на языке 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. В шаблоне «Лимиты нагрузки» создайте три записи и заполните значения лимитов:

    Название лимита Значение
    Лимит низкий 1
    Лимит стандартный 3
    Лимит высокий 10
  2. В шаблоне «Профили нагрузки» создайте три записи и задайте для них системные имена соответствующих атрибутов лимитов из шаблона «Лимиты нагрузки»:

    Название профиля Системное имя атрибута лимита
    Низкая нагрузка limitLow
    Стандартная нагрузка limitStandard
    Высокая нагрузка limitHigh
  3. В шаблоне «Карточки сотрудников» создайте новую запись.

  4. Выберите Профиль нагрузки.
  5. Сохраните карточку сотрудника.
  6. Убедитесь, что:

    • в поле «Лимит задач» отображается значение соответствующего атрибута шаблона «Лимиты нагрузки»;
    • при смене профиля нагрузки значение поля «Лимит задач» изменяется в соответствии выбранным профилем.
‌ К началу

Ассистент базы знаний Comindware

Загрузка ассистента...
✓ Запрос отправлен в ИИ-ассистент Открыть вкладку