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

Serduko

Well-known member
11.10.2011
170
0
#1
Добрый день всем, не могу заставить Lotus работать, первый раз с таким сталкиваюсь. Функция не возвращает переменной, Recompile All Lotusscript не помогает.
 

Вложения

nayke

Well-known member
04.08.2010
310
0
#2
Добрый день всем, не могу заставить Lotus работать, первый раз с таким сталкиваюсь. Функция не возвращает переменной, Recompile All Lotusscript не помогает.
Сталкивался с таким. Проблема была с объявлением Базы. Типа родительская переменная не объявлена в верхней функции - честно точно не помню.

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

savl

Lotus team
28.10.2011
2 131
102
#3
Функиця getPersonByNN, переменная dbPersonal является локальной.
При выходе из функции она обнуляется и теряется связь с документом.

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

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

Serduko

Well-known member
11.10.2011
170
0
#4
Функиця getPersonByNN, переменная dbPersonal является локальной.
При выходе из функции она обнуляется и теряется связь с документом.

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

можно как nayke предложил.
Ага понял, в чем дело. спасибо.
 

savl

Lotus team
28.10.2011
2 131
102
#5
Serduko
Нет, не все с ней в порядке: переменная локальная, объявлена в функции и "живет" она в рамках ффункции и все объекты полученные от нее живут так же только в рамках функции.
Когда выходишь из функции все переменные, кроме возвращающего значения - обнуляются.

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

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

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

Serduko

Well-known member
11.10.2011
170
0
#6
Serduko
Нет, не все с ней в порядке: переменная локальная, объявлена в функции и "живет" она в рамках ффункции и все объекты полученные от нее живут так же только в рамках функции.
Когда выходишь из функции все переменные, кроме возвращающего значения - обнуляются.

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

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

Сделайте в Declaration перменную: dim dbPersonal2 as notesdatabase
Она будет глобальной на библиотеку.
Замените в вашей функции dbPersonal на dbPersonal2
Проверте работу.
Да, дошло, что ссылка на документ связана с базой, совсем забыл про это.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 571
264
#7
можно не глобальную переменную :please:
а просто Static для БД объекта
 

savl

Lotus team
28.10.2011
2 131
102
#9
Вместо Dim dbPersonal as NotesDatabase надо Static dbPersonal as NotesDatabase
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 571
264
#10
то что написал savl + зависимо от ситуёвины, если инстанс db м.б. тока один:
Код:
Static dbPersonal as NotesDatabase
...
if dbPersonal Is Nothing then Set dbPersonal=...
 

Kee_Keekkenen

Well-known member
05.09.2006
639
4
#12
А в чем преимущество перед глобальной?
ни в чем.. статические переменные используют внутри функци с целью повторного использования уже полученного значения/объекта..

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

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 571
264
#13
тем что она локальная :please:
область видимости:
-каждой ф-ции м.б. свои долгоживущие объекты, с одинаковым названием
-не надо плодить в декларэшн кучу переменных
-глобальные, при "переходе" между модулями - нужно объявлять как Public, иначе повторится ваш случай
...
 

savl

Lotus team
28.10.2011
2 131
102
#14
-глобальные, при "переходе" между модулями - нужно объявлять как Public, иначе повторится ваш случай
В пределах библиотеки не надо делать Public, можно даже Private сделать.
А для доступа к переменной использовать функцию из библиотеки, которая возвращает объект базы.

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

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 571
264
#15
ни в чем.. статические переменные используют внутри функци с целью повторного использования уже полученного значения/объекта..

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

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

Kee_Keekkenen, lmike
У меня вопрос по сроку жизни Static. Сколько она живет? Плохо понимаю этот момент.
Глобальная живет пока пока есть библиотека(если не путаю), а Static?
если не сделать Public, и док или вьюшка будут юзаться в к-л либе (а база инициализирована в др.) - повторится фокус с пропаданием объекта, в 7-ке точно (сталкивался)
со статиком обширных экспериментов не производил, но по ощущениям - должен сохранятся

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

savl

Lotus team
28.10.2011
2 131
102
#16
да и вовсе, процедурное оформление кода дает свои недостатки
При всем уважении к ОПП, я не сую его туда где оно может быть лишним или создаст дополнительные сложности.
Если могу обойтись без ООП, то делаю без него. И когда поведение системы менялось переписывал под ОПП.
И встречал пару либ, где была функция возвращающая объект базы из либы, хотя при этом либы содержала еще и классы.
Да, смешанный подход конечно плох(очень плох), чисто функциональный - свои минусы, ООП - свои.
И давайте не холиварить на эту тему, топиков в инете полно =)

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

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

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 571
264
#17

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 571
264
#18
Если могу обойтись без ООП, то делаю без него
если код большой - то уже никак, понятно, что ради 2-х ф-ци не стоит городить объекты
с др. стороны - есть сеттеры/геттеры - что удобно в применении
"беда" начинается с малого - процедурный подход имеет ниже порог вхождения и как следствие - позволяет работодателям нанимать "низкоквалифицированных" кодеров, второй момент - большой объем копипасты (дублирования кода)
 

Kee_Keekkenen

Well-known member
05.09.2006
639
4
#19
Kee_Keekkenen, lmike
У меня вопрос по сроку жизни Static. Сколько она живет? Плохо понимаю этот момент.
Глобальная живет пока пока есть библиотека(если не путаю), а Static?
да также и живет.. пока есть библиотека с фенкцией или класс с методом..