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

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

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

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

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

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

Serduko

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

Вложения

  • err1.jpg
    err1.jpg
    80,9 КБ · Просмотры: 538
  • err2.jpg
    err2.jpg
    70,8 КБ · Просмотры: 640
N

nayke

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

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

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

savl

Lotus Team
28.10.2011
2 597
310
BIT
177
Функиця getPersonByNN, переменная dbPersonal является локальной.
При выходе из функции она обнуляется и теряется связь с документом.

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

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

Serduko

Функиця getPersonByNN, переменная dbPersonal является локальной.
При выходе из функции она обнуляется и теряется связь с документом.

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

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

savl

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

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

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

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

Serduko

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

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

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

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 940
609
BIT
210
можно не глобальную переменную :please:
а просто Static для БД объекта
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
177
Вместо Dim dbPersonal as NotesDatabase надо Static dbPersonal as NotesDatabase
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 940
609
BIT
210
то что написал savl + зависимо от ситуёвины, если инстанс db м.б. тока один:
Код:
Static dbPersonal as NotesDatabase
...
if dbPersonal Is Nothing then Set dbPersonal=...
 
S

Serduko

А в чем преимущество перед глобальной?
 
K

Kee_Keekkenen

А в чем преимущество перед глобальной?

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

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 940
609
BIT
210
тем что она локальная :please:
область видимости:
-каждой ф-ции м.б. свои долгоживущие объекты, с одинаковым названием
-не надо плодить в декларэшн кучу переменных
-глобальные, при "переходе" между модулями - нужно объявлять как Public, иначе повторится ваш случай
...
 

savl

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

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 940
609
BIT
210
ни в чем.. статические переменные используют внутри функци с целью повторного использования уже полученного значения/объекта..

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

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

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

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

savl

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

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

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 940
609
BIT
210
чисто функциональный - свои минусы
в LS этого нет, в LS есть
был бы очень кстати, он есть в scala (применительно к LDN), но разработки придется вести во внешних ИДЕ (дизайнер штатно не поддерживает)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 940
609
BIT
210
Если могу обойтись без ООП, то делаю без него
если код большой - то уже никак, понятно, что ради 2-х ф-ци не стоит городить объекты
с др. стороны - есть сеттеры/геттеры - что удобно в применении
"беда" начинается с малого - процедурный подход имеет ниже порог вхождения и как следствие - позволяет работодателям нанимать "низкоквалифицированных" кодеров, второй момент - большой объем копипасты (дублирования кода)
 
K

Kee_Keekkenen

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

да также и живет.. пока есть библиотека с фенкцией или класс с методом..
 
Мы в соцсетях:

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