Функция Не Возвращает Значения Notesdocument

Тема в разделе "Lotus - Программирование", создана пользователем Serduko, 22 янв 2014.

  1. Serduko

    Serduko Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    Добрый день всем, не могу заставить Lotus работать, первый раз с таким сталкиваюсь. Функция не возвращает переменной, Recompile All Lotusscript не помогает.
     

    Вложения:

    • err1.jpg
      err1.jpg
      Размер файла:
      156,7 КБ
      Просмотров:
      136
    • err2.jpg
      err2.jpg
      Размер файла:
      135,8 КБ
      Просмотров:
      152
  2. nayke

    nayke Well-Known Member

    Регистрация:
    4 авг 2010
    Сообщения:
    310
    Симпатии:
    0
    Сталкивался с таким. Проблема была с объявлением Базы. Типа родительская переменная не объявлена в верхней функции - честно точно не помню.

    Решил - передавая не документ а Юнид и получая документ по юниду в верхней функции.
     
  3. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Функиця getPersonByNN, переменная dbPersonal является локальной.
    При выходе из функции она обнуляется и теряется связь с документом.

    Судя по всему код в библиотеке, можно сделать глобальную переменную dbPersonal для всей библиотеки и убрать локальные объявления.
    Иначе полетит что-то другое. Проще говоря - пересмотреть код.

    можно как nayke предложил.
     
  4. Serduko

    Serduko Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    Ага понял, в чем дело. спасибо.
     
  5. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Serduko
    Нет, не все с ней в порядке: переменная локальная, объявлена в функции и "живет" она в рамках ффункции и все объекты полученные от нее живут так же только в рамках функции.
    Когда выходишь из функции все переменные, кроме возвращающего значения - обнуляются.

    Лотус так устроен, что если потерять/обнулить объект базы, то теряется и документ, который из этой базы получен.
    Как только dbPersonal станет Nothing, то документ тоже будет Nothing.

    Получили базу, записали в локальную перменную.
    Получили документ из локальной переменной базы.
    Записали в возвращающее значение документ (по факту это один и тот же объект, а не 2 разных)
    Выходим из функции
    локальные переменные - обнулились.
    Объект базы обнулился, объект документа - обнулился, возвращающее значение тоже обнулилось.

    Сделайте в Declaration перменную: dim dbPersonal2 as notesdatabase
    Она будет глобальной на библиотеку.
    Замените в вашей функции dbPersonal на dbPersonal2
    Проверте работу.
     
  6. Serduko

    Serduko Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    Да, дошло, что ссылка на документ связана с базой, совсем забыл про это.
     
  7. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    можно не глобальную переменную :please:
    а просто Static для БД объекта
     
  8. Serduko

    Serduko Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    А как здесь использовать static в Lotusscript? Не пользовался им, в отличие от javaвского.
     
  9. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Вместо Dim dbPersonal as NotesDatabase надо Static dbPersonal as NotesDatabase
     
  10. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    то что написал savl + зависимо от ситуёвины, если инстанс db м.б. тока один:
    Код (LotusScript):
    Static dbPersonal as NotesDatabase
    ...
    if dbPersonal Is Nothing then Set dbPersonal=...
     
  11. Serduko

    Serduko Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    А в чем преимущество перед глобальной?
     
  12. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    ни в чем.. статические переменные используют внутри функци с целью повторного использования уже полученного значения/объекта..

    лучше вообще глобальностями не пользоваться.. передавайте в функцию ссылку на базу и пользуйтесь ей на здоровье.. к тому же будет понятно откуда пришел объект..
     
  13. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    тем что она локальная :please:
    область видимости:
    -каждой ф-ции м.б. свои долгоживущие объекты, с одинаковым названием
    -не надо плодить в декларэшн кучу переменных
    -глобальные, при "переходе" между модулями - нужно объявлять как Public, иначе повторится ваш случай
    ...
     
  14. Serduko

    Serduko Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    Понятно, спасибо
     
  15. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    В пределах библиотеки не надо делать Public, можно даже Private сделать.
    А для доступа к переменной использовать функцию из библиотеки, которая возвращает объект базы.

    Kee_Keekkenen, lmike
    У меня вопрос по сроку жизни Static. Сколько она живет? Плохо понимаю этот момент.
    Глобальная живет пока пока есть библиотека(если не путаю), а Static?
     
  16. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    по дизайну не всегда это возможно, чаще удобнее передавать кастомный объект (т.е. уже набор параметров)
    да и вовсе, процедурное оформление кода дает свои недостатки ;)

    Добавлено:
    если не сделать Public, и док или вьюшка будут юзаться в к-л либе (а база инициализирована в др.) - повторится фокус с пропаданием объекта, в 7-ке точно (сталкивался)
    со статиком обширных экспериментов не производил, но по ощущениям - должен сохранятся

    Добавлено: да... база не текущая - т.е. открыть хэндл др. БД
     
  17. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    При всем уважении к ОПП, я не сую его туда где оно может быть лишним или создаст дополнительные сложности.
    Если могу обойтись без ООП, то делаю без него. И когда поведение системы менялось переписывал под ОПП.
    И встречал пару либ, где была функция возвращающая объект базы из либы, хотя при этом либы содержала еще и классы.
    Да, смешанный подход конечно плох(очень плох), чисто функциональный - свои минусы, ООП - свои.
    И давайте не холиварить на эту тему, топиков в инете полно =)

    Возможно... Только я почти не сталкивался, разве что коллега в коллекции документов из разных баз.
    Он не хранил объекты баз в коллекции, что естественно вызывало ошибку.

    За пояснения спасибо, буду знать.
     
  18. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    в LS этого нет, в LS есть процедурный
    ф-циональный был бы очень кстати, он есть в scala (применительно к LDN), но разработки придется вести во внешних ИДЕ (дизайнер штатно не поддерживает)
     
  19. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    если код большой - то уже никак, понятно, что ради 2-х ф-ци не стоит городить объекты
    с др. стороны - есть сеттеры/геттеры - что удобно в применении
    "беда" начинается с малого - процедурный подход имеет ниже порог вхождения и как следствие - позволяет работодателям нанимать "низкоквалифицированных" кодеров, второй момент - большой объем копипасты (дублирования кода)
     
  20. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    да также и живет.. пока есть библиотека с фенкцией или класс с методом..
     
Загрузка...

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