English version

Общие сведения

Сервис нумераторов предназначен для проведения автоматического заполнения полей персистентных объектов с использованием порядковой нумерации.

Нумератор в win-приложении

Нумератор в win-приложении

 

Нумератор в web-приложении

Нумератор в web-приложении

Возможности нумераторов

При автоматическом заполнении полей сервис нумераторов предоставляет следующие возможности:

  • установка начального значения индекса (StartValue) и шага (Step)
  • установка шаблона номера (Template)
  • сквозная нумерация (ThroughNumeration): cквозная нумерация применяется для последовательного нумерования объектов различных типов. Например, все исходящие документы (накладные, платежки и пр.) должны использовать одну цепочку номеров
  • использование удаленных номеров (UseDeleteNumbers): использование удаленных номеров предполагает, что все номера нумератора будут использованы. Если какой-то объект удаляется, то его номер не пропадает, а используется при очередном обращении к сервису нумераторов

Подключение нумераторов

Для использования сервиса нумераторов необходимо подключить к приложению модуль Xafari.BC.Numerators. При подключении этого модуля производится инициализация сервиса нумераторов, в результате которой считываются настройки из модели приложения и создаются соответствующие объекты нумераторов и их привязки. Сервис нумераторов автоматически подключается ко всем DetailView и выполняется для всех операций создания и удаления объектов в этом DetailView. Автоматическое исполнение нумераторов для операций с персистентными объектами за пределами DetailView не производится. Нумератор применяется только для свойств с пустым значением. Настройка сервиса может производиться как на этапе разработки приложения, так и на этапе внедрения приложения у пользователя.

Настройка нумератора в модели приложения

Для настройки нумератора в модели приложения необходимо:

  1. Создать и настроить нумератор в Project Editor
  2. Привязать нумератор к свойству персистентного объекта

В модели приложения нумераторы размещаются в узле Application|Xafari|Numerators. Новый нумератор добавляется командой Add контекстного меню узла. При создании нового нумератора все его свойства заполняются значениями по умолчанию.

Новый нумераторв узле Numerators

Новый нумераторв узле Numerators

Настройка шаблона

Для описания шаблонов в свойствах нумератора применяются правила форматирования строк для DevExpress.Persistent.Base.ObjectFormatter. В качестве {0}-го параметра передается объект, для которого применяется нумератор. Например, шаблон {0:Custmer.Name}, применимый к объекту Order, в качестве значения вернет имя Заказчика, на которого ссылается Заказ. Если в шаблоне присутствует формат {0:}, то вместо него будет подставлено очередное значение индекса нумератора. Значение индекса может быть отформатировано по правилам форматирования чисел, описанных в Custom Numeric Format Strings. В этом случае формат будет иметь вид {0:,numericFormat}, где numericFormat – формат очередного индекса. Например, шаблон {0:,000000}, применимый к объекту Order, в качестве значения вернет строку 000010.

Настройка использования удаленных номеров

Для использования механизма удаленных номеров нумеруемый объект должен поддерживать интерфейс Xafari.BC.Numerators.IDeletedNumbersSupport.

Привязка нумератора к объекту

Для привязки нумератора к свойству персистентного объекта необходимо добавить к узлу Application|BOModel|Class|Numerators узел NumeratorLink командой Add контекстного меню и заполнить все его атрибуты:

Привязка нумератора к объекту

Привязка нумератора к объекту

  • ApplyOnCreate – признак применения нумератора при создании нового объекта
  • Index – порядковый номер привязки, влияет на последовательность применения нумераторов
  • Numerator – ссылка на нумератор
  • Property – имя нумеруемого свойства объекта
Замена нумератора в классе-наследнике

Возможна ситуация, когда свойство базового класса персистентного объекта уже пронумеровано. В этом случае соответствующее поле класса-наследника будет использовать тот же нумератор.

Нумератор в базовом классе

Нумератор в базовом классе

Если необходимо в наследнике заменить нумератор базового класса, то соответствующему свойству класса-наследника следует назначить новый нумератор. В частности, Xafari.BC.Numerators.SkipNumerator просто отменяет использование нумератора для свойства класса-наследника.

Замена нумератора в классе-наследнике

Замена нумератора в классе-наследнике

Использование нумераторов в коде

При необходимости использовать собственный уникальный алгоритм нумерации или собственный формат шаблонов можно реализовать нумератор в коде и добавить его в модель.
Пример 1:
[code]namespace Xafari.Northwind { public class OrderNumerator : CustomNumerator { public OrderNumerator() { this.Template = "{0:,000000}"; } public override string CreateNumber(IXPObject obj) { return base.CreateNumber(obj); } } }[/code]
Пример 2:
[code]public void Test1()
{
NumeratorBase numerator = new OrderNumerator();
NumeratorManager.Instance.AddNumerator(numerator);
NumeratorManager.Instance.AddLink(new NumeratorLink(numerator, typeof(Order), "Number"));
ObjectSpace space = this.Application.CreateObjectSpace();
Order order = space.CreateObject();
NumeratorManager.Instance.ApplyNumerators(order, true);
Assert.IsNull(order.Number); NumeratorManager.Instance.ApplyNumerators(order, false);
Assert.AreEqual("000001", order.Number); space.CommitChanges();
}[/code]

Диаграмма классов

Диаграмма классов

Диаграмма классов

NumeratorBase – базовый класс для всех нумераторов DefaultNumerator – внутренний класс используется для реализации нумераторов, объявленных через модель приложения CustomNumerator – базовый класс для пользовательских нумераторов. SkipNumerator – служебный нумератор используется для отмены нумерации свойств в классах-наследниках.