Переменные и разделение памяти в lotusscript

erhe

Well-known member
05.03.2013
48
0
#1
Здравствуйте.

Впервые с таким столкнулся, вот и в недоумении :(
Код:
Dim doc1 As NotesDocument
 
Dim doc2 As NotesDocument
Dim view1 As NotesView
Dim view2 As NotesView
 
...
Set view1 = db.GetView("My View1")
Set doc1 = view1.GetFirstDocument
While Not (doc1 Is Nothng)
  Set view2 = db.GetView("My View2")
  Set doc2 = view2.GetFirstDocument
  While Not (doc2 Is Nothing)
	...
	Set doc2 = view2.GetNextDocument(doc2)
  Wend
  Set doc1 = view1.GetNextDocument(doc1) ' (*)
Wend
Во view2 попадается документ с таким же Form как у doc1, и которые есть во view1 -- по завершении внутреннего цикла в строке (*) получаю ошибку: документ не во view1

Получается лотус для каких-то целей "совместил" переменные?! В отладчике видно, что у doc1 поле parentview поменялось с view1 на view2. Как обойти-то эту глупость?
 
Последнее редактирование модератором:

oshmianski

Достойный программист
Lotus team
25.04.2012
552
8
#2
1. вынесите Set view2 = ... за первый while!
2. покажите ошибку, которая генерится.
3. выполните код действительно без кода, который вы заменили на ..., возможно там doc1 меняется или убивается
4. если не поможет, то следующий документ можно получать в следующей строке за while, а в конце цикла присваивать обрабатываемому в цикле
 

savl

Lotus team
28.10.2011
2 131
102
#4
view1.AutoUpdate = False
Документ может больше не попадать во вьюху по параметрам отбора.
Посмотрите что Вы с ним делаете, если это влияет на формулу отбора, то надо отключать автообновление.
 

erhe

Well-known member
05.03.2013
48
0
#5
1. вынесите Set view2 = ... за первый while!
2. покажите ошибку, которая генерится.
3. выполните код действительно без кода, который вы заменили на ..., возможно там doc1 меняется или убивается
4. если не поможет, то следующий документ можно получать в следующей строке за while, а в конце цикла присваивать обрабатываемому в цикле
1. Вынес -- не помогло
2. Ошибка 4151: The Document is not in View ИР в строке 51
3. код работал, пока не добавил вьюху, в которой есть документы из основного набора, т.е. поле FORM одинаковое
4.
Код:
 Set viewCat = currdb.GetView("СведенияИР") ' вспомогательная вьюха
Set view = currdb.GetView("ИР")
Set doc = view.GetFirstDocument
While Not (doc Is Nothing)
	Set nextDoc = view.GetNextDocument(doc) ' сделал как рекомендовано
	' категории
	Set docCat = viewCat.GetFirstDocument
	While Not (docCat Is Nothing)
		If docCat.IsResponse Then
			If docCat.Short_Name(0) = doc.Short_Name(0) Then
				Call BordersDrawAndWrite(reportXls, "C" & Cstr(ni%), docCat.ResourceDesc(0))
			End If
		End If
		Set docCat = viewCat.GetNextDocument(docCat)
	Wend
 
	' и вот тут и doc и nextdoc якобы принадлежат "СведенияИР", а не "ИР" как было...
 
	' я убрал тут код, он не влияет на работу
 
	Set doc = nextDoc
Wend
 
Последнее редактирование модератором:

erhe

Well-known member
05.03.2013
48
0
#6
view1.AutoUpdate = False
Документ может больше не попадать во вьюху по параметрам отбора.
Посмотрите что Вы с ним делаете, если это влияет на формулу отбора, то надо отключать автообновление.
Да ничего я с ним не делаю: нашел, вывел поля в Excel-файл, использовал поля для отбора других документов.
[DOUBLEPOST=1443099235,1443099028][/DOUBLEPOST] Выигрыш уходит к казино! Т.е. -- мимо, не помогло.
 

savl

Lotus team
28.10.2011
2 131
102
#7
@erhe, меняйте формулу отбора у вспомогательной вьюхи.
Вы обрабатываете только респонсы, нет смысла там держать еще и родителя.
Какая текущая формула?
 

oshmianski

Достойный программист
Lotus team
25.04.2012
552
8
#8
@erhe,
view1.AutoUpdate = False
view2.AutoUpdate = False

если это не помогло, переписывайте на работу с коллекциями
 

erhe

Well-known member
05.03.2013
48
0
#9
@erhe, меняйте формулу отбора у вспомогательной вьюхи.
Вы обрабатываете только респонсы, нет смысла там держать еще и родителя.
Какая текущая формула?
Знать бы ещё как эти респонсы отобрать. Простой выбор SELECT (Form="СведенияИР") ничего не дает -- выдает пустое множество (на экране пусто, хотя может документы там и есть... сейчас попробую).
 

erhe

Well-known member
05.03.2013
48
0
#10
Да, исправилось. Если брать только респонсы, то сбоев нет. (Странно, что они вообще возникают... :( )
 

oshmianski

Достойный программист
Lotus team
25.04.2012
552
8
#11
видимо, это кеш. похоже на многопоточно незащищенный объект.
 

oshmianski

Достойный программист
Lotus team
25.04.2012
552
8
#13
в лотусе много чего не написано. если хотите писать на нем (LotusScript, @Formula), придется привыкнуть.
из моей практики: перебор доков по вьюхе очень редно используется (а может и вообще не используется), лучше коллекции, навигаторы, ViewEntryCollection.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#14
может битый индекс...
тогда жди чудес любых
load updall -R ...
[DOUBLEPOST=1443213872,1443213721][/DOUBLEPOST]
видимо, это кеш. похоже на многопоточно незащищенный объект.
считается потокобезопасным, хотя освобождение автоматическое объектов сделали с версии 5-ой или 6-ой, до того - надо было самому делать Delete doc с присвоением временной переменной
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#15
смутные воспоминания (или просто глючит меня), но надо поэксперементировать - если из 2-ух вьюшек получить один и тот же док - итератор одной вьюшки его "потеряет"...
вопрос в области: уровень модуля, уровень класса, уровень приложения
и по коду - я не понимаю почему здесь используется перебор доков по вьюшке, а не получается навигатор/коллекция...
 

alexas1

Lotus team
10.04.2014
723
144
#16

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#18
в этом коде, прежде всего, надо разобраться с логикой
что нужно получить?
если док внутреннего цикла является респонсом с доку внешнего - то к чему весь этот "цирк" с вложением циклов?
[DOUBLEPOST=1443526035,1443525831][/DOUBLEPOST]что мы видим - сканируется ВЕСЬ view1
затем отбираются доки из view2, у кот. значения неких полей совпадают
что мешает создать вьюшку для отчета, у кот. эти условия соблюдаются? (речь не идет о реляциях, если чё ;) )
 

erhe

Well-known member
05.03.2013
48
0
#19
в лотусе много чего не написано. если хотите писать на нем (LotusScript, @Formula), придется привыкнуть.
из моей практики: перебор доков по вьюхе очень редно используется (а может и вообще не используется), лучше коллекции, навигаторы, ViewEntryCollection.
Да я уже потихоньку ко странностям привыкаю :)

А по поводу перебора доков во вьюхе... Мне в наследство досталось несколько баз и там полно такого кода. Писал, кстати, товарищ, которого обучали на курсах программирования Лотусу и даже сертификат об этом у него есть...
[DOUBLEPOST=1443553439,1443553292][/DOUBLEPOST]
смутные воспоминания (или просто глючит меня), но надо поэксперементировать - если из 2-ух вьюшек получить один и тот же док - итератор одной вьюшки его "потеряет"...
вопрос в области: уровень модуля, уровень класса, уровень приложения
и по коду - я не понимаю почему здесь используется перебор доков по вьюшке, а не получается навигатор/коллекция...
"Мы робили как умели" :)

По поводу навигатора/коллекции -- почитаю, попробую.
 

erhe

Well-known member
05.03.2013
48
0
#20
что мы видим - сканируется ВЕСЬ view1
затем отбираются доки из view2, у кот. значения неких полей совпадают
что мешает создать вьюшку для отчета, у кот. эти условия соблюдаются? (речь не идет о реляциях, если чё ;) )
мешает малый опыт программирования под Лотус.

Например, требуется простая на вид вещь: в документ нужно добавить набор атрибутов. В обычной программе это -- список неограниченного размера. Причем, список из нескольких столбцов -- не проблема. В Лотусе мне известно решение только через встроенную вьюху (у которой первый столбец вычисляется формулой @Text($Ref); просто добавить окно со списком не получится -- выбирается только один столбец значений, а нужно несколько -- документ). И вроде все хорошо, только одно НО -- документы такой вьюхи нельзя редактировать, Лотус прибивает в них поле $Ref и документ выпадает из вьюхи (точнее он в ней остается, но в нужном документе его нет). Можно как-нибудь красиво сделать без встроенных вьюх и полноценной правкой?