Возвращаемый объект пропадает при выходе из функции

Статус
Закрыто для дальнейших ответов.

savl

Lotus Team
28.10.2011
2 624
314
BIT
543
Коллеги, ситуация такая:
Есть документ -> В документе поле -> В поле массив: путь к БД и UNID.

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

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

Проблему решил: получил базу, из которой открывается документ в кнопке, после этого объект стал виден.

Привожу код из библиотеки и кнопки:

<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Библиотека</div></div><div class="sp-body"><div class="sp-content">
Код:
		Dim linkArr As Variant
Dim ses As New notessession
Dim linkDb As NotesDatabase
Dim linkDoc As NotesDocument

Set GetLink = Nothing

linkArr = project.Getitemvalue(Itemname & "Link")
If linkArr(0) = "" Then GoTo endh

Set linkDb = ses.Getdatabase(AgrDb.Server, linkArr(0), false)
On Error resume Next
Set linkDoc = linkDb.Getdocumentbyunid(linkArr(1))
On Error GoTo handler
Set GetLink = linkDoc

<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Кнопка</div></div><div class="sp-body"><div class="sp-content">
Код:
	Dim ws As New NotesUIWorkspace	
Dim pDoc As NotesDocument

Dim linkArr As Variant
[i]	
Dim ses As New notessession
Dim linkDb As NotesDatabase

linkArr = ProjDoc.Getitemvalue("respPersonLink")
If linkArr(0) = "" Then Goto endh

Set linkDb = ses.Getdatabase(ProjDoc.parentdatabase.Server, linkArr(0), False)
[/i]

[b]	Set pDoc = Project.GetLink("respPerson")  [/b]

If pDoc Is Nothing Then Goto endh

Call ws.SetTargetFrame("_Blank")
Call ws.URLOpen(pDoc.NotesURL)

В коде кнопки выделена жирным строка (тег ) , которая делает вызов функции, курсивом выделил получение базы (тег ).
Без этого получения документ в pDoc не возвращается.

Вопрос: Это такая фича лотуса? Без объекта базы, который висит в памяти, документы теряются?
Я понимаю это так : база из которой получается документ потеряна на выходе из функции библиотеки, в кнопке ее нет, соответственно документа тоже нет.
Объясните пож-та.
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
Ну это баян. :)
Да, на выходе объект базы прибивается вместе с документом. Поэтому базу лучше передавать в параметрах.
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
543
Так и думал. А никто глубже не копал, почему это так?
 
P

phantom76

насколько я вижу вы объекты инициализируете от одинаково называемых объектах SES - NotesSession (в функции и акции) , поэтому из функции Вам ничего не возвращается, Вам или через параметры надо передавать или SES делать глобальным объектом.
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
543
phantom76 от этого не зависит, проверял.

Morpheus, про объект базы понятно почему исчезает. Мне интересно: почему с объектом базы прибивается объект документа?
То что это фишка лотуса уже понятно, просто сам момент интересен.
Передача вниз нормальная, потому что где-то вверху есть объект базы.
Вот почему наверх нельзя... Какая там связь... :)
 
A

ABarmin

Документ жестко привязан к базе, содержит в себе ссылку на NotesDatabase, из которой он получен - специфика лотуса. Можете создать глобальный кэш баз данных, тогда проблема с потерей ссылок на БД решится.
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
543
ABarmin
Вот для меня это и странно.
Если рассуждать:

Связь из документа к базе, то есть базу можно получить из документа. Напрямую.
Какая разница исчезнет объект базы(в другой переменной) или нет, ее можно получить из объекта документа.
Ощущение, будто свойство ParentDatabase для документа ничего не значит. Только для удобства получения, не более.
Если ParentDatabase не более чем указатель, который создается в момент создания объекта документа, то он как-то получается.
Записывается в память, логично предположить что при его уничтожении память очищается.
Значит есть проверка, которая уничтожает объект документа при отсутствии значения по данному указателю.

Однако, если этот указатель заполняется при создании, что мешает его заполнять при необходимости? механизм же тот же.
 
N

nvyush

Связь из документа к базе, то есть базу можно получить из документа. Напрямую.
Какая разница исчезнет объект базы(в другой переменной) или нет, ее можно получить из объекта документа.
Ощущение, будто свойство ParentDatabase для документа ничего не значит. Только для удобства получения, не более.
Если ParentDatabase не более чем указатель, который создается в момент создания объекта документа, то он как-то получается.
Записывается в память, логично предположить что при его уничтожении память очищается.
Значит есть проверка, которая уничтожает объект документа при отсутствии значения по данному указателю.

Однако, если этот указатель заполняется при создании, что мешает его заполнять при необходимости? механизм же тот же.
Указатель либо пуст (Nothing), либо указывает на объект в памяти. Если объект в памяти больше не нужен, он утилизируется сборщиком мусора. По завершении процедуры/функции все нестатические локальные переменные утилизируются, в том числе db. На что в этом случае будет указывать doc.ParentDatabase? На адрес, по которому уже находится другой объект или просто мусор. Что произойдёт при попытке обратиться по данному указателю? Скорее всего, "Красный квадрат". IBM конечно же могли хранить объект БД в памяти, пока не останется всех ссылок явных (в смысле объектных переменных типа NotesDatabase) и неявных (из полей других объектов), но видимо решили не усложнять себе жизнь. Смиритесь и передавайте БД в функции по ссылке, либо используйте свойство ParentDatabase переданных по ссылке объектов, либо объявите переменные сессии и БД глобально и инициализируйте их в общей библиотеке.
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
543
Это тоже понятно.
Ладно, продолжать бессмысленно :)
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

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