Сравнение Документов Из Разных Представлений

Erlan

Member
09.04.2012
11
0
#1
Здравствуйте!
Нужно удалить часть документов.
Есть два представления(view), мне нужно пробежаться по первому представлению и если документа нет во втором представлении, то нужно его удалить.
часть скрипта ниже
Код:
While Not ( doc Is Nothing )
If(doc.Hasitem("DocID"))Then
docForm=doc.Form(0)
docDocId=doc.DocID(0)	
mustDel = True
Set doc_isp = view_isp.GetFirstDocument
While Not(doc_isp Is Nothing)
If(doc_isp.Hasitem("DocID"))Then
doc_ispForm=doc_isp.Form(0)
doc_ispDocId=doc_isp.DocID(0)	
If(doc_ispForm=docForm And doc_ispDocId=docDocId)Then
mustDel = False
End If	
End If				
Set doc_isp = view_isp.GetNextDocument( doc_isp )
Wend			
If (mustDel)Then
'delete doc	
ReDim Preserve DeleteDocArray(countOfDeletedDoc)
DeleteDocArray(countOfDeletedDoc)=doc.DocId(0)	
countOfDeletedDoc=countOfDeletedDoc+1				
End If				
End If	
Set doc = view_notisp.GetNextDocument( doc )
Wend
ПРОБЛЕМА в том что здесь Set doc = view_notisp.GetNextDocument( doc ) ошибка ERROR 4151. User-defined error
если убрать внутренний цикл то внешний цикл срабатывает. Выходит проблема в том что внутри While если вставляю еще один While то первый цикл падает в ошибку
Как решить эту проблему?
Заранее благодарен
 

savl

Lotus team
28.10.2011
2 131
102
#2
Жесть...
Одним циклом можно делать, но понадобится вьюха.

Делаете новую, временную вьюху, формула отбора как у вашей второй (там где проверяете)
Делаете первую колонку сортированной в нее формулу:
Код:
@Text(@DocumentUniqueID)
Формулу можно заменить на DocID, но я не знаю что у вас в нем, поэтому предлагаю UniversalID
меняем код на:


Код:
set viewSearch = db.getview(viewSearch)
While Not ( doc Is Nothing )

Set doc_isp = viewSearch.getdocumentbykey(doc.UniversalID,true)

if doc_isp is nothing then
'delete doc	
ReDim Preserve DeleteDocArray(countOfDeletedDoc)
DeleteDocArray(countOfDeletedDoc)=doc.DocId(0)	
countOfDeletedDoc=countOfDeletedDoc+1				
End If				
End If	
Set doc = view_notisp.GetNextDocument( doc )
Wend
 

Erlan

Member
09.04.2012
11
0
#3
спасибо за ответ, сделаю
а хотелось бы знать почему там в ошибку падал, у лотуса есть какие то ограничения по поиску в различных представлениях?
 

savl

Lotus team
28.10.2011
2 131
102
#4
еще рекомендую сделать до цикла
view_notisp.Autoupdate = false
а после цикла вернуть
view_notisp.Autoupdate = True

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

У массивов ограничение в ~32K элементов
 

Erlan

Member
09.04.2012
11
0
#5
нашел код ошибки
NOTES_ERR_DOC_NOTINVIEW = 4151;
как я понял он говорит, что документа нет в представлении, хотя он есть( в дебагере смотрю он не изменился ).
ок, теперь буду знать, и сделаю по другому.
Вам savl спасибо большое
 
13.03.2009
625
1
#6
спасибо за ответ, сделаю
а хотелось бы знать почему там в ошибку падал, у лотуса есть какие то ограничения по поиску в различных представлениях?
4151 можно словить, если получить один и тот же док из разных вьюх, что походу и происходит в вашем случае.
 

garrick

Lotus team
26.10.2009
894
61
#8
Off: Запустил я Norton Commander, смотрю у меня справа диск "Ц" и слева диск "Ц", подумал "зачем мне два диска "Ц"?". Взял и удалили один... :)
 

Shandrik

Lotus team
30.12.2010
268
12
#9
Сдается мне, что чем перебирать две вьюхи (да ещё и без Exit do во внутреннем цикле ;) ), быстрее был бы обход первой вьюхи и выполнение на каждом Evaluate по формуле отбора второй вьюхи.

А может и Search с условием первой вьюхи и через & ! (формула отбора второй вьюхи).


Хотя, скорее всего, Вы вообще не так задачу решаете.