Уникальный номер документа

  • Автор темы DNT
  • Дата начала
D

DNT

Необходимо каждому новому документу в БД присваивать номер: 1, 2, 3, ... n.
Номер этот должен содержаться в поле формы. Номер должен быть уникальным.
Как это делается правильно?

Я сделал так:

Sub Postopen(Source As Notesuidocument)
Dim session As New NotesSession
Dim doc As NotesDocument
Set db = session.CurrentDatabase
Set view = db.GetView( "wEnter" )
Set doc = source.document
If doc.Code(0)=0 Then
If view.TopLevelEntryCount=0 Then
doc.rgCode=1 ' первому присваиваем 1
End If
If view.TopLevelEntryCount>0 Then
Set doc2 = view.GetLastDocument
doc.rgCode2=doc2.rgCode2(0)+1 'берем номер последнего и
'увеличиваем на 1
End If
End If
End Sub

Работает неправильно: если один юзер открыл документ но еще не сохранил его (редактирует), то если в это время кто-то еще создает новый документ то код будет совпадать!!!!!!!


КАК ЭТО ПРАВИЛЬНО РАЗРУЛИТЬ????
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
Надо при первом сохранении (в QuerySave) номер присваивать.
 
D

Domino6

<!--QuoteBegin-DNT+31:01:2006, 13:11 -->
<span class="vbquote">(DNT @ 31:01:2006, 13:11 )</span><!--QuoteEBegin-->КАК ЭТО ПРАВИЛЬНО РАЗРУЛИТЬ????
[snapback]29956" rel="nofollow" target="_blank[/snapback]​
[/quote]

Ситуация мертвая изначально

1,2,3,4 .... N в распределенных многопользовательских системах никогда не будет уникальным

Вариант решений: Использовать регистрационную уникальность или пониженную уникальность.

Пониженная уникальность.
1. @UNIQUE
2. №-User где User - префиксная уникальная часть для каждого пользователя
3. №-Date где Date уникальность от даты, ну что-то вида 653 (6-год 5-я неделя 3 день и т.д.)

Регистрационная уникальность
1. Регистрировать в одном месте. Агентов в базе на 1 сервере


Каждый из способо имеет свои преимущества и недостатки
 
D

DNT

<!--QuoteBegin-Domino6+31:01:2006, 13:56 -->
<span class="vbquote">(Domino6 @ 31:01:2006, 13:56 )</span><!--QuoteEBegin-->Ситуация мертвая изначально

1,2,3,4 .... N в распределенных многопользовательских системах никогда не будет уникальным
[snapback]29959" rel="nofollow" target="_blank[/snapback]​
[/quote]

А как насчёт (Счётчик) в Access? Хотя там таблицы... Но всё же.
Задача - сделать аналог. База просто служит для регистрации документов, каждому присваевается код, код сложный, состоит из нескольких составляющих одна из которых и есть номер документа по порядку в БД. Если ситуация мертвая то мне придётся её оживить :) .
 
D

Domino6

<!--QuoteBegin-DNT+31:01:2006, 14:20 -->
<span class="vbquote">(DNT @ 31:01:2006, 14:20 )</span><!--QuoteEBegin-->А как насчёт (Счётчик) в Access?
[snapback]29961" rel="nofollow" target="_blank[/snapback]​
[/quote]
Сделай в нем 2-3 регистраторов и посмотриш. Как и во всех РСУДБ там используется reqnum т.е. номер записи

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

НО
- это будет работать только в том случае если база имеется только на одном сервере, как только поставиш вторую реплику связ проверки последнего(или колличества) потерятся и надо будет думать о новом механизме

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

По-этому мое мнение сковзная нумерация аттавизм однопользовательских систем (Fox Access Exel и т.п.)
 
D

DNT

Ок. Буду делать по простому.

п.с. Нашим ментам такой прогресс не грозит :) .
 
G

GROMILA

хочу добавить еще один способ, который аналогичен счетчику из РСУБД, но реализован на лотусе.

Код писать лень, объясню на пальцах принцип:

Программно создаешь документ с полем form="Счетчик1"
В этом документе заводишь поле RegNum путем присвоения целочисленного стартового значения. Далее используешь этот документ для организации монопольного доступа для наращивания значения +1.
Такой доступ достигается вызовом
notesDocument.Save(False,False)

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

Далее логику самого наращивания номера при многопользовательском доступе
мы когда-то один раз запрогали, искать далеко, извиняй.
 
D

DNT

2 GROMILA

Спасибо, у меня тоже была такая мысль использовать доп. форму как "буфер" для хранения значения счетчика. Буду пробовать, но это как-то коряво. Код выложу потом - кому-то пригодится.
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
<!--QuoteBegin-DNT+1:02:2006, 09:27 -->
<span class="vbquote">(DNT @ 1:02:2006, 09:27 )</span><!--QuoteEBegin-->Спасибо, у меня тоже была такая мысль использовать доп. форму как "буфер" для хранения значения счетчика. Буду пробовать, но это как-то коряво. Код выложу потом - кому-то пригодится.
[snapback]29997" rel="nofollow" target="_blank[/snapback]​
[/quote]
Корява любая попытка сделать последовательные уникальные номера, как сказал Domino6.
Сам я использую как раз этот метод. Для работы с несколькими серверами можно использовать блокирование документов. Но, при непостоянной или нарушенной связи, будут проблемы.
 
G

GROMILA

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

DNT

<!--QuoteBegin-GROMILA+2:02:2006, 19:12 -->
<span class="vbquote">(GROMILA @ 2:02:2006, 19:12 )</span><!--QuoteEBegin-->Метод документов-счетчикой позволяет достигать настраиваемости оных в любом количестве: нужен счетчик - заводи.
На базе сортированных видов это делать менее гибко, ведь нужно в дизайне вид заводить или модифицировать, а тут все счетчики как на ладони, даже формат счетчика можно настраивать как угодно.
[snapback]30054" rel="nofollow" target="_blank[/snapback]​
[/quote]

А мог бы примерчик скинуть?
 
D

DNT

В общем на основании всего вышесказанного я сделал счетчик используя поле в другом документе (настроечном). Вот :

...
Set db = session.CurrentDatabase
Set view = db.GetView( "(SetupHide)" )
If view.TopLevelEntryCount=0 Then
Messagebox "Нет документа настройки!", 48,"Свяжитесь с администратором!"
End
End If
If view.TopLevelEntryCount>0 Then
Set setupdoc = view.GetLastDocument
Set doc = nd.document
count = setupdoc.count(0) 'взял значение cчётчика
setupdoc.count=count+1 'увеличил значение cчётчика
Call setupdoc.save (True,True,True) 'сохранил счетчик
doc.rgCode2=count+1 ' вставляем номер в документ
End If
...


Вроде пашет. Если кто-то видет ошибку в таком подходе - не останьтесь равнодушными....
 
D

Duedev

Я обычно делаю счетчики, с помощью профильных документов...
По-моему очень удобно...
 
D

Domino6

<!--QuoteBegin-Duedev+6:02:2006, 18:39 -->
<span class="vbquote">(Duedev @ 6:02:2006, 18:39 )</span><!--QuoteEBegin-->Я обычно делаю счетчики, с помощью профильных документов...
По-моему очень удобно...
[snapback]30221" rel="nofollow" target="_blank[/snapback]​
[/quote]
Профили не реплецируются и кешируются.
Для 2-х реплик достоверность вызывает сомнения
Если регистраторов несколько повтор счетчика с вероятностью 20%
 
V

Veselinka

Еще есть вариант - 2 этапной нумерации:
При создани документа в распределенной ситеме использовать один из описанных выше способов генерации номера.

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

Domino6

<!--QuoteBegin-Veselinka+7:02:2006, 06:58 -->
<span class="vbquote">(Veselinka @ 7:02:2006, 06:58 )</span><!--QuoteEBegin-->Потом на выбранном сервере ночью запускать агента, который проверяет номерацию - то есть находит дубли пришедшие с разных реплик и создает новый номер для каждого дубля.
[snapback]30236" rel="nofollow" target="_blank[/snapback]​
[/quote]

Ага и номер поменяется а пользователь после регистрации его распечатал а сервер ночью номер поменял и как быть?
 
G

Guest

<!--QuoteBegin-Domino6+6:02:2006, 17:56 -->
<span class="vbquote">(Domino6 @ 6:02:2006, 17:56 )</span><!--QuoteEBegin-->Профили не реплецируются и кешируются.
[snapback]30222" rel="nofollow" target="_blank[/snapback]​
[/quote]

...но если каждый работает с одной и той же базой на сервере, то это неплохой вариант...
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
<!--QuoteBegin-Guest+7:02:2006, 15:02 -->
<span class="vbquote">(Guest @ 7:02:2006, 15:02 )</span><!--QuoteEBegin-->...но если каждый работает с одной и той же базой на сервере, то это неплохой вариант...
[snapback]30273" rel="nofollow" target="_blank[/snapback]​
[/quote]
От кеширования это не спасет. Один раз чуть умом не тронулся, пока искал почему же удаленные поля появляются вновь.
Потом вспомнил про кеширование...
 
G

GROMILA

DTN
Проверь при многоплользовательской работе, ожидая в дебагере .
потом перечитай мои сообщения еще раз :)
особенно обрати внимание на функцию Save
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!