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

Получение значения из атрибута по системному имени, хранящемуся в другом шаблоне с помощью 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. Убедитесь, что:

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