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

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

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
Все. Выяснил проблему. Это свойство работает только для текущего документа. А то, что мне надо, надо делать вручную через дополнительное поле.
Лотус, как всегда, на высоте.
 
N

nor

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

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
Для: nor
Документ блокируется, но можно изменить через скрипт back-end документ, что приведет к конфликту. Поэтому надо проверить, не открыт ли он. Сейчас сделал через LockHolders.

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

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 береш и по-этому не получается.
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
<!--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 класс документа мне недоступен.

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

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. создание документа блокировки в специальной базе
 
Y

yerke

так бекграунд агент никак не может узнать
что
обрабатываемый агентом бекенд док, открыт в УИ (в режиме чтения)?

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

morpheus

yerke
наврят, ведь в бэк-ендных агентах "запрещёно" использовать УИ функции
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
471
может :icq: сделать самому - при открытии в ЮИ писать в очередь...
 
Y

yerke

yerke
наврят, ведь в бэк-ендных агентах "запрещёно" использовать УИ функции

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

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

morpheus

IsUIDocOpen не уи функция )))
явно не заявлена как УИ - согласен , но без УИ никак

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

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

maliy

Green Team
20.03.2007
180
2
BIT
76
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/, но правильного решения не нашел.
 

maliy

Green Team
20.03.2007
180
2
BIT
76
Открываю документ номер 1, потом открываю документ номер 2, и далее если в документе номер 2 нажать кнопку 2 , то запускается агент(выполняет определенные действия), и сразу же в этой кнопке 2 проверялось - если doc1.IsUIDocOpen
то закрываю этот док и открываю заново. Это работало когда документ номер 1 и номер 2 - были в одной и той же базе , и получив БД таким способом Set db = ns.CurrentDatabase . Все отрабатывало как нужно. На данный момент логика немного поменялась, и документ номер 1, и документ номер 2 могут быть в разных базах, поэтому я стал использовать
Dim db As New NotesDatabase( "", "" )
db.OpenByReplicaID(имя сервера, реплика )

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

savl

Lotus Team
28.10.2011
2 624
314
BIT
541
Но метод doc1.IsUIDocOpen перестал срабатывать.
естественно, потому что при переполучении базы все объекты-наследники убиваются, а тут именно переопределение идет.
Сначала объект создается пустой - New NotesDatabase( "", "" )
И только затем его переопределяют: db.OpenByReplicaID
Думаю базу лучше не переполучать, только документ из нее.
Если оставлять такой же подход, то:
Объект базы надо сделать глобальным в рамках формы, если это в форме.
Перед определением проверить db на Nothing, если база не существует, то определить её, если существует - оставить как есть.
Затем получить документ из базы.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
471
Объект базы надо сделать глобальным в рамках формы, если это в форме.
Перед определением проверить db на Nothing, если база не существует, то определить её, если существует - оставить как есть.
самый вариант для Static
 
  • Нравится
Реакции: savl
Мы в соцсетях:

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