Notes Error: Entry Not Found In Index

Тема в разделе "Lotus - Программирование", создана пользователем alik86, 22 дек 2009.

  1. alik86

    alik86 Lotus team
    Lotus team

    Регистрация:
    20 ноя 2008
    Сообщения:
    465
    Симпатии:
    0
    Понадобился агент, который брал бы документы из определенного вида, проверял бы некоторые условия и в зависимости от их выполнения удалял бы из документов определенные поля. Написал следующее.
    Код (Text):
    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:
     
  2. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Очевидно, что после сохранение документ пропадает из представления. Поэтому следующий документ определить невозможно. :rolleyes:

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

    yerke Well-Known Member

    Регистрация:
    28 авг 2007
    Сообщения:
    392
    Симпатии:
    0
    или View.AutoUpdate=false во время процесса

    и View.AutoUpdate=true после
     
  4. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    а нельзя сразу получить следующий док коллекции - до сохранения?
     
  5. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Видимо, после сохранения документ перестаёт удовлетворять условию отбора представления. Попробуйте так

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

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    офф, потом удалю: дубль удалила. а чего темы-то дублируете?
    что, не работает создание темы с первого раза?
    вроде вчера создавала нормально, но не в этом разделе.
    Если что-то надо дописать, есть возможность редактирования темы.
     
  7. alik86

    alik86 Lotus team
    Lotus team

    Регистрация:
    20 ноя 2008
    Сообщения:
    465
    Симпатии:
    0
    Всем спасибо! Будем пробовать.
    OKEN
    Да висел малость, вот на нервной почве и нажал лишнего... :rolleyes:

    P.S. :rolleyes: :)
     
  8. erdi

    erdi Well-Known Member

    Регистрация:
    20 авг 2008
    Сообщения:
    261
    Симпатии:
    36
    Вместо Set Doc = View.GetNextDocument(Doc) снова используй Set Doc = View.GetFirstDocument
    - командой Set Doc = View.GetNextDocument(Doc) ты обращаещься к след документу отталкиваясь от документа Doc, а после сохранения этот документ, как выше сказали, исчезает из этого представления из-за измененных условий в документе
     
  9. alik86

    alik86 Lotus team
    Lotus team

    Регистрация:
    20 ноя 2008
    Сообщения:
    465
    Симпатии:
    0
    Не катит, ибо если документ не будет удовлетворять условию, то не произойдет Call Doc.RemoveItem("Item1") и Call Doc.Save(True, True), а значит он не исчезнет из представления, и я получу бесконечный цикл... Кажется так оно и будет... :)
     
  10. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    извини, но ты гонишь ))
     
  11. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Ну почему гонит? Если документ гарантированно пропадает из представление, то это будет работать. :)
     
  12. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    +1
    кроме того, что это решит указанную проблему, еще и производительность повысится.
     
  13. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Это не работает. Даже в хелпе написано. :)
    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.
     
  14. erdi

    erdi Well-Known Member

    Регистрация:
    20 авг 2008
    Сообщения:
    261
    Симпатии:
    36
    Зацикливание произойдет только когда документы в представлении не исчезают, а ты явно указал что после doc.save вылетает ошибка именно на индекс, потомучто после оператора save происходит перестроение индекса на сервере. Чтобы не происходила индексация тогда, когда тебе не надо - необходимо ставить, как правильно раньше сказали View.AutoUpdate=false.
    если происходит явное удаление документа из представления после каких-либо действий(в твоем случаи с сохранением документа с измененным полем, на котором строится представление) то в этом случаи поможет после оператора doc.save - Set Doc = View.GetFirstDocument вместо Set Doc = View.GetNextDocument(Doc)

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

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    Гм. У нас разный хелп? 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 раз и навсегда решает указанную проблему.
    т.к. личный опыт - не аргумент - быстренько проводим эксперимент:
    код, "выбрасывающий" документы из вида. на каждой итерации пускаем агента, который рефрешит вид.
    Код (Text):
        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".
     
  16. Xalet

    Xalet Well-Known Member

    Регистрация:
    8 авг 2008
    Сообщения:
    410
    Симпатии:
    0
    А чем предложение nvy не нравится?
     
  17. alik86

    alik86 Lotus team
    Lotus team

    Регистрация:
    20 ноя 2008
    Сообщения:
    465
    Симпатии:
    0
    xalet
    Так всё нравится - так и сделал :).
    А проблема была решена уже после первого отклика (я просто не знал, что вид сразу после Doc.Save обновляется).
    Но все равно всем спасибо за участие.
     
Загрузка...

Поделиться этой страницей