• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы Erlan
  • Дата начала
E

Erlan

Здравствуйте!
Нужно удалить часть документов.
Есть два представления(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 597
310
BIT
160
Жесть...
Одним циклом можно делать, но понадобится вьюха.

Делаете новую, временную вьюху, формула отбора как у вашей второй (там где проверяете)
Делаете первую колонку сортированной в нее формулу:
Код:
@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
 
E

Erlan

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

savl

Lotus Team
28.10.2011
2 597
310
BIT
160
еще рекомендую сделать до цикла
view_notisp.Autoupdate = false
а после цикла вернуть
view_notisp.Autoupdate = True

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

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

Erlan

нашел код ошибки
NOTES_ERR_DOC_NOTINVIEW = 4151;
как я понял он говорит, что документа нет в представлении, хотя он есть( в дебагере смотрю он не изменился ).
ок, теперь буду знать, и сделаю по другому.
Вам savl спасибо большое
 
T

turumbay

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

garrick

Lotus Team
26.10.2009
1 349
151
BIT
165
Off: Запустил я Norton Commander, смотрю у меня справа диск "Ц" и слева диск "Ц", подумал "зачем мне два диска "Ц"?". Взял и удалили один... :)
 
S

Shandrik

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

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


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

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