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

Тема в разделе "Lotus - Программирование", создана пользователем DNT, 31 янв 2006.

  1. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    Необходимо каждому новому документу в БД присваивать номер: 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

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


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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Надо при первом сохранении (в QuerySave) номер присваивать.
     
  3. Domino6

    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 сервере


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

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    <!--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? Хотя там таблицы... Но всё же.
    Задача - сделать аналог. База просто служит для регистрации документов, каждому присваевается код, код сложный, состоит из нескольких составляющих одна из которых и есть номер документа по порядку в БД. Если ситуация мертвая то мне придётся её оживить :) .
     
  5. Domino6

    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 и т.п.)
     
  6. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    Ок. Буду делать по простому.

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

    GROMILA Well-Known Member

    Регистрация:
    8 апр 2004
    Сообщения:
    297
    Симпатии:
    0
    хочу добавить еще один способ, который аналогичен счетчику из РСУБД, но реализован на лотусе.

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

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

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

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

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    2 GROMILA

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--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.
    Сам я использую как раз этот метод. Для работы с несколькими серверами можно использовать блокирование документов. Но, при непостоянной или нарушенной связи, будут проблемы.
     
  10. GROMILA

    GROMILA Well-Known Member

    Регистрация:
    8 апр 2004
    Сообщения:
    297
    Симпатии:
    0
    Метод документов-счетчикой позволяет достигать настраиваемости оных в любом количестве: нужен счетчик - заводи.
    На базе сортированных видов это делать менее гибко, ведь нужно в дизайне вид заводить или модифицировать, а тут все счетчики как на ладони, даже формат счетчика можно настраивать как угодно.
     
  11. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    <!--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]

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

    GROMILA Well-Known Member

    Регистрация:
    8 апр 2004
    Сообщения:
    297
    Симпатии:
    0
    Извиняй, я сейчас не могу.
     
  13. DNT

    DNT Постоялец форума
    Lotus team

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

    ...
    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
    ...


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

    Duedev Гость

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

    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%
     
  16. Veselinka

    Veselinka Гость

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

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

    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]

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

    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]

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--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]
    От кеширования это не спасет. Один раз чуть умом не тронулся, пока искал почему же удаленные поля появляются вновь.
    Потом вспомнил про кеширование...
     
  20. GROMILA

    GROMILA Well-Known Member

    Регистрация:
    8 апр 2004
    Сообщения:
    297
    Симпатии:
    0
    DTN
    Проверь при многоплользовательской работе, ожидая в дебагере .
    потом перечитай мои сообщения еще раз :)
    особенно обрати внимание на функцию Save
     
Загрузка...

Поделиться этой страницей