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

Тема в разделе "Lotus - Программирование", создана пользователем Erlan, 25 апр 2014.

  1. Erlan

    Erlan Member

    Регистрация:
    9 апр 2012
    Сообщения:
    11
    Симпатии:
    0
    Здравствуйте!
    Нужно удалить часть документов.
    Есть два представления(view), мне нужно пробежаться по первому представлению и если документа нет во втором представлении, то нужно его удалить.
    часть скрипта ниже
    Код (LotusScript):
    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 то первый цикл падает в ошибку
    Как решить эту проблему?
    Заранее благодарен
     
  2. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Жесть...
    Одним циклом можно делать, но понадобится вьюха.

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


    Код (LotusScript):
    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
     
  3. Erlan

    Erlan Member

    Регистрация:
    9 апр 2012
    Сообщения:
    11
    Симпатии:
    0
    спасибо за ответ, сделаю
    а хотелось бы знать почему там в ошибку падал, у лотуса есть какие то ограничения по поиску в различных представлениях?
     
  4. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    еще рекомендую сделать до цикла
    view_notisp.Autoupdate = false
    а после цикла вернуть
    view_notisp.Autoupdate = True

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

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

    Erlan Member

    Регистрация:
    9 апр 2012
    Сообщения:
    11
    Симпатии:
    0
    нашел код ошибки
    NOTES_ERR_DOC_NOTINVIEW = 4151;
    как я понял он говорит, что документа нет в представлении, хотя он есть( в дебагере смотрю он не изменился ).
    ок, теперь буду знать, и сделаю по другому.
    Вам savl спасибо большое
     
  6. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    4151 можно словить, если получить один и тот же док из разных вьюх, что походу и происходит в вашем случае.
     
  7. Erlan

    Erlan Member

    Регистрация:
    9 апр 2012
    Сообщения:
    11
    Симпатии:
    0
  8. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    770
    Симпатии:
    50
    Off: Запустил я Norton Commander, смотрю у меня справа диск "Ц" и слева диск "Ц", подумал "зачем мне два диска "Ц"?". Взял и удалили один... :)
     
  9. Shandrik

    Shandrik Well-Known Member

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

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


    Хотя, скорее всего, Вы вообще не так задачу решаете.
     
Загрузка...
Похожие Темы - Сравнение Документов Из
  1. k85
    Ответов:
    2
    Просмотров:
    1.149
  2. clas
    Ответов:
    3
    Просмотров:
    1.602
  3. juk-777
    Ответов:
    29
    Просмотров:
    4.705
  4. aank10
    Ответов:
    3
    Просмотров:
    1.967
  5. oluh123
    Ответов:
    8
    Просмотров:
    2.637

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