Автонумерация записей с пересчётом при удалении
Введение
В 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#>.
{
# Создаём переменную-индекс и
# задаём ей значение 0
variable: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 и помещаем
# её в ?startValue
session:context variable:index ?startValue.
# Увеличиваем значение ?startValue на 1
# и помещаем результат в ?newIndex
(?startValue 1) math:sum ?newIndex.
# Находим переменную requestNumber и помещаем
# её в ?requestNumberValue
session:context variable:requestNumber ?requestNumberValue.
# Приводим значение ?newIndex к типу данных «Текст»
# и помещаем в ?codeFormatted вместе с ?requestNumberValue
("Док. {0} по заявке {1}" ?newIndex ?requestNumberValue) string:format ?codeFormatted.
# Заменяем значение переменной индекс
# на значение ?newIndex
variable:index operator:replace ?newIndex.
# Возвращаем в значение атрибута ?codeFormatted
?codeFormatted -> ?value.
}
Тестирование
- Создайте запись в шаблоне «Заявки».
- В форме заявки создайте несколько записей в таблице «Документы о расходах».
- Сохраните заявку.
- В столбце «Код документа» отобразятся нумерация записей, а в столбце «ID» — их системные номера.
- Удалите одну или несколько записей в таблице «Документы о расходах».
- Сохраните заявку.
- Номера в столбце «Код документа» обновятся, а их ID останутся неизменными.