Введение
Каждой записи, пользовательской задаче, форме и экземпляру процесса присваивается уникальный 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.