Открыть документ из другой БД

San40S

Well-Known Member
15.04.2009
69
0
#1
Доброго времени суток.
У меня есть две БД - основная и дополнительная.
Опишу процесс и что должно произойти:
В основной БД открываю документ (документ открывается в фреймсете - фреймсет поделен на два фрейма, верхний и нижний)=> в док-е есть кнопка, нажимаю ее => выбирается необходимый документ из дополнительной БД => Открывается документ из дополнительной БД.
Документ из доп. БД открывается в новой вкладке, а мне нужно, чтобы он открывался в нижнем фрейме, типа как дополнение к основному документу.
Подскажите... как заставить открываться доп. док (док в дополнительной БД) в нижнем фрейме основной БД???
 

Omh

Well-Known Member
Lotus team
04.07.2007
2 210
1
37
Латвиджа, Рига
#2
В нижнем фрейме Content: URL - Computed в формате
Код:
Notes://SERVER/CZZZ753500290C7C/0/B4F383FA7F754EEAC225757600484ZZZ?OpenDocument
, который смотрит параметр из профайла/энваромента/документа.
Это параметр ты заполняешь под своей кнопкой, которая раньше открывала документ.
После заполнения параметра шмальнуть
Код:
notesUIWorkspace.ReloadWindow
.
Вроде всё.
 

San40S

Well-Known Member
15.04.2009
69
0
#3
В нижнем фрейме Content: URL - Computed в формате
Код:
Notes://SERVER/CZZZ753500290C7C/0/B4F383FA7F754EEAC225757600484ZZZ?OpenDocument
, который смотрит параметр из профайла/энваромента/документа.
Это параметр ты заполняешь под своей кнопкой, которая раньше открывала документ.
После заполнения параметра шмальнуть
Код:
notesUIWorkspace.ReloadWindow
.
Вроде всё.
А что означают параметры (СЕРВЕР и ОпенДокумент - понятно, а остальное??):
Код:
Notes://SERVER/CZZZ753500290C7C/0/B4F383FA7F754EEAC225757600484ZZZ?OpenDocument
 

Omh

Well-Known Member
Lotus team
04.07.2007
2 210
1
37
Латвиджа, Рига
#4
CZZZ753500290C7C = replicaid базы документа, который ты хочешь показать.
0 - вообще, UNID default view из базы. Можно смело заменить на 0.
B4F383FA7F754EEAC225757600484ZZZ - UNID документа, который ты хочешь показать.
 
K

K-Fire

Гость
#5
Только что будет с верхним фреймом после notesUIWorkspace.ReloadWindow ? :rolleyes:
 

San40S

Well-Known Member
15.04.2009
69
0
#7
В нижнем фрейме Content: URL - Computed в формате
Код:
Notes://SERVER/CZZZ753500290C7C/0/B4F383FA7F754EEAC225757600484ZZZ?OpenDocument
, который смотрит параметр из профайла/энваромента/документа.
Это параметр ты заполняешь под своей кнопкой, которая раньше открывала документ.
После заполнения параметра шмальнуть
Код:
notesUIWorkspace.ReloadWindow
.
Вроде всё.
Omh, если я Вас правильно понял, то мне нужно: узнать сервер и бд-файл дополнительной БД; вьюху я так понимаю можно вписать руцями ее название; и еще узнать UnidID документа, который будем открывать из доп. БД. Допустим эти параметры я узнал, как мне их передать в УРЛ фрейма? Заносить эти значения в какие-то поля (например настроечного документа), а потом в УРЛ - брать значения этих полей из настроечного док-а? Так чтоли?

З.Ы. Прошу прощение, если не правильно мыслю - я не ас в Lotus-e :rolleyes:
 

Omh

Well-Known Member
Lotus team
04.07.2007
2 210
1
37
Латвиджа, Рига
#9
San40S, всё правильно говоришь.

UNID view заменяй на 0, не надо название руцями вписывать.
Т.е. на волшебной кнопке в верхнем документы, ты куда-то, откуда легко достать на формуле, пишешь свежесозданный URL.
В нижнем фрейме вычитываешь этот URL в формуле фрейма.
И делаешь ReloadWindow.

P.s. и смело бодяж на "ты", меня стремует, когда меня на "вы" зовут :rolleyes:
 

San40S

Well-Known Member
15.04.2009
69
0
#10
San40S, всё правильно говоришь.

UNID view заменяй на 0, не надо название руцями вписывать.
Т.е. на волшебной кнопке в верхнем документы, ты куда-то, откуда легко достать на формуле, пишешь свежесозданный URL.
В нижнем фрейме вычитываешь этот URL в формуле фрейма.
И делаешь ReloadWindow.

P.s. и смело бодяж на "ты", меня стремует, когда меня на "вы" зовут :)
Notes://SERVER/CZZZ753500290C7C/0/B4F383FA7F754EEAC225757600484ZZZ?OpenDocument
что такое "Notes://"?

В общем у меня вышло следующее:
Код:
srv := @Environment("Esrv");
db := @Environment("Edbfile");
uid := @Environment("Euid");
Notes://srv/db/0/uid?OpenDocument
но выдает ошибку в этой формуле между srv и db:
---------------------------
Formula Error
---------------------------
Inappropriate (unary) usage of an operator: '/'
---------------------------
ОК
---------------------------
 

Omh

Well-Known Member
Lotus team
04.07.2007
2 210
1
37
Латвиджа, Рига
#11
тебе надо как стринг это слепить:
Код:
srv := @Environment("Esrv");
db := @Environment("Edbfile");
uid := @Environment("Euid");
{Notes://} + srv + {/} + db + {/0/} + uid + {?OpenDocument}
 

San40S

Well-Known Member
15.04.2009
69
0
#12
За вот это спасибо, больше не ругается...
тебе надо как стринг это слепить:
Код:
srv := @Environment("Esrv");
db := @Environment("Edbfile");
uid := @Environment("Euid");
{Notes://} + srv + {/} + db + {/0/} + uid + {?OpenDocument}
В общем, написал формулу в URL Фрейма. При открытии основного документа, ругается, что не находит путь к серверу и нижний фрейм - пустой :(

Я уже незнаю, что делаю не так :(

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Update:
Не вышло у меня так как делал, но... нашел еще один выход:
Код:
Set newdoc = ДополнительнаяБД.GetDocumentByUNID(res)
If newdoc Is Nothing Then
Msgbox "Дополнительный документ не найден", 16, "Ошибка"
Else
[b]Call ws.SetTargetFrame("Bottom")[/b] 
Call ws.EditDocument(False, newdoc)
End If
Перед открытием доп. документа, просто указывает фрейм в котором открыть, а после открытия можно обратно переназначить фрейм и все :)

Но, хотелось бы узнать, нету ли минусов в таком методе???
 

susinmn

Well-Known Member
16.10.2007
529
8
33
Саратов
#13
Set newdoc = ДополнительнаяБД.GetDocumentByUNID(res)
если newdoc is Nothing, то будет error(скажет, что не корректный UNID). ставь обработчика
 

San40S

Well-Known Member
15.04.2009
69
0
#15
Set newdoc = ДополнительнаяБД.GetDocumentByUNID(res)
если newdoc is Nothing, то будет error(скажет, что не корректный UNID). ставь обработчика
так там есть:
Код:
If newdoc Is Nothing Then
Msgbox "Дополнительный документ не найден", 16, "Ошибка"

Кстати да, чёт я про settargetframe ваще не подумал.
Наверно, потому что не практикую.
Да я о нем и не знал :))
Чисто случайно нашел, попробовал - работает! :(

Omh пасиб тебе огромное за помощь!!!
 

Omh

Well-Known Member
Lotus team
04.07.2007
2 210
1
37
Латвиджа, Рига
#16
Код:
If newdoc Is Nothing Then Msgbox "Дополнительный документ не найден", 16, "Ошибка"
Это не проверка :)

Код:
db.GetDocumentByUNID
не возвращает Nothing в случае неправильного UNID'a.
Он возвращает сразу ошибку.
 

San40S

Well-Known Member
15.04.2009
69
0
#17
Код:
If newdoc Is Nothing Then Msgbox "Дополнительный документ не найден", 16, "Ошибка"
Это не проверка :(

Код:
db.GetDocumentByUNID
не возвращает Nothing в случае неправильного UNID'a.
Он возвращает сразу ошибку.
Упс... точно, я перепутал с GetDocumentByID

А GetDocumentByUNID возвращает lsERR_NOTES_BAD_UNID (4091)

я написал так:
Код:
On Error Resume Next
...
...
If Err = lsERR_NOTES_BAD_UNID Then
Call ws.SetTargetFrame("Bottom")
Call ws.EditDocument(False, newdoc)		
Else
Msgbox "Дополнительный документ не найден", 16, "Ошибка"

End If
но не уверен корректно ли, хотя оно и работает :)
 
K

K-Fire

Гость
#18
Гораздо проще писать так:

On Error Resume Next
Set doc = db.getDocumentByUNID()
On Error Goto ErrorHandler
if doc is nothing then .... <тут обрабатываешь>

А еще проще вынести это в отдельную функцию общего назначения, вместо первых 3х строчек будет одна.
 

TIA

:-)
Lotus team
15.05.2009
790
1
#19
Гораздо проще писать так:

On Error Resume Next
Set doc = db.getDocumentByUNID()
On Error Goto ErrorHandler
if doc is nothing then .... <тут обрабатываешь>

А еще проще вынести это в отдельную функцию общего назначения, вместо первых 3х строчек будет одна.
В такой конструкции немаловажно сбрасывать Err в 0. Т.к. любой последующий анализ Err на неравенство 0 будет истинным. Например, в следующем примере будет труднодиагностируемая ошибка из-за её проявления вне локального контекста (даже если оформить отдельной функцией). Doc2 будет Nothing несмотря на корректное его получение, если получение doc было с ошибкой.

[codebox]
On Error Resume Next
Set doc = db.getDocumentByUNID()
On Error Goto ErrorHandler
' *** ЗДЕСЬ НУЖЕН Err = 0 ***
...

On Error Resume Next
Set doc2 = db.getDocumentByUNID()
On Error Goto ErrorHandler
If Err<>0 then Set doc2=Nothing
' *** И ЗДЕСЬ НУЖЕН Err = 0 ***
[/codebox]
 
K

K-Fire

Гость
#20
В такой конструкции немаловажно сбрасывать Err в 0. Т.к. любой последующий анализ Err на неравенство 0 будет истинным. Например, в следующем примере будет труднодиагностируемая ошибка из-за её проявления вне локального контекста (даже если оформить отдельной функцией). Doc2 будет Nothing несмотря на корректное его получение, если получение doc было с ошибкой.
Интересно, как же у меня код тогда работает? :) Я много лет такую конструкцию использую.

В общем набросал тестовый скрипт по быстрому, doc2 получается правильно, никаких ошибок не возникает.