Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите с табличным счётчиком внутри группы.  [new]
e-raven
Member

Откуда:
Сообщений: 91
MS SQL Server 2000 8.00.2055. Нужна помощь в организации счётчика-идентификатора записей, нумерующего записи в таблице в пределах групп. Задача следующая: имеется журнал входных документов, в котором используется непрерывная нумерация документов в пределах календарного месяца. То есть каждый месяц нумерация начинается с 1, месяц + порядковый номер документа являются идентификатором документа. В месяц фиксируется порядка 10 000 документов, вносят данные несколько операторов. Основные требования: 1) непрерывность нумерации, то есть максимальный номер в месяце должен равняться количеству документов (записей) в этом месяце; 2) минимизация очередей (блокировок), так как данные вносятся в основном одновременно несколькими операторами. Ну, и чем меньше кода при этом, тем лучше.
29 июл 12, 11:27    [12930797]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с табличным счётчиком внутри группы.  [new]
step_ks
Member

Откуда:
Сообщений: 936
e-raven
Основные требования: 1) непрерывность нумерации, то есть максимальный номер в месяце должен равняться количеству документов (записей) в этом месяце;
Т.е. удалений документов не бывает?
e-raven
2) минимизация очередей (блокировок), так как данные вносятся в основном одновременно несколькими операторами. Ну, и чем меньше кода при этом, тем лучше.
При 10 000 документах в месяц, которые заносятся операторами ручками, об ожиданиях при блокировках счетчика можно особо и не париться.
29 июл 12, 11:39    [12930815]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с табличным счётчиком внутри группы.  [new]
e-raven
Member

Откуда:
Сообщений: 91
step_ks
Т.е. удалений документов не бывает?

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

step_ks
При 10 000 документах в месяц, которые заносятся операторами ручками, об ожиданиях при блокировках счетчика можно особо и не париться.

Дело в том, что данные о документах вносятся, как правило, в последние дни месяца и делают это одновременно около 20 человек.
29 июл 12, 11:53    [12930832]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с табличным счётчиком внутри группы.  [new]
aleks2
Guest
e-raven
То есть каждый месяц нумерация начинается с 1, месяц + порядковый номер документа являются идентификатором документа.


Правильный выриант:
1. Identity в таблицу и не мучайтесь.
2. Непрерывность вам не обеспечить.

Неправильный вариант:
1. Оставляем номер пустым.
2. Имеем процесс-job, который нумерует-заполняет пустые номера по-порядку.
3. Логика остального должна быть готова к отсутствию номера в течение некоторого периода.
29 июл 12, 11:59    [12930842]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с табличным счётчиком внутри группы.  [new]
qwerty112
Guest
e-raven
Удаления бывают, но высвобождаемый номер используется для другого документа.

и как должно выполнится это условие
автор
1) непрерывность нумерации, то есть максимальный номер в месяце должен равняться количеству документов (записей) в этом месяце;

если документ №1 был удалён ПОСЛЕ внесения ВСЕХ документов этого же месяца ?
29 июл 12, 12:13    [12930864]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с табличным счётчиком внутри группы.  [new]
step_ks
Member

Откуда:
Сообщений: 936
e-raven
step_ks
При 10 000 документах в месяц, которые заносятся операторами ручками, об ожиданиях при блокировках счетчика можно особо и не париться.

Дело в том, что данные о документах вносятся, как правило, в последние дни месяца и делают это одновременно около 20 человек.
Ну, допустим, все 10000 вносятся за 4 дня. Тогда 10000/4/20 = 125 документов в день одному оператору, что примерно 15 документов в час (при 8 - часовом рабочем дне). Все равно копейки.
29 июл 12, 12:34    [12930899]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с табличным счётчиком внутри группы.  [new]
e-raven
Member

Откуда:
Сообщений: 91
При удалении документа запись не удаляется, а обнуляется. Образовавшаяся "пустая" запись заполняется при внесениии очередного документа. Ввод, редактирование и удаление данных возможны только до определённого момента времени, затем месяц "закрывается" и данные за этот период становятся доступными только на чтение.
Ранее данные располагались в Access, где для каждого месяца заводилась отдельная таблица со счётчиком. При переходе на SQL-сервер решено было "слить" все таблицы Access в одну, оставив при этом прежнюю методику учёта документов.
29 июл 12, 15:33    [12931342]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с табличным счётчиком внутри группы.  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
e-raven,

А если оператор ошибся и создал лишний документ и это обнаружилось, когда уже все документы введены?

Нумеруйте все документы при закрытии периода, если вам так уж важна непрерывная нумерация (непонятно, правда, зачем).
29 июл 12, 15:51    [12931375]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с табличным счётчиком внутри группы.  [new]
ksv55
Member

Откуда:
Сообщений: 93
e-raven,
В бухгалтерских системах обычно имеется таблица учетных периодов:
ИД, начало_периода, конец_периода, открыт/закрыт, прочая информация
Можно создать такую таблицу, а к данным приписать атрибут ИД_периода.
Номера вычислять.
29 июл 12, 15:56    [12931383]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с табличным счётчиком внутри группы.  [new]
rector
Member

Откуда: Киев
Сообщений: 57
e-raven,

Я себе вижу это так:
Вам необходимо не удалять запись, а, например, помечать к удалению.
Делаете флаг, который помечает запись, как Deleted, при вставке следующего документа, проверяете, есть ли записи, помеченные этим флагом. Если да - берёт первую попавшуюся и перезаписываете.
Если таких записей нет - вставляете новую запись.

Есть еще вариант - использовать свою систему нумерации (не identity поле)

создаем таблицу типа:

CREATE TABLE #tmp
(
	Id INT IDENTITY,
	DocNumder INT,
	DATA VARCHAR (100)
)


INSERT INTO #tmp
(
	DocNumder,
	[DATA]
)
SELECT 1,'First'
UNION ALL
SELECT 2, 'Second'
UNION ALL
SELECT 4, 'Fourth'


записи с номером 3 нет - она удалена.

при вставке - сверяем нумерацию и выбираем первую запись с отсутствующим номером:

WITH cte as (
			SELECT ROW_NUMBER()OVER (order by DocNumder) AS RowNum 
			FROM #tmp t
) 

SELECT top 1 RowNum FROM cte
left JOIN #tmp t3 ON cte.RowNum=t3.DocNumder
WHERE t3.DocNumder IS NULL


ну и т.д.

Однако тут минус в том, что это придется делать каждый раз при вставке, Row_number будет проходить по всей таблице и создавать тормоза.


Это вам просто к размышлению.
Поддерживаю вариант с пересчетом нумерации по окончанию периода.
29 июл 12, 16:00    [12931387]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с табличным счётчиком внутри группы.  [new]
e-raven
Member

Откуда:
Сообщений: 91
to invm
Требуется идентификатор документа сразу же после его ввода, а не по окончании периода. Как я уже отмечал, в Access каждому месяцу соответствовала отдельная таблица со счётчиком. Таким образом, множество документов имеют теперь одинаковые ID, которые в связке с годом и месяцем "засветились" во многих местах базы.

to rector
MS SQL Server 2000
29 июл 12, 16:21    [12931431]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с табличным счётчиком внутри группы.  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
e-raven
to invm
Требуется идентификатор документа сразу же после его ввода, а не по окончании периода.
Тогда тем более интересен ответ на вопрос:
invm
А если оператор ошибся и создал лишний документ и это обнаружилось, когда уже все документы введены?
29 июл 12, 16:39    [12931462]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с табличным счётчиком внутри группы.  [new]
aleks2
Guest
e-raven
to invm
Как я уже отмечал, в Access каждому месяцу соответствовала отдельная таблица со счётчиком.

А теперь расскажи нам сказку: как ты в Access обеспечивал непрерывность?
29 июл 12, 19:17    [12931718]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с табличным счётчиком внутри группы.  [new]
прежнюю методику
Guest
e-raven
Ранее данные располагались в Access, где для каждого месяца заводилась отдельная таблица со счётчиком. При переходе на SQL-сервер решено было "слить" все таблицы Access в одну, оставив при этом прежнюю методику учёта документов.

ранее было все отлично? ничего не трогайте.
автор
При переходе на SQL-сервер решено было "слить" все таблицы в одну

собственно, для чего и был придуман sql server. сливать таблицы в одну.
займитесь чем-нибудь действительно имеющим значение.
29 июл 12, 19:37    [12931758]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с табличным счётчиком внутри группы.  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8877
При развитии системы будет проблема с удалёнными поза-поза-поза-вчерашними документами. Если документы удалять нельзя (и дыр в нумерации ну ни как не образуется), то смело заворачивайте вставку в транзакцию с прибавлением к максимальному номеру из таблицы единицы с блокировкой таблицы - и будет вам щасте.
30 июл 12, 03:46    [12932537]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с табличным счётчиком внутри группы.  [new]
e-raven
Member

Откуда:
Сообщений: 91
aleks2
А теперь расскажи нам сказку: как ты в Access обеспечивал непрерывность?

Непрерывность не я обеспечивал, а Access. Вероятность отмены вставки маловероятна, так как структура таблицы простая, а данные перед вставкой проверяются на корректность, так что счётчик тут подходил как нельзя лучше. В любом случае таблица при закрытии периода всегда проверяется и "причёсывается", после чего становится архивной (без возможности правки).

invim
А если оператор ошибся и создал лишний документ и это обнаружилось, когда уже все документы введены?

Документы, о которых идёт речь являются актами о выполненных работах, повторный внос данных невозможен, так как при вводе в отдельной таблице делается отметка о том, что от такого-то клиента акт был уже сдан (от одного клиента - один акт).

прежнюю методику
собственно, для чего и был придуман sql server. сливать таблицы в одну.

А я думал, этот форум был придуман, чтобы высказываться по существу. При переносе на SQL-сервер таблицы решено слить, так как в отличие от Access на SQL-сервере невозможно использовать динамические запросы (отсутствует доступ к таблицам), да и заводить каждый месяц новую таблицу как-то некомильфо.
30 июл 12, 12:43    [12933939]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с табличным счётчиком внутри группы.  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
e-raven
в отличие от Access на SQL-сервере невозможно использовать динамические запросы (отсутствует доступ к таблицам), да и заводить каждый месяц новую таблицу как-то некомильфо.

О, просто ахринеть, может букварики почитаете ?
30 июл 12, 12:50    [12933996]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с табличным счётчиком внутри группы.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
e-raven
в отличие от Access на SQL-сервере невозможно использовать динамические запросы (отсутствует доступ к таблицам).
Вы не поверите, но это не так.
В SQL 2005 появился синтаксис EXECUTE AS
30 июл 12, 12:51    [12934003]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с табличным счётчиком внутри группы.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
e-raven
в отличие от Access на SQL-сервере невозможно использовать динамические запросы (отсутствует доступ к таблицам).
Вы не поверите, но это не так.
В SQL 2005 появился синтаксис EXECUTE AS
Ой!
Я упуcтил из виду, что у Вас SQL2000
30 июл 12, 12:51    [12934008]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с табличным счётчиком внутри группы.  [new]
aleks2
Guest
e-raven
aleks2
А теперь расскажи нам сказку: как ты в Access обеспечивал непрерывность?

Непрерывность не я обеспечивал, а Access. Вероятность отмены вставки маловероятна, так как структура таблицы простая, а данные перед вставкой проверяются на корректность, так что счётчик тут подходил как нельзя лучше.


1. Ну дык, "Счетчик Access" = "Identity MS SQL".
И не парьте нам мозги.

2. Ну разучи, штоль, вычисляемое поле?
30 июл 12, 13:38    [12934419]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с табличным счётчиком внутри группы.  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
e-raven,

Заведите себе таблицу-генератор номеров.
30 июл 12, 13:48    [12934500]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с табличным счётчиком внутри группы.  [new]
а что если
Guest
e-raven,

не сложно заблокировать таблицы и выбрать максимальный или поискать удаленный номер (конечно чтоб поиск удаленных работал быстро, лучше не удалять а помечать как удаленные)
но что если ...
в конце месяца оказалось, что удаленных документов больше, чем нужно еще внести, ... дыры-то останутся
30 июл 12, 14:48    [12934987]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с табличным счётчиком внутри группы.  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8877
а что если
e-raven,

не сложно заблокировать таблицы и выбрать максимальный или поискать удаленный номер (конечно чтоб поиск удаленных работал быстро, лучше не удалять а помечать как удаленные)
но что если ...
в конце месяца оказалось, что удаленных документов больше, чем нужно еще внести, ... дыры-то останутся


Не... туда подписанные акты выполненных работ е6ашат. Удалений у них быть не должно в принципе. Так что begin tran select @newUnicum = max(unicum) + 1 from Tabletka with (holdlock, например) where year = @year and month = @month; insert into Tabletka (year, month, unicum,...) select @year, @month, @newUnicum,... commit tran

муйня короче
30 июл 12, 15:16    [12935199]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить