|
автоматическая нумерация
|
|||
---|---|---|---|
#18+
Добрый день всем. Думаю многие сталкивались с подобной задачей. Необходима автоматическая нумерация документов. Проблема в том, что при использовании подобного кода возможны коллизии - параллельные сессии могут создать одинаковые номера. Код: plsql 1. 2.
В таблице хранятся документы различных видов разных отделов, у каждого своя нумерация в зависимости от даты и другие условия, т.е приходящий на ум вариант использования sequences нахожу проблематичным. Я изобрел конечно свой 'велосипед', но возможно есть какие-то базовые решения? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2020, 14:27 |
|
автоматическая нумерация
|
|||
---|---|---|---|
#18+
Привет, у меня есть табличка rms_request_seq из одного поля last_number и тогда следующий код гарантирует уникальность и автоувеличение на 1 при любом количестве сессий Код: plsql 1. 2. 3. 4. 5. 6. 7.
в переменной num_doc - новый номер для документа ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2020, 14:35 |
|
автоматическая нумерация
|
|||
---|---|---|---|
#18+
Vlad074, 1) вместо SELECT MAX(NOMER)+1 FROM DOCUMENTS where otdel=xxx ф-ция каторая в автономке увеличмвает счетчик будут дырки 2) дипозитарий номеров (+повторная выдача номеров/дырки) ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2020, 14:38 |
|
автоматическая нумерация
|
|||
---|---|---|---|
#18+
Nickname, update ... returning ... ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2020, 15:02 |
|
автоматическая нумерация
|
|||
---|---|---|---|
#18+
Stax, что ТС подразумевает под "своей" не оговоренно ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2020, 15:08 |
|
автоматическая нумерация
|
|||
---|---|---|---|
#18+
STFF пакет для нумерации "без дырок" ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2020, 15:10 |
|
автоматическая нумерация
|
|||
---|---|---|---|
#18+
Stax ф-ция каторая в автономке увеличмвает счетчик будут дырки Если сначала создавать документ и уже существующему присваивать номер, то вероятность дырок минимальна. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2020, 15:16 |
|
автоматическая нумерация
|
|||
---|---|---|---|
#18+
123йй STFF пакет для нумерации "без дырок" Избавиться от дырок адекватно только средствами СУБД не получится. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2020, 15:22 |
|
автоматическая нумерация
|
|||
---|---|---|---|
#18+
Vlad074Думаю многие сталкивались с подобной задачей. Необходима автоматическая нумерация документов. Да. И обычным результатом является вывод: "автоматическая нумерация документов не нужна". Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2020, 15:46 |
|
автоматическая нумерация
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov обычным результатом является вывод: "автоматическая нумерация документов не нужна". Странный вывод. Если непрерывная нумерация требуется для ситуаций типа бланка строгой отчетности, то нумерация нужна. Однако задачу неизменно ставят именно в указанном убогом виде "хочу непрерывную нумерацию что бы я не делал", я это постановка не вполне адекватна. Есть альтернативные варианты, например - можно вести перечень бракованный (аннулированных) номерных документов, которые и заполняют те самые "дырки". Ну и, разумеется, присваивание номера имеет смысл осуществлять уже сформированному объекту по завершении проверок, процесс можно назвать "регистрация нового документа". ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2020, 16:03 |
|
автоматическая нумерация
|
|||
---|---|---|---|
#18+
andrey_anonymousЕсли непрерывная нумерация требуется для ситуаций типа бланка строгой отчетности, то нумерация нужна. Но не автоматическая, а ручная, с записью в "журнале регистрации бланков строгой отчётности". Возможно даже бумажном. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2020, 16:05 |
|
автоматическая нумерация
|
|||
---|---|---|---|
#18+
Vlad074 В таблице хранятся документы различных видов разных отделов, у каждого своя нумерация в зависимости от даты и другие условия В этом случае нужно отличать номер документа, присваиваемый человеком, и автоматически генерируемый ID, который используется только как ключ в БД и человеку никогда не показывается. Это 2 разных поля . ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2020, 03:39 |
|
автоматическая нумерация
|
|||
---|---|---|---|
#18+
Если у каждого отдела своя нумерация, то разве sequence на каждый отдел не решит проблему? Это конечно предполагает что отдел:номер являются уникальным индексом, что может создать проблему коллизий при слиянии отделов. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2020, 03:44 |
|
автоматическая нумерация
|
|||
---|---|---|---|
#18+
sequence на каждый отдел не решит, т.к. не обеспечит "хочу непрерывную нумерацию что бы я не делал" ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2020, 04:11 |
|
автоматическая нумерация
|
|||
---|---|---|---|
#18+
НеофитSQL разве sequence на каждый отдел не решит проблему? Мусорка получится, потому как отделов может быть масса, они могут появляться, расформировываться и т.п. Даёшь каждому работнику по сиквенсу! И ещё запасной вдобавок, чтоб наверняка. Гы. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2020, 05:44 |
|
автоматическая нумерация
|
|||
---|---|---|---|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2020, 06:14 |
|
автоматическая нумерация
|
|||
---|---|---|---|
#18+
Synoptic, а в ето время в соседней сессии ... ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2020, 08:31 |
|
автоматическая нумерация
|
|||
---|---|---|---|
#18+
1). Создать таблицу, в которой нужно хранить код отдела, год и последний выданный номер. 2). Написать автономную функцию, которая по переданному в нее коду отдела и году обновляет последний выданный номер в таблице и возвращает его. 3). Вместо обращения к сиквенсу использовать обращение к этой функции. 4). Если надо номер "без дырок", то в пункте 1 придется хранить не только последний, но все номера. При этом надо будет сделать перекрестные ссылки строки документа на строку в этой таблице (и наоборот) по составному ключу "код+год+номер". ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2020, 09:12 |
|
автоматическая нумерация
|
|||
---|---|---|---|
#18+
Ни "Max(X)+1", ни хранение в таблице не обеспечит уникальность, поскольку в рамках одной транзакции вы не увидите новые значения, записанные другой транзакцией (например, вашего коллеги). Поэтому для решения задачи единственным вариантом является использование надтранзакционных механизмов, а именно Sequences. Во избежание ошибок, уникальное значение из Sequence необходимо присваивать только тогда, когда документ уже сформирован, например, перед печатью документа или перед его электронным подписыванием. Для решения проблемы "Уникальный номер отдела", придётся в БД создавать для каждого отдела свой Sequence и, например в триггере по коду отдела определять требуемый Sequence. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2020, 10:10 |
|
автоматическая нумерация
|
|||
---|---|---|---|
#18+
Кстати, для скважности и отдела, и в целом предприятия, в свое время использовал такие номера например : "123.4", где 123 - последовательность предприятия, 4 - последовательность отдела. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2020, 10:21 |
|
автоматическая нумерация
|
|||
---|---|---|---|
#18+
zeon11 Поэтому для решения задачи единственным вариантом является использование надтранзакционных механизмов, а именно Sequences. а если подумать ? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2020, 10:22 |
|
автоматическая нумерация
|
|||
---|---|---|---|
#18+
Спасибо всем за ответы. В итоге я пришел к такому же варианту, как в первом ответе - через SELECT FOR UPDATE. Перед этим хранил последние номера в таблице сохраняя через автономную функцию (как в ответе #2). Но с ростом данных в ней - у каждого отдела куча типов документов и каждый месяц начинается новый отсчет - пришел к первому варианту. Смущало только что есть таблица, данные в которой не нужны, а используется только для блокировки в SELECT FOR UPDATE - думал какие еще есть варианты. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2020, 11:52 |
|
автоматическая нумерация
|
|||
---|---|---|---|
#18+
В порядке бреда. Нужно ли хранить номер документа в таблице? Документы из базы удаляются или помечаются как удалённые? К чему я это. Создать таблицу с обычным сквозным ID на всю таблицу. Создать представление, где добавить поле вида: Код: sql 1.
Рабочего оракла под рукой сейчас нет. Надеюсь правильно всё написал. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2020, 12:22 |
|
|
start [/forum/topic.php?fid=52&fpage=36&tid=1880875]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
44ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
others: | 306ms |
total: | 453ms |
0 / 0 |