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

  • Автор темы nadezdaMP
  • Дата начала
N

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

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

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
Проходи с конца.
Set indoc = inview.GetLastDocument()
...
Set indoc = inview.GetPrevDocument(indoc)
 
O

Omh

Для улучшения перфоманса:
перед
Код:
Set indoc = inview.GetFirstDocument
сделай
Код:
inview.AutoUpdate = False
После цикла -
Код:
inview.AutoUpdate = True
А по проблеме - фик знает...

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

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
Но быстрее будет так.
Получаем коллекцию - NotesView.AllEntries.
Удаляем из неё документы, которые нужно оставить в папке - NotesViewEntryCollection.DeleteEntry.
Удаляем из папки оставшуюся коллекцию - NotesViewEntryCollection.RemoveAllFromFolder.
 
N

nadezdaMP

Проходи с конца.
Set indoc = inview.GetLastDocument()
...
Set indoc = inview.GetPrevDocument(indoc)
сделала так, документы все нашлись и переместились как надо по условию, но куда то делись и все остальные документы из папки, там осталось пусто (хорошо что база тестовая) ;)
 
D

divankin

Ваша проблема возникает, потому что вы меняете содержимое папки во время прохода в цикле по ней
Отключите обновление индекса в скрипте inview.AutoUpdate = false
 
N

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
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
Нету моего предложения обходить с конца.
И act_removedoc на False нигде не меняется.
 
N

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
у меня вообще сортировки никакой не поизошло....
 
T

TIA

Попробуйте так
Код:
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
Т.е. сразу получить следующий документ, который не будет удалён в текущей итерации цикла.
 
N

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

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


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

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
очень нужен агент, который все документы, которые не относятся ни к какой папке были скопированы в Входящие, может есть у кого скрипт готовый уже?
Создать представление Shared, contains documents not in any folders и скопировать все документы из него в папку?
 
N

nadezdaMP

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

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
создала, но у меня в этом представлении не отобразилось ни одного документа, хотя документов нет в папке входящие, но в представлении Всек документы они отображаются
Может они в какой-то другой папке?
 
N

nadezdaMP

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

nadezdaMP

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

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

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

вот код
Код:
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
 
O

Omh

Контекстный вопрос:
в чём соль использования суффиксов, типа
Код:
x%, index%
?
 
Мы в соцсетях:

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