Порядковый номер

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

  1. Erick

    Erick Гость

    У меня есть текстовое вычисляемое поле №. Формат: 001. Каждая следующая запись должна содержать след. порядковый номер (002, 003, 004 и т.д.). Как это можно реализовать?
    Заранее благодарен.
     
  2. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
  3. Erick

    Erick Гость

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

    Но значения у меня пишутся в таком формате: 1, 2, 3 и т.д., а надо 001, 002,003 и т.д. Как это можно исправить?
     
  4. Erick

    Erick Гость

    В приведённой выше ссылке два примера работают не правильно. В первом примере, если открывать форму только для добавления, то всё работает ок. Но если у меня к примеру есть 2 документа, я открываю для редактирования первый, то в поле № у меня стоит значение 3.
    Второй пример ещё похлеще. При каждом открытии формы счётчик увеличивается на 1. :)
    Так что тема пока не закрыта. Первый пример вроде бы ничего, но как решить проблему, ведь одна и таже форма используется и для добавления и для редактирования, а код находится в postopen?
     
  5. DNT

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

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    <!--QuoteBegin-Erick+28:02:2006, 22:54 -->
    <span class="vbquote">(Erick @ 28:02:2006, 22:54 )</span><!--QuoteEBegin-->В приведённой выше ссылке два примера работают не правильно. В первом примере, если открывать форму только для добавления, то всё работает ок. Но если у меня к примеру есть 2 документа, я открываю для редактирования первый, то в поле № у меня стоит значение 3.
    Второй пример ещё похлеще. При каждом открытии формы счётчик увеличивается на 1. :eek:
    Так что тема пока не закрыта. Первый пример вроде бы ничего, но как решить проблему, ведь одна и таже форма используется и для добавления и для редактирования, а код находится в postopen?
    [snapback]31245" rel="nofollow" target="_blank[/snapback]​
    [/quote]

    Код взятый тобой для анализа неправильный по многим причинам (там в топике всё расписано).
    Нужно пользоваться профильным документом.
    У меня есть реальная база работающая с таким алгоритмом:
    ...
    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
    ...

    setupdoc - профильный документ в котором содержится счетик
     
  6. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--QuoteBegin-DNT+1:03:2006, 13:35 -->
    <span class="vbquote">(DNT @ 1:03:2006, 13:35 )</span><!--QuoteEBegin-->Нужно пользоваться профильным документом.
    [snapback]31275" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Наоборот, ни в коем случае. Лучше создать отдельный документ для номера, чем пользоваться профильным.
     
  7. DNT

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

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    <!--QuoteBegin-Medevic+1:03:2006, 14:26 -->
    <span class="vbquote">(Medevic @ 1:03:2006, 14:26 )</span><!--QuoteEBegin-->Наоборот, ни в коем случае. Лучше создать отдельный документ для номера, чем пользоваться профильным.
    [snapback]31280" rel="nofollow" target="_blank[/snapback]​
    [/quote]

    А в чём разница??? Профильный документ (в моем случае) это просто документ с полем счетчика.
     
  8. Erick

    Erick Гость

    Для: DNT Код у тебя где написан? В postopen?
    Если да, то как ты различаешь, происходит создание документа или редактирование? И вообще, зачем отдельный документ для номера, если можно номер получить из последнего документа представления?
     
  9. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--QuoteBegin-DNT+1:03:2006, 14:42 -->
    <span class="vbquote">(DNT @ 1:03:2006, 14:42 )</span><!--QuoteEBegin-->А в чём разница??? Профильный документ (в моем случае) это просто документ с полем счетчика.
    [snapback]31282" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Разница в том, что профильные документы кешируются. И не факт, что ты получишь верные данные когда будет считывать значения.
    Сам на это натыкался. Плюс на форуме IBM по лотусу про это постоянно говорят. Как попугаи.
     
  10. DNT

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

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    <!--QuoteBegin-Erick+1:03:2006, 14:46 -->
    <span class="vbquote">(Erick @ 1:03:2006, 14:46 )</span><!--QuoteEBegin-->Для: DNT Код у тебя где написан? В postopen?
    Если да, то как ты различаешь, происходит создание документа или редактирование? И вообще, зачем отдельный документ для номера, если можно номер получить из последнего документа представления?
    [snapback]31283" rel="nofollow" target="_blank[/snapback]​
    [/quote]

    Да, в postopen.

    ...

    If uidoc.IsNewDoc Then

    ...

    Else

    ...
     
  11. DNT

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

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    <!--QuoteBegin-Medevic+1:03:2006, 14:26 -->
    <span class="vbquote">(Medevic @ 1:03:2006, 14:26 )</span><!--QuoteEBegin-->Наоборот, ни в коем случае. Лучше создать отдельный документ для номера, чем пользоваться профильным.
    [snapback]31280" rel="nofollow" target="_blank[/snapback]​
    [/quote]

    А что тогда "отдельный документ для номера"? И почему он не кешируется.
     
  12. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Для: DNT
    А если я не захочу документ сохранять ? То номер в профильном документе все равно увеличится ?
     
  13. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--QuoteBegin-DNT+1:03:2006, 14:54 -->
    <span class="vbquote">(DNT @ 1:03:2006, 14:54 )</span><!--QuoteEBegin-->А что тогда "отдельный документ для номера"? И почему он не кешируется.
    [snapback]31287" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Обычный документ. Просто создай по отдельной форме. Создай представление с выбором по этой форме. Из него потом будешь документ выбирать.
    Обычные документы не кешируются.
     
  14. Erick

    Erick Гость

    Для: DNT Хорощо, у тебя в postopen вычисляется и заносится знаение в поле №. Как при редактировании сделать так, чтобы в поле № заносился номер документа, который ты редактируешь?
     
  15. Erick

    Erick Гость

    К примеру, в представлении есть 2 документа. При создании нового документа, в поле № будет значение 3. Если в этом коде использовать If uidoc.IsNewDoc Then ' увеличение счётчика на единицу Else ' ничего не делаем. Тогда, если нужно отредактировать первый документ, то, естественно, увеличение счётчика не произойдет, но в поле № будет 2, а не 1.
     
  16. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--QuoteBegin-Erick+1:03:2006, 15:08 -->
    <span class="vbquote">(Erick @ 1:03:2006, 15:08 )</span><!--QuoteEBegin-->If uidoc.IsNewDoc Then ' увеличение счётчика на единицу Else ' ничего не делаем.
    [snapback]31291" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Все понятно. А что будет если я стану создавать новый документ, а потом передумаю и закрою его не сохранив ? Или электичество вырубят ? Как я понимаю, значение счетчика все равно увеличится.
     
  17. DNT

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

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    <!--QuoteBegin-Medevic+1:03:2006, 14:54 -->
    <span class="vbquote">(Medevic @ 1:03:2006, 14:54 )</span><!--QuoteEBegin-->Для: DNT
    А если я не захочу документ сохранять ? То номер в профильном документе все равно увеличится ?
    [snapback]31288" rel="nofollow" target="_blank[/snapback]​
    [/quote]

    Да, с этим лажа. просто не знаю как бороться. Как то сдесь поднимал эту тему, ждал реальных примеров, проблема номарации, то не редкая, - не дождался и сделал как сделал. Работает. Пользователи знают об этом баге. Смирились. Если предложите вариант решения получше - скажу спасибо!
     
  18. Erick

    Erick Гость

    Для: Medevic Нет, если № считывать по последнему документу в представлении. А вот если использовать дополнительный документ со счётчиком, то да.
     
  19. DNT

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

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    <!--QuoteBegin-Erick+1:03:2006, 15:08 -->
    <span class="vbquote">(Erick @ 1:03:2006, 15:08 )</span><!--QuoteEBegin-->К примеру, в представлении есть 2 документа. При создании нового документа, в поле № будет значение 3. Если в этом коде использовать If uidoc.IsNewDoc Then ' увеличение счётчика на единицу Else ' ничего не делаем. Тогда, если нужно отредактировать первый документ, то, естественно, увеличение счётчика не произойдет, но в поле № будет 2, а не 1.
    [snapback]31291" rel="nofollow" target="_blank[/snapback]​
    [/quote]

    Сэр, если у тебя не новый документ ( Else) то ничего делать не надо!!! Поле останется таким как при сохранении.
     
Загрузка...

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