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

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

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
Привет всем.

Очередная проблема.
Хочу сделать, чтобы при изменении поля в родительском документе, менялись поля в дочерних. И перед изменением дочернего проверяю, не открыт ли он на редактирование. Использую свойство 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

Но иногда в дебаггере работает. Но не пойму почему.
 
Все. Выяснил проблему. Это свойство работает только для текущего документа. А то, что мне надо, надо делать вручную через дополнительное поле.
Лотус, как всегда, на высоте.
 
Medevic
Ты все неправильно делаешь. Если документ открывается другим пользователем (на другом компьютере), то такой документ блокируется. Поэтому необходимо проверять именно это свойство документа, а не IsUIDocOpen.
 
Для: nor
Документ блокируется, но можно изменить через скрипт back-end документ, что приведет к конфликту. Поэтому надо проверить, не открыт ли он. Сейчас сделал через LockHolders.

А про IsUIDocOpen. В хелпе явно не сказано, что работает с текущим документом. И из-за этого очень долго не мог понять, где неправильно.
 
<!--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 береш и по-этому не получается.
 
<!--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 класс документа мне недоступен.

Явно в хелпе про это не сказано. И я понял не так.
 
<!--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. создание документа блокировки в специальной базе
 
так бекграунд агент никак не может узнать
что
обрабатываемый агентом бекенд док, открыт в УИ (в режиме чтения)?

(агент и док находятся в одной базе в одной реплике)
 
yerke
наврят, ведь в бэк-ендных агентах "запрещёно" использовать УИ функции
 
может :icq: сделать самому - при открытии в ЮИ писать в очередь...
 
yerke
наврят, ведь в бэк-ендных агентах "запрещёно" использовать УИ функции

IsUIDocOpen не уи функция )))

Добавлено:
может :icq: сделать самому - при открытии в ЮИ писать в очередь...
ой лень писать обработчик информации об информации ))
 
IsUIDocOpen не уи функция )))
явно не заявлена как УИ - согласен , но без УИ никак

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

а обработчик и УИ - это всё у пользователя? или агент на сервере?
 
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. задача стоит как в этой теме https://codeby.net/threads/48676/, но правильного решения не нашел.
 
Открываю документ номер 1, потом открываю документ номер 2, и далее если в документе номер 2 нажать кнопку 2 , то запускается агент(выполняет определенные действия), и сразу же в этой кнопке 2 проверялось - если doc1.IsUIDocOpen
то закрываю этот док и открываю заново. Это работало когда документ номер 1 и номер 2 - были в одной и той же базе , и получив БД таким способом Set db = ns.CurrentDatabase . Все отрабатывало как нужно. На данный момент логика немного поменялась, и документ номер 1, и документ номер 2 могут быть в разных базах, поэтому я стал использовать
Dim db As New NotesDatabase( "", "" )
db.OpenByReplicaID(имя сервера, реплика )

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

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