Умирает notesdocument

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

  1. Cheburan

    Cheburan Member

    Регистрация:
    23 фев 2015
    Сообщения:
    18
    Симпатии:
    0
    Здравствуйте.
    Гибнет NotesDocument, примерно в вот таком случае:
    есть библиотека
    Код (LotusScript):
    'Script Library 'TEST'
    Option Public
    Option Declare
     
    Use "GetDatabase"
     
    Sub testDbObj( param List As Variant )
        Dim db As NotesDatabase
        Dim doc As NotesDocument
     
        Set db = getSomeDb()
        Set doc = db.Getdocumentbyunid( "6F51A2A353115418C2257F6A0035127A" )
        MsgBox "testDbObj " & (doc Is nothing)
        Set param("123") = doc
    End Sub
    и кнопка на форме
    Код (LotusScript):
    Sub Click(Source As Button)
        Dim param List As Variant
        Dim var As Variant
     
        Redim var(0)
        var(0) = "123"
        param("123") = var
        Call testDbObj( param )
        Msgbox "Click " & (param("123") Is Nothing)
    End Sub
    Функция getSomeDb из SL GetDatabase возвращает NotesDatabase - берет из представления документ с настройками о том где лежит база и создает объект.

    При нажатии получаем следующие сообщения:
    testDbObj False
    Click True

    Таким образом NotesDocument умер. Бывают и другие примеры подобного поведения. Кто-то сталкивался с таким? Как лечить, или может где-то описана причина такого поведения?
     
  2. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    @Cheburan,
    Dim db As NotesDatabase заменить на Static db As NotesDatabase
    У Вас объект базы уничтожается при выходе из функции testDbObj.
     
  3. Cheburan

    Cheburan Member

    Регистрация:
    23 фев 2015
    Сообщения:
    18
    Симпатии:
    0
    Спасибо. А если это метод класса? Т.е. если сам метод модификации списка принадлежит классу и получение NotesDatabase происходит через вызов функции класса?
     
    #3 Cheburan, 23 май 2016
    Последнее редактирование модератором: 23 май 2016
  4. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    или обьявить базу в глобале, чтобы она не уничтожалась
     
  5. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    время жизни объекта БД д.б. больше времени жизни объектов из него полученных
    я, обычно, объявляю Private db As NotesDatabase
    и в конструкторе инициализирую
    [DOUBLEPOST=1464009783,1464009557][/DOUBLEPOST]это еще один гвоздь в гроб подхода процедурного стиля кодирования
    там где легаси - придется затыкать через Static или глобальную в либе
    и да, при глобальной db она д.б. Public иначе теже грабли
     
  6. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Лучше глобальная private-переменная - список БД. В таком случае переменная и public-функция получения БД одни для всего остального кода базы.
     
  7. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    так и до класса не далече ;)
     
  8. rinsk

    rinsk Lotus team
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    799
    Симпатии:
    78
    чур я - за класс! :)
    стараюсь где можно избавится от явного получения set db= и юзаю конструкцию из 2-х классов -
    первый типа public DataModelClassBase -
    Базовый класс представляет собой контейнер, который возвращает все необходимые базы
    'и представления приложения. и второй - Public Class DataModelMH As DataModelClassBase
    пользовательские ф-ции и в этой же библе обьявляется public переменная Public MH As DataModelMH
     
  9. oshmianski

    oshmianski Достойный программист
    Lotus team

    Регистрация:
    25 апр 2012
    Сообщения:
    521
    Симпатии:
    13
    так а без них никуда.
    у меня статические DbManager и ViewManager с кешем внутри.
     
Загрузка...

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