+1
Answered

как настроить автонумерацию

Здравствуйте!

Создала новый класс для регистрации исходящих писем. Завела атрибут Номер, но незнаю как сделать, чтобы нумерация новым письмам присваивалась автоматически. Где это задается?

Answer

Answer
Answered
Здравствуйте, Анна!

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

Первый - замещение номера уникальным идентификатором записи.
Создать новый атрибут с типом "Вычисляемый":


Будет создан атрибут "Номер", который всегда будет уникальным числом. 
Минус данного метода - нумерация не всегда последовательная. Например, если запись была создана и ей присвоен очередной номер, а потом удалена, то следующей записи будет присвоен уже следующий номер, а не тот, который был у удаленной записи.

Второй - добавление в базу данных триггера интеллектуальной нумерации.

Ниже представлен готовый код этого триггера, который необходимо выполнить на Вашей базе данных через интерфейс SQL Server Managment Studio (открыть окно нового запроса и вставить это код). Так же можно скачать файл с кодом - SetNumber.sql
Перед тем, как выполнять триггер необходимо создать текстовый атрибут с именем Номер. 

Перед выполнение данного кода в него необходимо внести изменения - адаптировав к Вашему классу и атрибуту нумерации.
  1. Заменить YYY на номер класса (в примере на скриншоте выше это цифра 87), что бы получилось Attr87.
  2. Заменить XXX на номер атрибута (в примере на скриншоте выше это цифра 388), что бы получилось p388.
IF EXISTS (SELECT name FROM sysobjects WHERE  name = N'AttrYYY_Number' AND type = 'TR') DROP TRIGGER AttrYYY_Number 

GO
CREATE TRIGGER [dbo].[AttrYYY_Number] ON [dbo].[AttrYYY]
with execute as owner
FOR INSERT
AS
BEGIN
if (select trigger_nestlevel())>1 return
set nocount on;
-- Присвоение номера в формате 000001
UPDATE T SET pXXX = (SELECT REPLICATE('0', 6 - DATALENGTH(CAST(isNull(MAX(CAST(LEFT(N.pXXX,6) as int)),0)+1 as varchar))) + CAST(isNull(MAX(CAST(LEFT(N.pXXX,6) as int)),0)+1 as varchar)
FROM AttrYYY N WHERE N.ObjectID <> T.ObjectID and isNumeric(N.pXXX) = 1) FROM AttrYYY T JOIN inserted i ON i.ObjectID = T.ObjectID
END
Данный код осуществляет запись в созданный атрибут следующий по текущему списку номер, т.е. удаленная запись не занимает присвоенный ей ранее номер, и созданная после удаления новая запись получит номер той, которая была удалена. В итоге порядок нумерации не нарушается и является более корректным.

Код данного триггера можно в дальнейшем модифицировать добавляя условия (например каждый год начинать нумерацию заново и пр.).
Answer
Answered
Здравствуйте, Анна!

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

Первый - замещение номера уникальным идентификатором записи.
Создать новый атрибут с типом "Вычисляемый":


Будет создан атрибут "Номер", который всегда будет уникальным числом. 
Минус данного метода - нумерация не всегда последовательная. Например, если запись была создана и ей присвоен очередной номер, а потом удалена, то следующей записи будет присвоен уже следующий номер, а не тот, который был у удаленной записи.

Второй - добавление в базу данных триггера интеллектуальной нумерации.

Ниже представлен готовый код этого триггера, который необходимо выполнить на Вашей базе данных через интерфейс SQL Server Managment Studio (открыть окно нового запроса и вставить это код). Так же можно скачать файл с кодом - SetNumber.sql
Перед тем, как выполнять триггер необходимо создать текстовый атрибут с именем Номер. 

Перед выполнение данного кода в него необходимо внести изменения - адаптировав к Вашему классу и атрибуту нумерации.
  1. Заменить YYY на номер класса (в примере на скриншоте выше это цифра 87), что бы получилось Attr87.
  2. Заменить XXX на номер атрибута (в примере на скриншоте выше это цифра 388), что бы получилось p388.
IF EXISTS (SELECT name FROM sysobjects WHERE  name = N'AttrYYY_Number' AND type = 'TR') DROP TRIGGER AttrYYY_Number 

GO
CREATE TRIGGER [dbo].[AttrYYY_Number] ON [dbo].[AttrYYY]
with execute as owner
FOR INSERT
AS
BEGIN
if (select trigger_nestlevel())>1 return
set nocount on;
-- Присвоение номера в формате 000001
UPDATE T SET pXXX = (SELECT REPLICATE('0', 6 - DATALENGTH(CAST(isNull(MAX(CAST(LEFT(N.pXXX,6) as int)),0)+1 as varchar))) + CAST(isNull(MAX(CAST(LEFT(N.pXXX,6) as int)),0)+1 as varchar)
FROM AttrYYY N WHERE N.ObjectID <> T.ObjectID and isNumeric(N.pXXX) = 1) FROM AttrYYY T JOIN inserted i ON i.ObjectID = T.ObjectID
END
Данный код осуществляет запись в созданный атрибут следующий по текущему списку номер, т.е. удаленная запись не занимает присвоенный ей ранее номер, и созданная после удаления новая запись получит номер той, которая была удалена. В итоге порядок нумерации не нарушается и является более корректным.

Код данного триггера можно в дальнейшем модифицировать добавляя условия (например каждый год начинать нумерацию заново и пр.).
Начиная с версии КлиК: Комплексная конфигурация 3.1 добавлена возможность на пользовательском уровне задавать правила формирования номеров для основных объектов (Договоров, Документов, Первички, Продаж, Проектов). Этот функционал позволяет гибко настраивать в том числе и зависимую нумерацию.