Автонумерация записей с помощью формулы, C#-скрипта или выражения N3


Введение

Каждой записи, пользовательской задаче, форме и экземпляру процесса присваивается уникальный ID. В рамках сервера Comindware Business Application Platform ID не повторяются.

Чтобы автоматически нумеровать новые записи в шаблоне, создайте атрибут и настройте его заполнение порядковыми номерами одним из способов:

Здесь даны примеры настройки автонумерации записей этими способами.

Примечание

  • Алгоритмы, представленные в примерах, не присваивают порядковые номера уже существующим записям в шаблоне.

  • Для нумерации имеющихся записей потребуется обработать их с помощью цикла в сценарии, например, с использованием C#-скрипта.

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

Необходимо настроить нумерацию заявок, создаваемых в шаблоне «Заявки» при запуске процесса «Оформление заявки», связанного с шаблоном записи «Заявки».

Нумерация заявок будет отличаться от ID записей, которые им присваиваются автоматически: порядковые номера будут присваиваться только записям этого шаблона, а ID имеют сквозную нумерацию для всех шаблонов и приложений.

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

Для шаблонов с небольшим количеством записей можно использовать автонумерацию с помощью формулы.

Внимание!

  • Так как данный способ не учитывает возможность удаления записей, при удалении записей порядковые номера могут дублироваться.

  • Так как этот способ учитывает количество существующих записей, новой записи будет присвоен такой порядковый номер, как если бы все предыдущие записи были тоже пронумерованы.

  1. В шаблоне записи «Заявки» создайте и поместите на форму атрибут «Номер заявки» типа «Текст».
  2. Откройте сценарий на выходе из начального события процесса «Оформление заявки» и добавьте в него действие «Изменить значения атрибутов» со следующими свойствами:

    Атрибут Операция со значениями Значение
    Номер заявки Заменить Формула:

    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 — системное имя шаблона записи «Заявки».

  3. Опубликуйте диаграмму процесса.

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

  1. Создайте экземпляр процесса «Оформление заявки».
  2. При запуске процесса будет создана новая запись в шаблоне «Заявки».
  3. Новой заявке должен быть присвоен Номер заявки на 1 больше количества существующих записей в шаблоне «Заявки».

Автонумерация с помощью C#-скрипта в процессе

Если в шаблоне будет много записей, то рекомендуется использовать автонумерацию с помощью C#-скрипта для повышения производительности.

Кроме того, при автонумерации с помощью C#-скрипта удаление записей не повлияет на присваиваемые порядковые номера.

  1. На странице администрирования приложения выберите пункт «Переменные».
  2. Создайте переменную со следующими свойствами:

    • НазваниеПорядковый номер
    • Типчисло
    • Значение1
  3. В шаблоне записи «Заявки» создайте и поместите на форму атрибут «Номер заявки» типа «Число».

  4. В шаблоне процесса «Оформление заявки» добавьте задачу-выполнение сценария сразу после начального события.
  5. В свойствах задачи-выполнения сценария на вкладке «Дополнительные» добавьте следующий 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);
    }
    }
  6. Опубликуйте диаграмму.

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

  1. Создайте экземпляр процесса.
  2. В поле атрибута «Номер заявки» должен отобразиться её порядковый номер.
  3. В свойствах переменной «Порядковый номер» значение должно увеличиться на 1.

Автонумерация с помощью C#-скрипта в сценарии

C#-скрипт также можно применять для автонумерации в сценариях.

При автонумерации с помощью C#-скрипта удаление записей не повлияет на присваиваемые порядковые номера.

  1. На странице администрирования приложения выберите пункт «Переменные».
  2. Создайте переменную со следующими свойствами:

    • НазваниеПорядковый номер
    • Типчисло
    • Значение1
  3. В шаблоне записи «Заявки» создайте и поместите на форму атрибут «Номер заявки» типа «Число».

  4. Создайте новый сценарий «Автонумерация» и настройте его событие:

    • Тип: создание записи;
    • Контекстный шаблон записи: Заявки.
  5. Добавьте действие «Изменить значения скриптом» со следующими свойствами:

    • Атрибут: Номер заявки
    • Операция со значениями: заменить
    • Значение: 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. Создайте экземпляр записи в шаблоне «Заявки».
  2. В поле атрибута «Номер заявки» должен отобразиться её порядковый номер.
  3. В свойствах переменной «Порядковый номер» значение должно увеличиться на 1.

Автонумерация с помощью выражения N3

Для автонумерации записей также можно использовать выражение N3. При этом удаление записей не повлияет на присваиваемые порядковые номера.

  1. На странице администрирования приложения выберите пункт «Переменные».
  2. Создайте переменную со следующими свойствами:

    • НазваниеПорядковый номер
    • Типчисло
    • Значение1
  3. В шаблоне записи «Заявки» создайте и поместите на форму атрибут «Номер заявки» типа «Число».

  4. Создайте новый сценарий «Автонумерация» и настройте его событие:

    • Тип: создание записи
    • Контекстный шаблон записи: Заявки
  5. Добавьте действие «Изменить значения атрибутов» со следующими свойствами:

    • Атрибут: Номер заявки
    • Операция со значениями: заменить
    • Значение: 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. В поле атрибута «Номер заявки» должен отобразиться её порядковый номер.
  3. В свойствах переменной «Порядковый номер» значение должно увеличиться на 1.
К началу


Номер Статьи: 2607
Размещено: Tue, May 7, 2024
Последнее обновление: Tue, Nov 19, 2024

Online URL: https://kb.comindware.ru/article/avtonumeraciya-zapisej-s-pomoshyu-formuly-c-skripta-ili-vyrazheniya-n3-2607.html