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

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

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

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

Notes Error: Entry Not Found In Index

  • Автор темы alik86
  • Дата начала
A

alik86

Понадобился агент, который брал бы документы из определенного вида, проверял бы некоторые условия и в зависимости от их выполнения удалял бы из документов определенные поля. Написал следующее.
Код:
Sub Initialize
Dim Session As New NotesSession
Dim Db As NotesDatabase
Dim View As NotesView
Dim Doc As NotesDocument

‘//...
‘//On Error Resume Next

Set Db = Session.CurrentDatabase
Set View = Db.GetView("ViewName")
Set Doc = View.GetFirstDocument

While Not (Doc Is Nothing)
‘//if…
Call Doc.RemoveItem("Item1")
Call Doc.RemoveItem("Item2")
Call Doc.Save(True, True)		‘//если убрать, то все перебирает
‘//End If…

Set Doc = View.GetNextDocument(Doc)	‘//на этой строке ругает
Wend
End Sub
Казалось бы, чего этому Лотусу не хватает, ан нет, материт меня ошибкой: «Notes Error: Entry not found in index (VievName)»
Будьте так любезны, подскажите чего ему всё таки не хватает?
P.S. Если убрать строку Call Doc.Save(True, True), то нормально перебирает все документы, но мне же надо сохранить изменения.


Добавлено: Извиняюсь за засер. Не нашел, как удалить продублировавшуюся тему. :rolleyes:
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Очевидно, что после сохранение документ пропадает из представления. Поэтому следующий документ определить невозможно. :rolleyes:

Добавлено: Лично я обрабатываю View.AllEntries. И нет проблем если содержимое представления поменяется.
 
Y

yerke

или View.AutoUpdate=false во время процесса

и View.AutoUpdate=true после
 
H

hosm

а нельзя сразу получить следующий док коллекции - до сохранения?
 
N

nvyush

Казалось бы, чего этому Лотусу не хватает, ан нет, материт меня ошибкой: «Notes Error: Entry not found in index (VievName)»
Будьте так любезны, подскажите чего ему всё таки не хватает?
P.S. Если убрать строку Call Doc.Save(True, True), то нормально перебирает все документы, но мне же надо сохранить изменения.

Видимо, после сохранения документ перестаёт удовлетворять условию отбора представления. Попробуйте так

Код:
While Not (Doc Is Nothing)
Set NextDoc = View.GetNextDocument(Doc)
...
Set Doc = NextDoc	
Wend
 
H

hosm

офф, потом удалю: дубль удалила. а чего темы-то дублируете?
что, не работает создание темы с первого раза?
вроде вчера создавала нормально, но не в этом разделе.
Если что-то надо дописать, есть возможность редактирования темы.
 
A

alik86

Всем спасибо! Будем пробовать.
OKEN
Да висел малость, вот на нервной почве и нажал лишнего... :rolleyes:

P.S. :rolleyes: :)
 

erdi

Green Team
20.08.2008
264
17
BIT
0
Вместо Set Doc = View.GetNextDocument(Doc) снова используй Set Doc = View.GetFirstDocument
- командой Set Doc = View.GetNextDocument(Doc) ты обращаещься к след документу отталкиваясь от документа Doc, а после сохранения этот документ, как выше сказали, исчезает из этого представления из-за измененных условий в документе
 
A

alik86

Вместо Set Doc = View.GetNextDocument(Doc) снова используй Set Doc = View.GetFirstDocument
Не катит, ибо если документ не будет удовлетворять условию, то не произойдет Call Doc.RemoveItem("Item1") и Call Doc.Save(True, True), а значит он не исчезнет из представления, и я получу бесконечный цикл... Кажется так оно и будет... :)
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Ну почему гонит? Если документ гарантированно пропадает из представление, то это будет работать. :)
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
+1
кроме того, что это решит указанную проблему, еще и производительность повысится.
Это не работает. Даже в хелпе написано. :)
AutoUpdate property
Caution This property only addresses refreshes by the currently running code. Other code, such as running the Updall task against the database, will update the view index and NotesViewNavigator regardless of the value of this property. If it is necessary to process every document in a view, do not rely upon a view remaining static. See Collecting all documents and all unprocessed documents for a discussion of solutions to this issue.
 

erdi

Green Team
20.08.2008
264
17
BIT
0
Зацикливание произойдет только когда документы в представлении не исчезают, а ты явно указал что после doc.save вылетает ошибка именно на индекс, потомучто после оператора save происходит перестроение индекса на сервере. Чтобы не происходила индексация тогда, когда тебе не надо - необходимо ставить, как правильно раньше сказали View.AutoUpdate=false.
если происходит явное удаление документа из представления после каких-либо действий(в твоем случаи с сохранением документа с измененным полем, на котором строится представление) то в этом случаи поможет после оператора doc.save - Set Doc = View.GetFirstDocument вместо Set Doc = View.GetNextDocument(Doc)

P.S. подобная проблема у меня возникла при очистке папки в 7-ке. в 8-ке все проще. А также при отчетах, когда пользователи используют различные критерии для отчета и при этом чуть ли не одновременно его создают
 
T

turumbay

Это не работает. Даже в хелпе написано. :)
AutoUpdate property
Caution This property only addresses refreshes by the currently running code. Other code, such as running the Updall task against the database, will update the view index and NotesViewNavigator regardless of the value of this property. If it is necessary to process every document in a view, do not rely upon a view remaining static. See Collecting all documents and all unprocessed documents for a discussion of solutions to this issue.
Гм. У нас разный хелп? 7.0.3. никаких caution не обнаружил:
Usage
Set this property to False if you want the view to remain static during processing.
You may want to set this property to False to enhance performance. For example, you are processing all the documents in a large view and don't care about any changes that occur in the database during that processing.
If this property is False, you must call Refresh to navigate to an update.
Even if this property is True, you must call Refresh if you are not navigating to an update and you want the view refreshed, for example, to get the top level entry count.
This method does not refresh the front-end view that the interactive user sees, nor does it rebuild the front-end view. See ViewRefresh and ViewRebuild in NotesUIWorkspace.

гм. приписку похоже сделали в 8.5... однако
мой опыт показывает, что использование autoupdate = false раз и навсегда решает указанную проблему.
т.к. личный опыт - не аргумент - быстренько проводим эксперимент:
код, "выбрасывающий" документы из вида. на каждой итерации пускаем агента, который рефрешит вид.
Код:
	While Not doc Is Nothing
doc.TestField = "-1"
Call doc.Save( True, False )
Dim agent As NotesAgent
Set agent = session.CurrentDatabase.GetAgent("refresh default view")
Call agent.Run()
Set doc = view.GetNextDocument( doc )
Wend
Агент: Set view = db.GetView( "Default") ... Call view.Refresh()
результат: не все документы исчезли из вида, но ошибки нет. Т.е. указанный способ таки решает проблему "Entry not found in index".
 
A

alik86

xalet
Так всё нравится - так и сделал :).
А проблема была решена уже после первого отклика (я просто не знал, что вид сразу после Doc.Save обновляется).
Но все равно всем спасибо за участие.
 
Мы в соцсетях:

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