Не пойму как работает Isuidocopen

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

  1. Medevic

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

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

    Очередная проблема.
    Хочу сделать, чтобы при изменении поля в родительском документе, менялись поля в дочерних. И перед изменением дочернего проверяю, не открыт ли он на редактирование. Использую свойство NotesDocument.IsUIDocOpen.
    И то ли я не правильно делаю, то ли еще что-то, но оно не работает нормально.
    Сначала проверял в PostSave. Потом кнопку сделал. И ничего.
    При этом, вчера оно нормально работало !
    Вот код:
    Код (Text):
    Sub Click(Source As Button)
    Dim ws As New NotesUIWorkspace
    Dim dc As NotesDocumentCollection
    Dim doc As NotesDocument

    Set dc = ws.CurrentDocument.Document.Responses
    Set doc = dc.GetFirstDocument  
    While Not doc Is Nothing
    f = doc.IsUIDocOpen
    If f=False Then
    '...
    Else
    '...
    End If
    Set doc = dc.GetNextDocument(doc)
    Wend
    End Sub
    Но иногда в дебаггере работает. Но не пойму почему.
     
  2. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Все. Выяснил проблему. Это свойство работает только для текущего документа. А то, что мне надо, надо делать вручную через дополнительное поле.
    Лотус, как всегда, на высоте.
     
  3. nor

    nor Гость

    Medevic
    Ты все неправильно делаешь. Если документ открывается другим пользователем (на другом компьютере), то такой документ блокируется. Поэтому необходимо проверять именно это свойство документа, а не IsUIDocOpen.
     
  4. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Для: nor
    Документ блокируется, но можно изменить через скрипт back-end документ, что приведет к конфликту. Поэтому надо проверить, не открыт ли он. Сейчас сделал через LockHolders.

    А про IsUIDocOpen. В хелпе явно не сказано, что работает с текущим документом. И из-за этого очень долго не мог понять, где неправильно.
     
  5. Domino6

    Domino6 Гость

    <!--QuoteBegin-Medevic+30:06:2005, 08:25 -->
    <span class="vbquote">(Medevic @ 30:06:2005, 08:25 )</span><!--QuoteEBegin-->А про IsUIDocOpen. В хелпе явно не сказано, что работает с текущим документом. И из-за этого очень долго не мог понять, где неправильно.
    [snapback]21792" rel="nofollow" target="_blank[/snapback]​
    [/quote]

    Ну какже не сказано а для кого написано UI (userInterface). Получи ответный документ через UI класс и все работает, ты ведь его через backend береш и по-этому не получается.
     
  6. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--QuoteBegin-Domino6+30:06:2005, 09:17 -->
    <span class="vbquote">(Domino6 @ 30:06:2005, 09:17 )</span><!--QuoteEBegin-->Ну какже не сказано а для кого написано UI (userInterface). Получи ответный документ через UI класс и все работает, ты ведь его через backend береш и по-этому не получается.
    [snapback]21793" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Да. Все это написано. Так я думал, можно по back-end документу узнать открыт ли он в front-end (например, кем-то другим). А UI класс документа мне недоступен.

    Явно в хелпе про это не сказано. И я понял не так.
     
  7. Domino6

    Domino6 Гость

    <!--QuoteBegin-Medevic+30:06:2005, 09:45 -->
    <span class="vbquote">(Medevic @ 30:06:2005, 09:45 )</span><!--QuoteEBegin-->Явно в хелпе про это не сказано. И я понял не так.
    [snapback]21794" rel="nofollow" target="_blank[/snapback]​
    [/quote]

    В хелпе сказанно есть фронедн и бакенд классы там и карта есть. Распечатай ее сразу бутет видно как можно переходит между классами для использования методами и свойствами и видно кто и откуда наследуется.

    Я для 4-ки сам блокировку писал
    1.способ: внесение итема при редактированиии
    2.способ: бросал в папку
    3. создание документа блокировки в специальной базе
     
  8. yerke

    yerke Well-Known Member

    Регистрация:
    28 авг 2007
    Сообщения:
    392
    Симпатии:
    0
    так бекграунд агент никак не может узнать
    что
    обрабатываемый агентом бекенд док, открыт в УИ (в режиме чтения)?

    (агент и док находятся в одной базе в одной реплике)
     
  9. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    yerke
    наврят, ведь в бэк-ендных агентах "запрещёно" использовать УИ функции
     
  10. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    может :icq: сделать самому - при открытии в ЮИ писать в очередь...
     
  11. yerke

    yerke Well-Known Member

    Регистрация:
    28 авг 2007
    Сообщения:
    392
    Симпатии:
    0
    IsUIDocOpen не уи функция )))

    Добавлено:
    ой лень писать обработчик информации об информации ))
     
  12. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    она не будет "работать" без ЮИ (ибо смысла без оного не несёт)
     
  13. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    явно не заявлена как УИ - согласен , но без УИ никак

    Read-only. Indicates whether a NotesDocument object (back-end document) is accessed through a NotesUIDocument object (front-end document).

    а обработчик и УИ - это всё у пользователя? или агент на сервере?
     
  14. yerke

    yerke Well-Known Member

    Регистрация:
    28 авг 2007
    Сообщения:
    392
    Симпатии:
    0
    агент на сервере
     
  15. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    так тут IsUIDocOpen не поможет, надо писать отдельный обработчик

    или открывать документы только в режиме редактирования ( лочить )
    или в диалоге ( только чтение ).
     
  16. maliy

    maliy Well-Known Member

    Регистрация:
    20 мар 2007
    Сообщения:
    135
    Симпатии:
    1
    Dim db As New NotesDatabase( "", "" )
    db.OpenByReplicaID(имя сервера, реплика )

    Set doc = db.GetDocumentByUNID (Unid)
    If kdoc.IsUIDocOpen Then
    Msgbox " сработало"
    End if
    Не срабатывает, но если получают БД так:
    Set db = ns.CurrentDatabase
    Set doc = db.GetDocumentByUNID (Unid)
    If doc.IsUIDocOpen Then
    Msgbox " сработало"
    End if
    срабатывает
    Почему так?
    P.S. задача стоит как в этой теме http://codeby.net/forum/threads/48676/, но правильного решения не нашел.
     
  17. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    @maliy,
    обновить у пользователя документ на экране, если кто-то другой внес в него изменения? "На лету"?
     
  18. maliy

    maliy Well-Known Member

    Регистрация:
    20 мар 2007
    Сообщения:
    135
    Симпатии:
    1
    Открываю документ номер 1, потом открываю документ номер 2, и далее если в документе номер 2 нажать кнопку 2 , то запускается агент(выполняет определенные действия), и сразу же в этой кнопке 2 проверялось - если doc1.IsUIDocOpen
    то закрываю этот док и открываю заново. Это работало когда документ номер 1 и номер 2 - были в одной и той же базе , и получив БД таким способом Set db = ns.CurrentDatabase . Все отрабатывало как нужно. На данный момент логика немного поменялась, и документ номер 1, и документ номер 2 могут быть в разных базах, поэтому я стал использовать
    Dim db As New NotesDatabase( "", "" )
    db.OpenByReplicaID(имя сервера, реплика )

    Но метод doc1.IsUIDocOpen перестал срабатывать.
     
  19. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    естественно, потому что при переполучении базы все объекты-наследники убиваются, а тут именно переопределение идет.
    Сначала объект создается пустой - New NotesDatabase( "", "" )
    И только затем его переопределяют: db.OpenByReplicaID
    Думаю базу лучше не переполучать, только документ из нее.
    Если оставлять такой же подход, то:
    Объект базы надо сделать глобальным в рамках формы, если это в форме.
    Перед определением проверить db на Nothing, если база не существует, то определить её, если существует - оставить как есть.
    Затем получить документ из базы.
     
  20. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    самый вариант для Static
     
    2 пользователям это понравилось.
Загрузка...

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