Автонумерация записей с пересчётом при удалении
Введение
В Comindware Platform каждой записи, пользовательской задаче, форме, экземпляру процесса и любому объекту присваиваются уникальный ID. В рамках одного экземпляра Comindware Platform ID не повторяются. После удаления объекта его ID не используется повторно. Кроме того, ID записей имеют сквозную нумерацию для всех шаблонов и приложений, не являются наглядными и малоинформативны для бизнеса.
При этом в приложениях зачастую требуется присваивать записям наглядные номера или коды и пересчитывать их при создании и удалении записей.
Здесь представлен пример настройки сценария для автонумерации записей из связанного шаблона с пересчётом номеров при их удалении.
Примеры настройки автонумерации записей при их создании см. в статье «Автонумерация записей с помощью формулы, C#-скрипта или выражения N3».
Прикладная задача
Имеется шаблоны «Заявки» и «Реестр документов».
Каждая заявка связана с записями о расходах из реестра документов.
Требуется настроить автонумерацию записей в Реестре документов с использованием кодов вида: Док. <N> по заявке <requestNumber>., где <N> — порядковый номер документа, а <requestNumber> — номер заявки.
При этом для каждой Заявки нумерация записей из Реестра документов должна начинаться заново.
При удалении записи из Реестра документов, нумерация должна пересчитываться.
Исходные данные
Имеются шаблон «Заявки» и «Реестр документов».
В шаблоне «Заявки» имеются атрибуты:
-
Номер заявки:
- Тип данных: текст
- Системное имя:
Номерзаявки
Совет
В этом примере не рассматривается формирование Номера заявки.
Для этого можно воспользоваться приёмами из статьи «Автонумерация записей с помощью формулы, C#-скрипта или выражения N3»
-
Документы о расходах:
- Тип данных: запись
- Связанный шаблон: Реестр документов
- Системное имя: Documents
- Хранить несколько значений: флажок установлен
В шаблоне «Реестр документов» имеется атрибут «Код документа» типа «Текст»;
На форму шаблона «Заявки» вынесен атрибут «Документы» с представлением в виде таблицы.
В таблицу «Документы» добавлены столбцы «ID» и «Код документа».
На область кнопок таблицы «Документы» помещены кнопки «Создать» и «Удалить».
Настройка автонумерации связанных записей
- Создайте новый сценарий «Автонумерация».
-
Настройте начальное событие «Нажата кнопка»:
- Контекстный шаблон: Заявки
- Кнопка: Сохранить
-
Добавьте действие «Проверить результат выражения» со следующими свойствами:
-
Выражение: N3
# Импортируем функции для работы# с записями, строками, базой данных и переменными@prefix object: <http://comindware.com/ontology/object#>.@prefix variable: <http://comindware.com/ontology/session/variable#>.@prefix operator: <http://comindware.com/ontology/session/operator#>.{# Создаём переменную-индекс и# задаём ей значение 0variable:index operator:replace 0.# Создаём переменную requestNumber# и присваиваем ей номер заявки("Заявки" "Номерзаявки") object:findProperty ?requestNumberAttribute.?item ?requestNumberAttribute ?requestNumberAttributeValue.variable:requestNumber operator:replace ?requestNumberAttributeValue.# Возвращаем true, чтобы сценарий выполнялся далееtrue -> ?value.}
-
-
Добавьте действие «Сменить контекст» со следующими свойствами:
- Целевой шаблон записи: Реестр документов
-
Атрибут или выражения для поиска объектов: формула
# Собираем ID всех записей,# связанных с атрибутом Documents (Документы о расходах)from a in $Documents select a->id
-
Добавьте действие «Изменить значения атрибутов» внутрь действия «Сменить контекст» со следующими свойствами:
- Атрибут: Код документа
- Действие: заменить
-
Значение: N3
# Импортируем функции для работы с переменными, строками и числами@prefix variable: <http://comindware.com/ontology/session/variable#>.@prefix operator: <http://comindware.com/ontology/session/operator#>.@prefix session: <http://comindware.com/ontology/session#>.@prefix string: <http://www.w3.org/2000/10/swap/string#>.@prefix math: <http://www.w3.org/2000/10/swap/math#>.{# Находим переменную index и помещаем# её в ?startValuesession:context variable:index ?startValue.# Увеличиваем значение ?startValue на 1# и помещаем результат в ?newIndex(?startValue 1) math:sum ?newIndex.# Находим переменную requestNumber и помещаем# её в ?requestNumberValuesession:context variable:requestNumber ?requestNumberValue.# Приводим значение ?newIndex к типу данных «Текст»# и помещаем в ?codeFormatted вместе с ?requestNumberValue("Док. {0} по заявке {1}" ?newIndex ?requestNumberValue) string:format ?codeFormatted.# Заменяем значение переменной индекс# на значение ?newIndexvariable:index operator:replace ?newIndex.# Возвращаем в значение атрибута ?codeFormatted?codeFormatted -> ?value.}
Тестирование
- Создайте запись в шаблоне «Заявки».
- В форме заявки создайте несколько записей в таблице «Документы о расходах».
- Сохраните заявку.
- В столбце «Код документа» отобразятся нумерация записей, а в столбце «ID» — их системные номера.
- Удалите одну или несколько записей в таблице «Документы о расходах».
- Сохраните заявку.
- Номера в столбце «Код документа» обновятся, а их ID останутся неизменными.
Эта статья была полезна 1 чел.