Автонумерация записей с помощью формулы, C#-скрипта или выражения N3
Введение
Каждой записи, пользовательской задаче, форме и экземпляру процесса присваивается уникальный ID. В рамках сервера Comindware Business Application Platform ID не повторяются.
Чтобы автоматически нумеровать новые записи в шаблоне, создайте атрибут и настройте его заполнение порядковыми номерами одним из способов:
- с помощью формулы;
- с помощью C#-скрипта в процессе;
- с помощью C#-скрипта в сценарии;
- с помощью выражения N3.
Здесь даны примеры настройки автонумерации записей этими способами.
Примечание
-
Алгоритмы, представленные в примерах, не присваивают порядковые номера уже существующим записям в шаблоне.
-
Для нумерации имеющихся записей потребуется обработать их с помощью цикла в сценарии, например, с использованием C#-скрипта.
Прикладная задача
Необходимо настроить нумерацию заявок, создаваемых в шаблоне «Заявки» при запуске процесса «Оформление заявки», связанного с шаблоном записи «Заявки».
Нумерация заявок будет отличаться от ID записей, которые им присваиваются автоматически: порядковые номера будут присваиваться только записям этого шаблона, а ID имеют сквозную нумерацию для всех шаблонов и приложений.
Автонумерация с помощью формулы
Для шаблонов с небольшим количеством записей можно использовать автонумерацию с помощью формулы.
Внимание!
-
Так как данный способ не учитывает возможность удаления записей, при удалении записей порядковые номера могут дублироваться.
-
Так как этот способ учитывает количество существующих записей, новой записи будет присвоен такой порядковый номер, как если бы все предыдущие записи были тоже пронумерованы.
- В шаблоне записи «Заявки» создайте и поместите на форму атрибут «Номер заявки» типа «Текст».
-
Откройте сценарий на выходе из начального события процесса «Оформление заявки» и добавьте в него действие «Изменить значения атрибутов» со следующими свойствами:
Атрибут Операция со значениями Значение Номер заявки Заменить Формула: FORMAT("{0}",LIST(COUNT((from a in db->Zayavki select a->id))))Синтаксис формулы
-
FORMAT()— эта функция принимает строку с заполнителями вида{0}…{N}и список значений. Функция подставляет значения из списка в соответствующие заполнители и возвращает результирующую строку. -
LIST()— эта функция принимает перечень значений и возвращает список, состоящий из этих значений. -
COUNT()— эта функция подсчитывает количество записей в шаблоне записи, возвращённых в запросомfrom a in db. -
from a in db->Zayavki select a->id— запрос всех записей из шаблона «Заявки». -
Zayavki— системное имя шаблона записи «Заявки».
-
-
Опубликуйте диаграмму процесса.
Тестирование
- Создайте экземпляр процесса «Оформление заявки».
- При запуске процесса будет создана новая запись в шаблоне «Заявки».
- Новой заявке должен быть присвоен Номер заявки на 1 больше количества существующих записей в шаблоне «Заявки».
Автонумерация с помощью C#-скрипта в процессе
Если в шаблоне будет много записей, то рекомендуется использовать автонумерацию с помощью C#-скрипта для повышения производительности.
Кроме того, при автонумерации с помощью C#-скрипта удаление записей не повлияет на присваиваемые порядковые номера.
- На странице администрирования приложения выберите пункт «Переменные».
-
Создайте переменную со следующими свойствами:
- Название — Порядковый номер
- Тип — число
- Значение — 1
-
В шаблоне записи «Заявки» создайте и поместите на форму атрибут «Номер заявки» типа «Число».
- В шаблоне процесса «Оформление заявки» добавьте задачу-выполнение сценария сразу после начального события.
-
В свойствах задачи-выполнения сценария на вкладке «Дополнительные» добавьте следующий C#-скрипт:
using System;using System.Collections.Generic;using System.Linq;using Comindware.Data.Entity;using Comindware.TeamNetwork.Api.Data.UserCommands;using Comindware.TeamNetwork.Api.Data;public class Script{public static void Main(Comindware.Process.Api.Data.ScriptContext context, Comindware.Entities entities){// BusinessObjectId — запись, связанная с экземпляром процесса.var objectId = context.BusinessObjectId;// Получаем значение переменной «Порядковый номер» по её ID — svar.1.// Присваиваем полученное значение переменной sequenceNumber.var sequenceNumber = (decimal)Api.Solution.SolutionVariableService.GetValue("svar.1");// Nomerzayavki — системное имя атрибута «Номер заявки».// Создаём словарь data со значением атрибута «Номер заявки»,// равным значению переменной «Порядковый номер».var data = new Dictionary<string, object>{{"Nomerzayavki", sequenceNumber}};// Zayavki — системное имя шаблона записи «Заявки».// Записываем значение атрибута «Порядковый номер» в текущей ЗаявкеApi.TeamNetwork.ObjectService.EditWithAlias("Zayavki", objectId, data);// Приращиваем на 1 значение переменной «Порядковый номер»Api.Solution.SolutionVariableService.SetValue("svar.1", sequenceNumber+1);}} -
Опубликуйте диаграмму.
Тестирование
- Создайте экземпляр процесса.
- В поле атрибута «Номер заявки» должен отобразиться её порядковый номер.
- В свойствах переменной «Порядковый номер» значение должно увеличиться на 1.
Автонумерация с помощью C#-скрипта в сценарии
C#-скрипт также можно применять для автонумерации в сценариях.
При автонумерации с помощью C#-скрипта удаление записей не повлияет на присваиваемые порядковые номера.
- На странице администрирования приложения выберите пункт «Переменные».
-
Создайте переменную со следующими свойствами:
- Название — Порядковый номер
- Тип — число
- Значение — 1
-
В шаблоне записи «Заявки» создайте и поместите на форму атрибут «Номер заявки» типа «Число».
-
Создайте новый сценарий «Автонумерация» и настройте его событие:
- Тип: создание записи;
- Контекстный шаблон записи: Заявки.
-
Добавьте действие «Изменить значения скриптом» со следующими свойствами:
- Атрибут: Номер заявки
- Операция со значениями: заменить
-
Значение: C#
public class Script{// ObjectID — запись, в контексте которой выполняется скрипт.public static decimal Main(string ObjectID){// Получаем значение переменной «Порядковый номер» по её ID — svar.1.// Присваиваем полученное значение переменной sequenceNumber.var sequenceNumber = (decimal)Api.Solution.SolutionVariableService.GetValue("svar.1");// Приращиваем на 1 значение переменной «Порядковый номер»Api.Solution.SolutionVariableService.SetValue("svar.1", sequenceNumber+1);// Возвращаем значение sequenceNumber в указанный атрибут.return sequenceNumber;}}
Тестирование
- Создайте экземпляр записи в шаблоне «Заявки».
- В поле атрибута «Номер заявки» должен отобразиться её порядковый номер.
- В свойствах переменной «Порядковый номер» значение должно увеличиться на 1.
Автонумерация с помощью выражения N3
Для автонумерации записей также можно использовать выражение N3. При этом удаление записей не повлияет на присваиваемые порядковые номера.
- На странице администрирования приложения выберите пункт «Переменные».
-
Создайте переменную со следующими свойствами:
- Название — Порядковый номер
- Тип — число
- Значение — 1
-
В шаблоне записи «Заявки» создайте и поместите на форму атрибут «Номер заявки» типа «Число».
-
Создайте новый сценарий «Автонумерация» и настройте его событие:
- Тип: создание записи
- Контекстный шаблон записи: Заявки
-
Добавьте действие «Изменить значения атрибутов» со следующими свойствами:
- Атрибут: Номер заявки
- Операция со значениями: заменить
-
Значение: N3
# Импортируем функции для работы с переменными@prefix globalvariable: <http://comindware.com/ontology/variable#>.@prefix cmwnullable: <http://comindware.com/ontology/entity/nullable#>.{# Получаем значение переменной «Порядковый номер»# по её ID — svar.1 и помещаем в ?globalVar."svar.1" globalvariable:getValueById ?globalVar.# Увеличиваем значение переменной «Порядковый номер»# на 1 и сохраняем в ?resultSum.(?globalVar 1) cmwnullable:sum ?resultSum.# Присваиваем переменной значение ?resultSum."svar.1" globalvariable:setValue ?resultSum.# Передаем в атрибут значение ?globalVar (переменной до её увеличения).?globalVar -> ?value.}
Тестирование
- Создайте экземпляр записи в шаблоне «Заявки».
- В поле атрибута «Номер заявки» должен отобразиться её порядковый номер.
- В свойствах переменной «Порядковый номер» значение должно увеличиться на 1.
Эта статья была полезна 2 чел.