• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

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

San40S

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

Omh

В нижнем фрейме Content: URL - Computed в формате
Код:
Notes://SERVER/CZZZ753500290C7C/0/B4F383FA7F754EEAC225757600484ZZZ?OpenDocument
, который смотрит параметр из профайла/энваромента/документа.
Это параметр ты заполняешь под своей кнопкой, которая раньше открывала документ.
После заполнения параметра шмальнуть
Код:
notesUIWorkspace.ReloadWindow
.
Вроде всё.
 
S

San40S

В нижнем фрейме Content: URL - Computed в формате
Код:
Notes://SERVER/CZZZ753500290C7C/0/B4F383FA7F754EEAC225757600484ZZZ?OpenDocument
, который смотрит параметр из профайла/энваромента/документа.
Это параметр ты заполняешь под своей кнопкой, которая раньше открывала документ.
После заполнения параметра шмальнуть
Код:
notesUIWorkspace.ReloadWindow
.
Вроде всё.

А что означают параметры (СЕРВЕР и ОпенДокумент - понятно, а остальное??):
Код:
Notes://SERVER/CZZZ753500290C7C/0/B4F383FA7F754EEAC225757600484ZZZ?OpenDocument
 
O

Omh

CZZZ753500290C7C = replicaid базы документа, который ты хочешь показать.
0 - вообще, UNID default view из базы. Можно смело заменить на 0.
B4F383FA7F754EEAC225757600484ZZZ - UNID документа, который ты хочешь показать.
 
K

K-Fire

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

Omh

А вот это надо проверить.
Может быть и беда будет :rolleyes:
Не подумал.
 
S

San40S

В нижнем фрейме Content: URL - Computed в формате
Код:
Notes://SERVER/CZZZ753500290C7C/0/B4F383FA7F754EEAC225757600484ZZZ?OpenDocument
, который смотрит параметр из профайла/энваромента/документа.
Это параметр ты заполняешь под своей кнопкой, которая раньше открывала документ.
После заполнения параметра шмальнуть
Код:
notesUIWorkspace.ReloadWindow
.
Вроде всё.

Omh, если я Вас правильно понял, то мне нужно: узнать сервер и бд-файл дополнительной БД; вьюху я так понимаю можно вписать руцями ее название; и еще узнать UnidID документа, который будем открывать из доп. БД. Допустим эти параметры я узнал, как мне их передать в УРЛ фрейма? Заносить эти значения в какие-то поля (например настроечного документа), а потом в УРЛ - брать значения этих полей из настроечного док-а? Так чтоли?

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

K-Fire

В Enviroment удобнее всего их запихивать.
 
O

Omh

San40S, всё правильно говоришь.

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

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

San40S

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: '/'
---------------------------
ОК
---------------------------
 
O

Omh

тебе надо как стринг это слепить:
Код:
srv := @Environment("Esrv");
db := @Environment("Edbfile");
uid := @Environment("Euid");
{Notes://} + srv + {/} + db + {/0/} + uid + {?OpenDocument}
 
S

San40S

За вот это спасибо, больше не ругается...
тебе надо как стринг это слепить:
Код:
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

Перед открытием доп. документа, просто указывает фрейм в котором открыть, а после открытия можно обратно переназначить фрейм и все :)

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

susinmn

Set newdoc = ДополнительнаяБД.GetDocumentByUNID(res)
если newdoc is Nothing, то будет error(скажет, что не корректный UNID). ставь обработчика
 
O

Omh

Кстати да, чёт я про settargetframe ваще не подумал.
Наверно, потому что не практикую.
 
S

San40S

Set newdoc = ДополнительнаяБД.GetDocumentByUNID(res)
если newdoc is Nothing, то будет error(скажет, что не корректный UNID). ставь обработчика

так там есть:
Код:
If newdoc Is Nothing Then
Msgbox "Дополнительный документ не найден", 16, "Ошибка"


Кстати да, чёт я про settargetframe ваще не подумал.
Наверно, потому что не практикую.

Да я о нем и не знал :))
Чисто случайно нашел, попробовал - работает! :(

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

Omh

Код:
If newdoc Is Nothing Then Msgbox "Дополнительный документ не найден", 16, "Ошибка"
Это не проверка :)

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

San40S

Код:
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

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

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

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

TIA

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

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

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

Интересно, как же у меня код тогда работает? :) Я много лет такую конструкцию использую.

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

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