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

Тема в разделе "Lotus - Программирование", создана пользователем San40S, 14 май 2009.

  1. San40S

    San40S Well-Known Member

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

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    В нижнем фрейме Content: URL - Computed в формате
    Код (Text):
    Notes://SERVER/CZZZ753500290C7C/0/B4F383FA7F754EEAC225757600484ZZZ?OpenDocument
    , который смотрит параметр из профайла/энваромента/документа.
    Это параметр ты заполняешь под своей кнопкой, которая раньше открывала документ.
    После заполнения параметра шмальнуть
    Код (Text):
    notesUIWorkspace.ReloadWindow
    .
    Вроде всё.
     
  3. San40S

    San40S Well-Known Member

    Регистрация:
    15 апр 2009
    Сообщения:
    69
    Симпатии:
    0
    А что означают параметры (СЕРВЕР и ОпенДокумент - понятно, а остальное??):
    Код (Text):
    Notes://SERVER/CZZZ753500290C7C/0/B4F383FA7F754EEAC225757600484ZZZ?OpenDocument
     
  4. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    CZZZ753500290C7C = replicaid базы документа, который ты хочешь показать.
    0 - вообще, UNID default view из базы. Можно смело заменить на 0.
    B4F383FA7F754EEAC225757600484ZZZ - UNID документа, который ты хочешь показать.
     
  5. K-Fire

    K-Fire Гость

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

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    А вот это надо проверить.
    Может быть и беда будет :rolleyes:
    Не подумал.
     
  7. San40S

    San40S Well-Known Member

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

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

    K-Fire Гость

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

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    San40S, всё правильно говоришь.

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

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

    San40S Well-Known Member

    Регистрация:
    15 апр 2009
    Сообщения:
    69
    Симпатии:
    0
    Notes://SERVER/CZZZ753500290C7C/0/B4F383FA7F754EEAC225757600484ZZZ?OpenDocument
    что такое "Notes://"?

    В общем у меня вышло следующее:
    Код (Text):
    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: '/'
    ---------------------------
    ОК
    ---------------------------
     
  11. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    тебе надо как стринг это слепить:
    Код (Text):
    srv := @Environment("Esrv");
    db := @Environment("Edbfile");
    uid := @Environment("Euid");
    {Notes://} + srv + {/} + db + {/0/} + uid + {?OpenDocument}
     
  12. San40S

    San40S Well-Known Member

    Регистрация:
    15 апр 2009
    Сообщения:
    69
    Симпатии:
    0
    За вот это спасибо, больше не ругается...
    В общем, написал формулу в URL Фрейма. При открытии основного документа, ругается, что не находит путь к серверу и нижний фрейм - пустой :(

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

    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Update:
    Не вышло у меня так как делал, но... нашел еще один выход:
    Код (Text):
    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
    Перед открытием доп. документа, просто указывает фрейм в котором открыть, а после открытия можно обратно переназначить фрейм и все :)

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

    susinmn Well-Known Member

    Регистрация:
    16 окт 2007
    Сообщения:
    530
    Симпатии:
    8
    Set newdoc = ДополнительнаяБД.GetDocumentByUNID(res)
    если newdoc is Nothing, то будет error(скажет, что не корректный UNID). ставь обработчика
     
  14. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Кстати да, чёт я про settargetframe ваще не подумал.
    Наверно, потому что не практикую.
     
  15. San40S

    San40S Well-Known Member

    Регистрация:
    15 апр 2009
    Сообщения:
    69
    Симпатии:
    0
    так там есть:
    Код (Text):
    If newdoc Is Nothing Then
    Msgbox "Дополнительный документ не найден", 16, "Ошибка"

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

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

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Код (Text):
    If newdoc Is Nothing Then Msgbox "Дополнительный документ не найден", 16, "Ошибка"
    Это не проверка :)

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

    San40S Well-Known Member

    Регистрация:
    15 апр 2009
    Сообщения:
    69
    Симпатии:
    0
    Упс... точно, я перепутал с GetDocumentByID

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

    я написал так:
    Код (Text):
    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
    но не уверен корректно ли, хотя оно и работает :)
     
  18. K-Fire

    K-Fire Гость

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

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

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

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    В такой конструкции немаловажно сбрасывать 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]
     
  20. K-Fire

    K-Fire Гость

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

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

Поделиться этой страницей