1. Мегаконкурс в апреле "Приведи друзей на codeby". Дарим деньги, подписку на журнал хакер и выдаем статус "Paid Access". Подробнее ...

    Скрыть объявление

проблемы с документами

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

Наш партнер Genesis Hackspace
  1. nadezdaMP

    nadezdaMP Гость

    Добрый день всем!
    с виду очень простой вопрос, но на практике не работает! не пойму в чем дело!
    вот пример кода:
    Set indoc = inview.GetFirstDocument
    ....
    While Not indoc Is Nothing
    ' выполняются необходимые вычисления
    If act_removedoc = True Then ' если установлен флаг, то удаляем документ, удовлетворяющий условию вычислений, из папки
    Call indoc.RemoveFromFolder("($myfolder)")
    End If

    Set indoc = inview.GetNextDocument(indoc)
    Wend

    пробовала сделать следующее:
    Set indoc = inview.GetFirstDocument
    ....
    While Not indoc Is Nothing
    ' выполняются необходимые вычисления
    set tempdoc = indoc
    If act_removedoc = True Then ' если установлен флаг, то удаляем документ, удовлетворяющий условию вычислений, из папки
    Call tempdoc.RemoveFromFolder("($myfolder)")
    End If

    Set indoc = inview.GetNextDocument(indoc)
    Wend

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

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Проходи с конца.
    Set indoc = inview.GetLastDocument()
    ...
    Set indoc = inview.GetPrevDocument(indoc)
     
  3. Omh

    Omh Well-Known Member
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Для улучшения перфоманса:
    перед
    Код (Text):
    Set indoc = inview.GetFirstDocument
    сделай
    Код (Text):
    inview.AutoUpdate = False
    После цикла -
    Код (Text):
    inview.AutoUpdate = True
    А по проблеме - фик знает...

    Не хочешь заменить на db.search с такой же формулой как у view?
    Вообще, идти по view с включенным AutoUpdate - ресурсоёмкая операция.
     
  4. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Но быстрее будет так.
    Получаем коллекцию - NotesView.AllEntries.
    Удаляем из неё документы, которые нужно оставить в папке - NotesViewEntryCollection.DeleteEntry.
    Удаляем из папки оставшуюся коллекцию - NotesViewEntryCollection.RemoveAllFromFolder.
     
  5. nadezdaMP

    nadezdaMP Гость

    сделала так, документы все нашлись и переместились как надо по условию, но куда то делись и все остальные документы из папки, там осталось пусто (хорошо что база тестовая) ;)
     
  6. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Код в студию! ;)
     
  7. divankin

    divankin Senjor developer

    Регистрация:
    13 авг 2009
    Сообщения:
    182
    Симпатии:
    0
    Ваша проблема возникает, потому что вы меняете содержимое папки во время прохода в цикле по ней
    Отключите обновление индекса в скрипте inview.AutoUpdate = false
     
  8. nadezdaMP

    nadezdaMP Гость

    Sub Initialize

    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim indoc As NotesDocument, note As NotesDocument
    Dim inview As NotesView

    Set db = session.CurrentDatabase
    Set inview = db.GetView("($Inbox)")
    Set indoc = inview.GetFirstDocument

    s_MAINFORMULA = ...

    While Not indoc Is Nothing
    Result = Evaluate(s_MAINFORMULA, indoc)
    If Cstr(Result(0)) = "1" Then
    Call DoAction(note, indoc)
    End If

    If act_removedoc = True Then
    Call indoc.RemoveFromFolder("($Inbox)")
    End If

    Set indoc = inview.GetNextDocument(indoc)
    Wend

    End Sub

    в вызываемой функции происходит
    Function DoAction(note As NotesDocument, indoc As NotesDocument)
    ....
    Call DoActionParser(indoc)
    ....
    End Function

    и уже в DoActionParser устанавливается флаг
    Sub DoActionParser (indoc As NotesDocument)
    Select Case ACT_sAction
    '// Move to Folder
    Case "1"
    Call indoc.PutInFolder _
    ( ACT_sString, False)
    act_removedoc = True
    .....
    End Select

    End Sub
     
  9. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Нету моего предложения обходить с конца.
    И act_removedoc на False нигде не меняется.
     
  10. nadezdaMP

    nadezdaMP Гость

    исправила:
    While Not indoc Is Nothing
    Result = Evaluate(s_MAINFORMULA, indoc)
    If Cstr(Result(0)) = "1" Then
    Call DoAction(note, indoc)
    If act_removedoc = True Then
    Call indoc.RemoveFromFolder("($Inbox)")
    act_removedoc = False
    End If
    End If

    Set indoc = inview.GetPrevDocument(indoc)
    Wend

    вроде так пока сработало =) СПАСИБО!)))

    точно не знаю почему, но с командами
    inview.AutoUpdate = False
    и
    inview.AutoUpdate = True
    у меня вообще сортировки никакой не поизошло....
     
  11. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    1
    Попробуйте так
    Код (Text):
    Set indoc = inview.GetFirstDocument
    While Not indoc Is Nothing
    Set tempdoc = inview.GetNextDocument(indoc)
    If act_removedoc = True Then ' если установлен флаг, то удаляем документ, удовлетворяющий условию вычислений, из папки
    Call indoc.RemoveFromFolder("($myfolder)")
    End If
    Set indoc = tempdoc
    Wend
    Т.е. сразу получить следующий документ, который не будет удалён в текущей итерации цикла.
     
  12. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Что за сортировка?
     
  13. nadezdaMP

    nadezdaMP Гость

    в результате экспериментов часть документов удаляется из папки входящие и никуда неперемещается. видны только из представления - все документы.
    сейчас попробую остальные варианты (TIA)


    очень нужен агент, который все документы, которые не относятся ни к какой папке были скопированы в Входящие, может есть у кого скрипт готовый уже?
     
  14. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Создать представление Shared, contains documents not in any folders и скопировать все документы из него в папку?
     
  15. nadezdaMP

    nadezdaMP Гость

    создала, но у меня в этом представлении не отобразилось ни одного документа, хотя документов нет в папке входящие, но в представлении Всек документы они отображаются
     
  16. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    1
    Ну, если удалось перебрать все документы в папке, то предложенный мной способ ничего нового не даст. Он только для перебора документов представления.
     
  17. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Может они в какой-то другой папке?
     
  18. nadezdaMP

    nadezdaMP Гость

    сработало, документы восстановила, думаю дальше над перебором документов в представлении, почему так происходит при перемещении документов...
     
  19. nadezdaMP

    nadezdaMP Гость

    вообщем, я исправила цикл,
    ошибка была в том, что при удалении документа индекс следующего уменьшался на количество удаленных документов, то есть если мы переместили второй документ, то третий становился вторым, и так далее,
    если мы переместили второй, третий и четвертый документ, то пятыйй становился вторым, и так далее.

    я просто сделала в цикле переход не к следующему документу, а к докуменут
    номер = номер итерации цикла - количество удаленных документов

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

    вот код
    Код (Text):
    Dim x As Integer, count As Integer, index As Integer
    Set indoc = inview.GetFirstDocument
    x% = 1
    count% = 0

    While Not indoc Is Nothing
    .......
    If act_removedoc = True Then
    Call indoc.RemoveFromFolder("($Inbox)")
    act_removedoc = False
    count% = count% + 1
    End If 


    x% = x% +1
    index% = x% - count%
    Set indoc = inview.GetNthDocument(index%)
    Wend
     
  20. Omh

    Omh Well-Known Member
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Контекстный вопрос:
    в чём соль использования суффиксов, типа
    Код (Text):
    x%, index%
    ?
     
Загрузка...
Похожие Темы - проблемы документами
  1. nikos
    Ответов:
    29
    Просмотров:
    340
  2. lmike
    Ответов:
    18
    Просмотров:
    249
  3. VikTor1990
    Ответов:
    0
    Просмотров:
    70
  4. hitesh
    Ответов:
    6
    Просмотров:
    155
  5. Hackerelite
    Ответов:
    24
    Просмотров:
    558

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