Атрибут типа «Список значений». Вычисление текстового значения и фильтрация с помощью N3 и формул


Введение

Для каждого значения атрибута типа «Список значений» могут быть заданы названия на русском, английском и немецком языках.

Здесь представлен пример извлечения значения атрибута типа «Список значений» на определённом языке с помощью N3, сравнения его значения с требуемым с помощью формулы и фильтрации записей в таблице по значению такого атрибута с помощью N3.

См. также:

Структура атрибута типа «Список значений»

  • Атрибут типа «Список значений» хранит ID значения, выбранного из предварительно заданного списка.
  • Список возможных значений настраивается в свойствах атрибута и не может быть изменён при выполнении приложения.
  • Каждое возможное значение содержит:
    • Системное имя значения.
    • Отображаемые названия на русском, английском и немецком языках (достаточно указать название на одном языке).
    • Цвет — числовой код в десятичном формате. Для поиска кодов цветов и их преобразования из шестнадцатеричной в десятичную форму можно воспользоваться, например, сайтом https://convertingcolors.com/.
    • Значок — строка с кодом FontAwesome. Для поиска кодов значков можно воспользоваться встроенной галереей значков или сайтом https://fontawesome.com/.

Получение значения атрибута на определённом языке с помощью N3

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

# Находим атрибут EnumAttributeSystemName в шаблоне TemplateSystemName. 
("TemplateSystemName" "EnumAttributeSystemName") object:findProperty ?enumAttribute.
# Присваиваем переменной ?enumAttributeValues
# объект со списком значений атрибута.
?item ?enumAttribute ?enumAttributeValues.
# Присваиваем переменной ?enumValueId
# объект с выбранным значением атрибута.
?enumAttributeValues cmw:variantName ?enumValueId.
# Присваиваем переменной ?enumAttributeValues массив объектов
# с заполненными названиями значения атрибута на всех языках.
?enumValueId l10n:text ?enumValueLanguageVersions.
# Начинаем цикл по ?enumValueLanguageVersions
# Присваиваем переменной ?langCodeStr код языка
# названия значения атрибута на текущей итерации цикла.
?enumValueLanguageVersions l10n:lang ?langCode.
("{0}" ?langCode) string:format ?langCodeStr.
# Сравниваем код языка для значения атрибута с желаемым.
# "ru" — код русского языка, "en" — английского, "de" — немецкого.
?langCodeStr cmwentity:contains "ru".
# Если предыдущее предложение возвращает true,
# записываем значение на русском языке в вычисляемый атрибут.
?names l10n:data ?value.
# переходим к следующей итерации по ?enumValueLanguageVersions.

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

С помощью формулы сравнить значение атрибута типа «Список значений» с требуемым можно по системному имени значения следующими способами:

  • равенство

    $EnumAttributeSystemName == EnumValueSystemName 

    или

    EQUALS($EnumAttributeSystemName->cmw.variantAlias, "EnumValueSystemName") 

    или

    EQUALS($EnumAttributeSystemName, ENUMVALUE("EnumAttributeSystemName", "EnumValueSystemName")) 
  • неравенство

    $EnumAttributeSystemName !== EnumValueSystemName 

    или

    NOT(EQUALS($EnumAttributeSystemName->cmw.variantAlias, "EnumValueSystemName")) 

    или

    NOT(EQUALS($EnumAttributeSystemName, ENUMVALUE("EnumAttributeSystemName", "EnumValueSystemName"))) 

Фильтрация значения атрибута с помощью N3

С помощью N3 для атрибута типа «Список значений» можно выполнять фильтрацию по системному имени его значения:

  • Фильтрация (в таблице шаблона) записей с требуемым значением атрибута:

    @prefix convert: <http://comindware.com/logics/convertions#>. 
    @prefix object: <http://comindware.com/ontology/object#>.
    {
    # Получаем атрибут типа «Список значений» из шаблона по системному имени.
    ("TemplateSystemName" "EnumAttributeSystemName") object:findProperty ?enumAttribute.
    # Получаем ID значения атрибута по системному имени.
    ("EnumAttributeSystemName" "enumValueSystemName") convert:enumValue ?enumValueId.
    # Возвращаем записи, у которых атрибут имеет значение "enumValueSystemName".
    ?item ?enumAttribute ?enumValueId.
    }
  • Фильтрация добавляемых записей (в таблице на форме или раскрывающемся списке на форме) записей с требуемым значением атрибута:

    @prefix convert: <http://comindware.com/logics/convertions#>. 
    @prefix object: <http://comindware.com/ontology/object#>.
    {
    # Получаем атрибут типа «Список значений» из шаблона по системному имени.
    ("TemplateSystemName" "EnumAttributeSystemName") object:findProperty ?enumAttribute.
    # Получаем ID значения атрибута по системному имени.
    ("EnumAttributeSystemName" "enumValueSystemName") convert:enumValue ?enumValueId.
    # Фильтруем и возвращаем записи,
    # у которых атрибут имеет значение "enumValueSystemName".
    ?filteredRecordIds ?enumAttribute ?enumValueId.
    ?filteredRecordIds -> ?value.
    }

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

    @prefix convert: <http://comindware.com/logics/convertions#>. 
    @prefix object: <http://comindware.com/ontology/object#>.
    {
    # Получаем атрибут типа «Запись» из шаблона с коллекцией записей.
    ("ParentTemplateSystemName" "RecordAttributeSystemName") object:findProperty ?RecordAttribute.
    # Получаем атрибут типа «Список значений» из связанного шаблона по системному имени.
    ("LinkedTemplateSystemName" "EnumAttributeSystemName") object:findProperty ?enumAttribute.
    # Получаем ID значения атрибута по системному имени.
    ("EnumAttributeSystemName" "enumValueSystemName") convert:enumValue ?enumValueId.
    # Получаем коллекцию записей из атрибута RecordAttribute.
    ?item ?RecordAttribute ?filteredRecordIds.
    # Фильтруем и возвращаем записи,
    # у которых атрибут имеет значение "enumValueSystemName".
    ?filteredRecordIds ?enumAttribute ?enumValueId.
    ?filteredRecordIds -> ?value.
    }

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

Имеется процесс оформления заявок на перевозку.

Тип транспортного средства в заявке задаётся атрибутом типа «Список значений».

Требуется распределять заявки в разным исполнителям в зависимости от выбранного типа ТС.

Требуется формировать таблицу со списком заявок на легковые автомобили, включая столбец с типом ТС на русском языке.

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

  • Имеются шаблон записи «Заявки на перевозку» (с системным именем Заявкинаперевозку) и связанный с ним шаблон процесса «Обработка заявок».
  • В шаблоне «Заявки на перевозку» есть атрибут «Тип ТС» типа «Список значений» с системным именем ТипТС и следующими значениями:
Системное имя RU
Bus автобус
Car легковой автомобиль
Truck грузовой автомобиль

Настройка получения текстового значения атрибута типа «Список значений» на определённом языке

  1. В шаблоне «Заявки на перевозку» создайте атрибут со следующими свойствами:

    • Название: Наименование типа ТС
    • Тип данных: текст
    • Вычислять автоматически: флажок установлен
    • Вычисляемое выражение: N3
    # Импортируем функции для работы 
    # с записями, строками и базой данных.
    @prefix object: <http://comindware.com/ontology/object#>.
    @prefix cmw: <http://comindware.com/logics#>.
    @prefix l10n: <http://comindware.com/ontology/l10n#>.
    @prefix string: <http://www.w3.org/2000/10/swap/string#>.
    @prefix cmwentity: <http://comindware.com/ontology/entity#>.
    {
        # Находим атрибут «Тип ТС» в шаблоне «Заявки на перевозку».
        ("Заявкинаперевозку" "ТипТС") object:findProperty ?TipTSAttribute.
        # Присваиваем переменной ?TipTSAttributeValues
    # объект со списком значений атрибута «Тип ТС».
        ?item ?TipTSAttribute ?TipTSAttributeValues.
        # Присваиваем переменной ?SelectedValue
    # объект с выбранным значением атрибута.
        ?TipTSAttributeValues cmw:variantName ?SelectedValue.
        # Присваиваем переменной ?names массив объектов
    # с заполненными названиями значения атрибута на всех языках.
        ?SelectedValue l10n:text ?names.
        # Начинаем цикл по ?names
        # Присваиваем переменной ?langCodeStr код языка
    # названия значения атрибута на текущей итерации цикла.
        ?names l10n:lang ?langCode.
        ("{0}" ?langCode) string:format ?langCodeStr.
        # Сравниваем код языка для значения атрибута с желаемым.
        # "ru" — код русского языка, "en" — английского, "de" — немецкого.
        ?langCodeStr cmwentity:contains "ru".
        # Если предыдущее предложение возвращает true,
    # записываем значение на русском языке в вычисляемый атрибут.     
        ?names l10n:data ?value.
    # переходим к следующей итерации по ?names.
    }
  2. Поместите атрибуты «Тип ТС» и «Наименование типа ТС» на форму начального события диаграммы процесса «Обработка заявок».

Настройка распределения заявок по значению атрибута типа «Список значений»

  1. На диаграмме процесса «Обработка заявок» после начального события добавьте развилку «или/или».
  2. Добавьте три потока управления и присоедините к ним пользовательские задачи «Обработать заявку на автобус», «Обработать заявку на легковой автомобиль», «Обработать заявку на грузовой автомобиль».
  3. В дополнительных свойствах всех задач задайте формулу для заголовка задачи:

    FORMAT("Обработайте заявку на перевозку: {0}", LIST($НаименованиетипаТС)) 
  4. После каждой пользовательской задачи добавьте конечное событие.

  5. Настройте исходящие потоки в дополнительных свойствах развилки «или/или» следующим образом:

    Поток «Иначе» Конечная точка Условие
    Обработать заявку на автобус Формула: $ТипТС == "Bus"
    Обработать заявку на легковой автомобиль Формула: $ТипТС == "Car"
    Флажок установлен Обработать заявку на грузовой автомобиль
  6. Опубликуйте процесс.

Диаграмма процесса «Обработка заявок»

Диаграмма процесса «Обработка заявок»

Фильтрация записей по значению атрибута «Список значений»

  1. В шаблоне «Заявки на перевозку» создайте таблицу «Заявки на легковые автомобили».
  2. Добавьте в таблицу атрибут «Тип ТС».
  3. Сохраните таблицу.
  4. Откройте панель основных свойств таблицы.
  5. В поле «Системный фильтр» введите следующее выражение N3:

    # Импортируем функции для работы 
    # с записями, строками и базой данных.
    @prefix convert: <http://comindware.com/logics/convertions#>.
    @prefix object: <http://comindware.com/ontology/object#>.
    {
    # Находим атрибут «Тип ТС»
    # в шаблоне «Заявки на перевозку».
    ("Заявкинаперевозку" "ТипТС") object:findProperty ?TipTSAttribute.
    # Находим ID значения Car (легковой автомобиль)
    # атрибута «Тип ТС».
    ("ТипТС" "Car") convert:enumValue ?enumIdCar.
    # Возвращаем записи, у которых
    # значение атрибута «Тип ТС»
    # равно Car (легковой автомобиль).
    ?item ?TipTSAttribute ?enumIdCar.
    }
  6. Сохраните таблицу.

Тестирование

  1. Создайте заявку и выберите тип ТС «автобус».
  2. На странице «Мои задачи» должна появиться задача с заголовком «Обработайте заявку на перевозку: автобус».
  3. Создайте вторую заявку и выберите тип ТС «легковой автомобиль».
  4. На странице «Мои задачи» должна появиться с заголовком «Обработайте заявку на перевозку: легковой автомобиль».
  5. Создайте третью заявку и выберите тип ТС «грузовой автомобиль».
  6. На странице «Мои задачи» должна появиться задача с заголовком «Обработайте заявку на перевозку: грузовой автомобиль».
  7. Перейдите к экземплярам записи шаблона «Заявки на обработку».
  8. Откройте таблицу «Заявки на легковой автомобиль».
  9. Отобразится список заявок на легковой автомобиль.
К началу


Номер Статьи: 4920
Размещено: Fri, Jul 26, 2024
Последнее обновление: Mon, Apr 7, 2025

Online URL: https://kb.comindware.ru/article/atribut-tipa-spisok-znachenij-vychislenie-tekstovogo-znacheniya-i-filtraciya-s-pomoshyu-n3-i-formul-4920.html