Entry Is No Longer In View

Erlan

Member
09.04.2012
11
0
#1
Всем добрый день!
Прошу помочь разобраться с ошибкой.

Скрипт пробегается по документам и по выбранным критериям (ищутся документы в определенном периоде) идет выгрузка данных в Excel.
Раньше скрипт работал, а теперь при переборе документов выходит ошибка entry is no longer in view и лотус полностью закрывается.
весь скрипт не вставляю так как он очень длинный.
смысл скрипта такой

Код:
'выше перебираются Имена_категории и циклом подставляются в CreateViewNavFromCategory("Имя_категории")
Set nav =view.CreateViewNavFromCategory("Имя_категории")
If nav Is Nothing Then Goto nexti
Set entry = nav.GetFirstDocument	
If Not entry Is Nothing Then
While Not(entry Is Nothing)
Set doc_a= entry.Document
'далее работа с полученным документом, вставляются определенные значения в Excel
Set entry = nav.Getnextdocument(entry) ' переход на след.документ
Wend
End If
nexti:	Call CloseExcelDoc
Msgbox {Нет документов, удовлетворяющие Ваши условия.Попробуйте еще раз задать период.}, 64,{Стоп!}
Exit Function
End If
 

Erlan

Member
09.04.2012
11
0
#3
Извините выходила ошибка
Fatal error: Call to a member function register_class() on a non-object in /var/www/codeby/data/www/codeby.net/sources/classes/post/class_post.php on line 2119
при попытке опубликовать пост , ПОЭТОМУ так много раз нажимал опубликовать.
Не знал что уже опубликовался мой пост.
А за оперативный ответ спасибо сейчас проверю.
 

savl

Well-Known Member
Lotus team
28.10.2011
2 116
157
32
#4
Erlan
не забудте после перебора в цикле и в обработчике ошибки сделать view.autoupdate = True
Чтобы вернуть как было.
 

Kee_Keekkenen

Well-Known Member
05.09.2006
639
6
Москва
#5
известная штука.
view.autoupdate = false
это хорошо, только стоит исправить цикл
Код:
While Not(entry Is Nothing)
Set tmpEntry = nav.Getnextdocument(entry)
Set doc_a= entry.Document
'далее работа с полученным документом, вставляются определенные значения в Excel
Set entry = tmpEntry ' переход на след.документ
Wend
Erlan
не забудте после перебора в цикле и в обработчике ошибки сделать view.autoupdate = True
Чтобы вернуть как было.
а это необязательно, т.к. autoupdate работает только для объектов, полученных от view
 

Erlan

Member
09.04.2012
11
0
#6
вставил view.AutoUpdate = False и в конце перебора вставил view.AutoUpdate = true
все равно та же ошибка и лотус закрывается.
Главное в дебагере не могу посмотреть на каком именно документе падает лотус.
 

Erlan

Member
09.04.2012
11
0
#7
это хорошо, только стоит исправить цикл
Код:
While Not(entry Is Nothing)
Set tmpEntry = nav.Getnextdocument(entry)
Set doc_a= entry.Document
'далее работа с полученным документом, вставляются определенные значения в Excel
Set entry = tmpEntry ' переход на след.документ
Wend


а это необязательно, т.к. autoupdate работает только для объектов, полученных от view
да я видел пример такой на сайте www-10.lotus.com
Set docCurr = vwWhatever.GetFirstDocument
Do Until DocCurr Is Nothing
Set docNext = vwWhatever.GetNextDocument(docCurr)
'Processing here, with option on deleting docCurr or otherwise changing it such that it no longer appears in vwWhatever
Set docCurr = docNext
Loop

но там было написано что документ надо удалить документ чтобы больше не встречался в навигаторе.

ОШИБКА осталась.
А в чем именно ошибка? в том что представление обновляется пока скрипт работает или в навигаторе по категориям один документ попал в несколько разных категории?
 

savl

Well-Known Member
Lotus team
28.10.2011
2 116
157
32
#8
Erlan
А обработчик ошибок есть?
Если нет вставте этот, только то что между Sub Initialize() и End Sub
Код:
	Sub Initialize()
On Error Goto handler
Const FuncName = {Agent"AgentName" }
Dim ErrStr As String

' ваш код

Goto endh
handler:
ErrStr = FuncName & ": " & Err &", в стр " & Erl & chr(10) & chr(13) & Error$
if not doc_a is nothing then ErrStr = ErrStr & chr(10) & chr(13) & doc_a.UniversalID
msgbox ErrStr,16
Resume endh
endh:
End Sub
 

oshmianski

Достойный программист
Lotus team
25.04.2012
546
13
#9
была еще беда на 8.5 что ль, notes замертво валился при обработке записей навигатора.
помогает только смена версии.
 

Erlan

Member
09.04.2012
11
0
#10
savl
вставил обработчик как Вы посоветовали. Лотус клиент и дизайнер отрубается.

Если oshmianski2 прав, то у меня действительно стоит 8,5 лотус.
Но почему тогда раньше работал?
 

savl

Well-Known Member
Lotus team
28.10.2011
2 116
157
32
#11
Но почему тогда раньше работал?
Если вкратце: что-то изменилось... Стало больше документов, стало больше кода обработки.
А по версионности клиентов да, 8.5.2 в свое время исправлял кучу багов относительно 8ки и 8.5
Мой текущий сейчас: Release 8.5.3FP2
 

oshmianski

Достойный программист
Lotus team
25.04.2012
546
13
#12
Но почему тогда раньше работал?
такое поведение (падение) наблюдается не всегда.
походу, зависит от сложности навигатора или количества и сложности категорий или данных в колонках или... только индусы знают.
 

Erlan

Member
09.04.2012
11
0
#13
Всем БОЛЬШОЕ СПАСИБО за то что отозвались помочь мне.
Обновили лотус до версии 8,5,3 и перестал отваливаться , нашел документ на котором была ошибка и понял в чем было дело.
Проблема решена.

Но появился другой вопрос. И хочется знать ответ на будущее.
Писал скрипт где не используется навигатор, и столкнулся с такими вопросами

Код:
'DateB - передается из формы поле даты
Dim dateBegin As New NotesDateTime(DateB)
searchFormula$={Form="PrintDoc" & DocType="}+doc_d.DocName(0)+{" & FlagReg=1 & !@IsAvailable($Conflict)}
Set colldocs=db.Search(searchFormula$,dateBegin,0)
допустим дата поиска ( dateBegin ) равна 24,07,2013
И вот в коллекцию не попадают документы созданные 24,05,2013
А попадают либо созданные либо модифицированные число 25,072013 и более
Почему?

и можно ли сохранять документы в массив а потом передавать этот массив с документами для обработки другой функции.
Это чтобы не повторять поиск нужных документов 2 раза.
 

savl

Well-Known Member
Lotus team
28.10.2011
2 116
157
32
#14
И вот в коллекцию не попадают документы созданные 24,05,2013
А попадают либо созданные либо модифицированные число 25,072013 и более
Почему?
Вот тут обсуждалось: http://codeby.net/forum/threads/50138.html?hl=Search
Эта дата отсечки меня всегда бесила, лучше даты в запросе поиска задавать.

Добавлено:
и можно ли сохранять документы в массив а потом передавать этот массив с документами для обработки другой функции.
Можно, но так же в этом массиве должна быть база из которой документы, а то потеряются.
Но зачем? Если можно в функцию передать коллекцию документов полученную при поиске.
Сделать скажем OriginalCol - результат поиска
RessCol1 - копия OriginalCol для обработки 1
RessCol2 - копия OriginalCol для обработки 2
 

Erlan

Member
09.04.2012
11
0
#15
Вот тут обсуждалось: http://codeby.net/forum/threads/50138.html?hl=Search
Эта дата отсечки меня всегда бесила, лучше даты в запросе поиска задавать.

Добавлено:
Можно, но так же в этом массиве должна быть база из которой документы, а то потеряются.
Но зачем? Если можно в функцию передать коллекцию документов полученную при поиске.
Сделать скажем OriginalCol - результат поиска
RessCol1 - копия OriginalCol для обработки 1
RessCol2 - копия OriginalCol для обработки 2
возможно ли в строке поиска указать сравнение дат ?
searchFormula$={Form="PrintDoc"}
у меня не получилось. как Вы имели в виду дату в запросе указывать?

А по коллекциям
ситуация такая
Нужны документы с 01,07,2013 по 02,07,2013
методом db.Search нахожу документы старше или равно 01,07,2013
затем пробегаюсь по этой коллекции и нахожу только нужные мне документы в периоде.
И вот чтобы второй раз такое действие не проводить можно ли как то сохранить коллекцию по отобранным документам в периоде от 01 -02 числа ?
 

savl

Well-Known Member
Lotus team
28.10.2011
2 116
157
32
#16
*Имя Поля с датой* - тип DateTime
dtPeroidStart - NotesDateTime
dtPeroidEnd - NotesDateTime
хм, обычное сравнение дат на собаке... я обычно так делаю:
searchFormula$={Form="PrintDoc" & *Имя Поля с датой* >=@TextToTime(@text(} & dtPeroidStart.DateOnly & {)) & *Имя Поля с датой* <=@TextToTime(@text(} & dtPeroidEnd.DateOnly & {))}

Если нигде не ошибся со скобочками...
dateOnly и так возвращает текст, но я использую дополнительное @-преобразование в текст и потом от этого текста делаю datatime данные.
Более подробно написано тут: http://codeby.net/forum/threads/32749s0.html?...mp;#entry152077
Советую почитать.
 

Erlan

Member
09.04.2012
11
0
#17
*Имя Поля с датой* - тип DateTime
dtPeroidStart - NotesDateTime
dtPeroidEnd - NotesDateTime
хм, обычное сравнение дат на собаке... я обычно так делаю:
searchFormula$={Form="PrintDoc" & *Имя Поля с датой* >=@TextToTime(@text(} & dtPeroidStart.DateOnly & {)) & *Имя Поля с датой* <=@TextToTime(@text(} & dtPeroidEnd.DateOnly & {))}

Если нигде не ошибся со скобочками...
dateOnly и так возвращает текст, но я использую дополнительное @-преобразование в текст и потом от этого текста делаю datatime данные.
Более подробно написано тут: http://codeby.net/forum/threads/32749s0.html?...mp;#entry152077
Советую почитать.
Спасибо большое за помощь и советы.
Тему можно закрывать.