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

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
2
#1
Привет всем.

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

Что это ? :)
Lotus team
10.12.2004
3 346
2
#2
Все. Выяснил проблему. Это свойство работает только для текущего документа. А то, что мне надо, надо делать вручную через дополнительное поле.
Лотус, как всегда, на высоте.
 
N

nor

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

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
2
#4
Для: nor
Документ блокируется, но можно изменить через скрипт back-end документ, что приведет к конфликту. Поэтому надо проверить, не открыт ли он. Сейчас сделал через LockHolders.

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

Domino6

Гость
#5
<!--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

Что это ? :)
Lotus team
10.12.2004
3 346
2
#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

Гость
#7
<!--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

Well-Known Member
28.08.2007
392
0
#8
так бекграунд агент никак не может узнать
что
обрабатываемый агентом бекенд док, открыт в УИ (в режиме чтения)?

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

morpheus

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

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 483
360
#10
может :icq: сделать самому - при открытии в ЮИ писать в очередь...
 

yerke

Well-Known Member
28.08.2007
392
0
#11
yerke
наврят, ведь в бэк-ендных агентах "запрещёно" использовать УИ функции
IsUIDocOpen не уи функция )))

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

morpheus

скриптописец
07.08.2006
3 915
1
#13
явно не заявлена как УИ - согласен , но без УИ никак

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

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

maliy

Well-Known Member
20.03.2007
159
1
#16
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/, но правильного решения не нашел.
 

maliy

Well-Known Member
20.03.2007
159
1
#18
Открываю документ номер 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

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

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 483
360
#20
Объект базы надо сделать глобальным в рамках формы, если это в форме.
Перед определением проверить db на Nothing, если база не существует, то определить её, если существует - оставить как есть.
самый вариант для Static