1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление

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

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

  1. Medevic

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

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

    Очередная проблема.
    Хочу сделать, чтобы при изменении поля в родительском документе, менялись поля в дочерних. И перед изменением дочернего проверяю, не открыт ли он на редактирование. Использую свойство NotesDocument.IsUIDocOpen.
    И то ли я не правильно делаю, то ли еще что-то, но оно не работает нормально.
    Сначала проверял в PostSave. Потом кнопку сделал. И ничего.
    При этом, вчера оно нормально работало !
    Вот код:
    Код:
    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

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

    nor Гость

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

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

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

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

    Domino6 Гость

    Репутация:
    0
    <!--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

    Репутация:
    0
    Регистрация:
    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 Гость

    Репутация:
    0
    <!--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

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

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

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

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

    lmike нет, пердело совершенство
    Lotus team

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

    yerke Well-Known Member

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

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

    lmike нет, пердело совершенство
    Lotus team

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

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

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

    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

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

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

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

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

    maliy Well-Known Member

    Репутация:
    0
    Регистрация:
    20 мар 2007
    Сообщения:
    159
    Симпатии:
    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 Well-Known Member
    Lotus team

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

    maliy Well-Known Member

    Репутация:
    0
    Регистрация:
    20 мар 2007
    Сообщения:
    159
    Симпатии:
    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 Well-Known Member
    Lotus team

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

    lmike нет, пердело совершенство
    Lotus team

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

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