• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

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:
 
Очевидно, что после сохранение документ пропадает из представления. Поэтому следующий документ определить невозможно. :rolleyes:

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

и View.AutoUpdate=true после
 
а нельзя сразу получить следующий док коллекции - до сохранения?
 
Казалось бы, чего этому Лотусу не хватает, ан нет, материт меня ошибкой: «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
 
офф, потом удалю: дубль удалила. а чего темы-то дублируете?
что, не работает создание темы с первого раза?
вроде вчера создавала нормально, но не в этом разделе.
Если что-то надо дописать, есть возможность редактирования темы.
 
Всем спасибо! Будем пробовать.
OKEN
Да висел малость, вот на нервной почве и нажал лишнего... :rolleyes:

P.S. :rolleyes: :)
 
Вместо Set Doc = View.GetNextDocument(Doc) снова используй Set Doc = View.GetFirstDocument
- командой Set Doc = View.GetNextDocument(Doc) ты обращаещься к след документу отталкиваясь от документа Doc, а после сохранения этот документ, как выше сказали, исчезает из этого представления из-за измененных условий в документе
 
Вместо Set Doc = View.GetNextDocument(Doc) снова используй Set Doc = View.GetFirstDocument
Не катит, ибо если документ не будет удовлетворять условию, то не произойдет Call Doc.RemoveItem("Item1") и Call Doc.Save(True, True), а значит он не исчезнет из представления, и я получу бесконечный цикл... Кажется так оно и будет... :)
 
Ну почему гонит? Если документ гарантированно пропадает из представление, то это будет работать. :)
 
+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.
 
Зацикливание произойдет только когда документы в представлении не исчезают, а ты явно указал что после doc.save вылетает ошибка именно на индекс, потомучто после оператора save происходит перестроение индекса на сервере. Чтобы не происходила индексация тогда, когда тебе не надо - необходимо ставить, как правильно раньше сказали View.AutoUpdate=false.
если происходит явное удаление документа из представления после каких-либо действий(в твоем случаи с сохранением документа с измененным полем, на котором строится представление) то в этом случаи поможет после оператора doc.save - Set Doc = View.GetFirstDocument вместо Set Doc = View.GetNextDocument(Doc)

P.S. подобная проблема у меня возникла при очистке папки в 7-ке. в 8-ке все проще. А также при отчетах, когда пользователи используют различные критерии для отчета и при этом чуть ли не одновременно его создают
 
Это не работает. Даже в хелпе написано. :)
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".
 
xalet
Так всё нравится - так и сделал :).
А проблема была решена уже после первого отклика (я просто не знал, что вид сразу после Doc.Save обновляется).
Но все равно всем спасибо за участие.
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab