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

  • Автор темы erhe
  • Дата начала
E

erhe

Здравствуйте.

Впервые с таким столкнулся, вот и в недоумении :(
Код:
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
711
59
BIT
8
1. вынесите Set view2 = ... за первый while!
2. покажите ошибку, которая генерится.
3. выполните код действительно без кода, который вы заменили на ..., возможно там doc1 меняется или убивается
4. если не поможет, то следующий документ можно получать в следующей строке за while, а в конце цикла присваивать обрабатываемому в цикле
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
539
view1.AutoUpdate = False
Документ может больше не попадать во вьюху по параметрам отбора.
Посмотрите что Вы с ним делаете, если это влияет на формулу отбора, то надо отключать автообновление.
 
E

erhe

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
 
Последнее редактирование:
E

erhe

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

Да ничего я с ним не делаю: нашел, вывел поля в Excel-файл, использовал поля для отбора других документов.
[DOUBLEPOST=1443099235,1443099028][/DOUBLEPOST]

Выигрыш уходит к казино! Т.е. -- мимо, не помогло.
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
539
@erhe, меняйте формулу отбора у вспомогательной вьюхи.
Вы обрабатываете только респонсы, нет смысла там держать еще и родителя.
Какая текущая формула?
 

oshmianski

Достойный программист
Lotus Team
25.04.2012
711
59
BIT
8
@erhe,
view1.AutoUpdate = False
view2.AutoUpdate = False

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

erhe

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

Знать бы ещё как эти респонсы отобрать. Простой выбор SELECT (Form="СведенияИР") ничего не дает -- выдает пустое множество (на экране пусто, хотя может документы там и есть... сейчас попробую).
 
E

erhe

Да, исправилось. Если брать только респонсы, то сбоев нет. (Странно, что они вообще возникают... :( )
 

oshmianski

Достойный программист
Lotus Team
25.04.2012
711
59
BIT
8
видимо, это кеш. похоже на многопоточно незащищенный объект.
 

oshmianski

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

lmike

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
смутные воспоминания (или просто глючит меня), но надо поэксперементировать - если из 2-ух вьюшек получить один и тот же док - итератор одной вьюшки его "потеряет"...
вопрос в области: уровень модуля, уровень класса, уровень приложения
и по коду - я не понимаю почему здесь используется перебор доков по вьюшке, а не получается навигатор/коллекция...
 

alexas1

Green Team
10.04.2014
1 202
225
BIT
45

lmike

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

erhe

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

Да я уже потихоньку ко странностям привыкаю :)

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

"Мы робили как умели" :)

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

erhe

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

мешает малый опыт программирования под Лотус.

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

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