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

  • Автор темы Автор темы Medevic
  • Дата начала Дата начала
Проблема в том что я не знаю в какой базе находится документ.
поэтому когда нажимаю кнопку 2 во втором документе я из URL первого документа(передаю агентом), получаю имя сервера и реплику
поэтому и оперирую методами
New NotesDatabase( "", "" )
db.OpenByReplicaID
Unid=GetUnidFromUrl(url) - функция получения Unid документа из URL.
Set doc = db.GetDocumentByUNID (Unid)

P.S. Механизм прост , открываю первый документ Нажимаю кнопку 1 - в переменую окружения заношу его URL, далее открываю второй документ нажимаю кнопку 2 , получаю из переменной окружения URL- первого документа, далее из этого URL получаю имя сервера и реплику(потому как документ номер 1 может быть в другой базе нежели документ номер 2). Далее по имени сервера и реплики получаю базу
New NotesDatabase( "", "" )
db.OpenByReplicaID
и потом уже получаю первый документ, но его нужно переоткрыть (потому как запускается еще агент который меняет определенные поля). Думал вариант при нажатии кнопки 1 в документе 1 закрывать его сразу, а потом открывать, но это не удобно, закрывать документ не нужно, нужно просто переоткрыть открытый.
 
Хотя нет, не надо, не так понял.
Вам и не надо знать в какой базе документ, вам просто не надо переопределять базу.
Исходя из описания задачи: "Документ 1" всегда связан только с одним "документом 2", а не с двумя или с тремя.
Если не так - опишите правильно.
 
Dim url As String
url=ns.GetEnvironmentString("_urls") ' - переменная окружения, содержит Url первого документа, который нужно переоткрыть
Unid=GetUnidFromUrl(url)

'------функция получения Unid
Function GetUnidFromUrl(url As String)
GetUnidFromUrl=Mid(url,Instr(url,"?")-32,32)
End Function
'------
Repl$=GetReplFromUrl(url)'--Получаем реплику БД
Serv$=stripNotesURL(url)'--Получаем имя сервера

'----- функция получения реплики
Function GetReplFromUrl(url As String) As String
GetReplFromUrl=Mid(url,Instr(url,"__")+2,16)
End Function
'-------
'-------функция получения имя сервера
stripNotesURL, честно взята с интернета
link removed

'---------
Dim db As New NotesDatabase( "", "" )
If db.OpenByReplicaID( Serv$, Repl$ )

Документ 1 связан может быть с документом 2, а также с документом 3 , и т.д. и эти документы все могут находится в разных базах.
 
Тогда вот так:
Код:
Dim dbList list as variant ' - объявить в Global формы
Dim db as notesdatabase
 
Serv$=stripNotesURL
Repl$=GetReplFromUrl(url)
UNID = GetUnidFromUrl(url)
 
if IsElement(dbList(Repl$)) then
set Db = dbList(Repl$)
else
Set db = New NotesDatabase( "", "" )
		Call db.OpenByReplicaID(Serv$, Repl$)
set dbList(Repl$) = db
end if
 
Set doc = db.GetDocumentByUNID (Unid)
Суть в том, чтобы кэшировать базы при открытии ссылок
 
нотусятина кэширует инстанс дока (открытого) и только в случае нахождения связи с ним - будет срабатывать doc.IsUIDocOpen
в случае получения интанса БД заново - никакой связи не будет
именно с этим связаны всякие хаки по обновлению инфы в доке (аттачей и РТ) - закрывается интсанс и переоткрывается заново
[DOUBLEPOST=1437729311,1437729231][/DOUBLEPOST]и мне не понятно - почему нельзя переоткрыть док (закрыв прежний)?
 
to . savl,
Ваш код , как я понял, это если идут связи с несколькими документами. В данном случае если начать с простого, связать док 1 и док 2 , то на этой стадии будет:

else
Set db = New NotesDatabase( "", "" )
Call db.OpenByReplicaID(Serv$, Repl$)
set dbList(Repl$) = db
то есть опять будет переопределение.
то есть как сказал тов. lmike:
в случае получения интанса БД заново - никакой связи не будет
 
@maliy, по логике база должна остаться в списке dbList и не исчезнет, а объект db будет переопределяться.
Надо пробовать у меня нет похожей схемы для полного теста, поэтому могу только предложить - пробовать.
 
подскажите как это сделать применительно к мое логике - буду благодарен.
запоминаем RID UNID, закрываем док uidoc.Close(True), получаем инстанс (как и описано), открываем
[DOUBLEPOST=1437737997,1437737911][/DOUBLEPOST]я так понят - претензии к
плюнуть и забыть
 
@maliy, по логике база должна остаться в списке dbList и не исчезнет,
да, если она , база, есть в dbList , но изначально то ее нет, поэтому и не сработает в первый раз.

запоминаем RID UNID, закрываем док uidoc.Close(True), получаем инстанс (как и описано), открываем
--- Добавлено позже: 12 мин. назад, 13 мин. назад ---
я так понят - претензии к
maliy сказал(а): ↑
doc.IsUIDocOpen
плюнуть и забыть
Это если док открыт, тогда закрыли его, и открыли заново, а если док закрыт, мы его принудительно закрыли(ну да ладно, )а мы потом вдруг взяли и открыли его . Вся соль в том чтобы выяснить если док открыт - переоткрыть, если он закрыт - тогда не трогать его.
 
Вся соль в том чтобы выяснить если док открыт - переоткрыть, если он закрыт - тогда не трогать его.
ЗАЧЕМ?
если надо определять открытость дока в ЮИ - используйте очереди, на PO пишите в очередь, при закрытии - удаляйте оттуда
 
1) пользователь, открыл док 1 нажал кнопку, потом окрыл док 2, нажал кнопку. - нужно переоткрыть док.
2)пользователь, открыл док 1 нажал кнопку, закрыл сам док, потом окрыл док 2, нажал кнопку. - док 1 окрывать не нужно.

если надо определять открытость дока в ЮИ - используйте очереди, на PO пишите в очередь, при закрытии - удаляйте оттуда
можно чуть подробнее?
 
Мы в соцсетях:

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