Выборка неповторяющихся по определённым полям документов

Тема в разделе "Lotus - Программирование", создана пользователем dimat, 18 июн 2010.

  1. dimat

    dimat Lotus team
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    Уважаемые программисты, помогите придумать алгоритм для решения следущуей задачи или подскажите с помощью чего ее можно решить.
    1. есть коллекция документов.
    2. документы созданы по форме, на которой 2 текстовый поля: название организации и этап работы с этой организацией.

    из коллекции необходимо убрать документы в который содержание полей одинаково, напрмер есть коллекция:
    (1) поле1=орг1, поле2=этап1
    (2) поле1=орг3, поле2=этап2
    (3) поле1=орг2, поле2=этап6
    (4) поле1=орг3, поле2=этап2
    (5) поле1=орг1, поле2=этап1
    (6) поле1=орг5, поле2=этап3

    на выходе должна быть коллекция вида:
    (1) поле1=орг1, поле2=этап1
    (2) поле1=орг3, поле2=этап2
    (3) поле1=орг2, поле2=этап6
    (4) поле1=орг5, поле2=этап3
     
  2. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    dimat
    Можно создать скрытое представление с двумя сортированными столбцами, соответствующими нужным полям, и установить галку Generate unique keys in index (5-я закладка). Только нужно в формуле отбора отсечь конфликтные документы (SELECT Form = "MyForm" & !@IsAvailable($Conflict) ).
    Другой вариант — создать категоризованное представление, где в качестве имени категории объединять значения нужных полей. В цикле перебирать Entry только категорий (см. Set notesViewNavigator = notesView.CreateViewNav; Set notesViewEntry = notesViewNavigator.GetNextSibling( entry ))
     
  3. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    Какая конечная цель данной коллекции? Что с ней делаться должно? Примерное кол-во документов в коллекции?
     
  4. dimat

    dimat Lotus team
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    На основании документов в этой коллекции формирую отчет, количество документов в пределах 50
     
  5. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    Если не принципиально какой из документов оставлять то можно так:

    Код (Text):
        Dim s As New NotesSession
    Dim coll As NotesDocumentCollection, doc As NotesDocument
    Dim ListDocumentID List As String, TAG As String
    Set doc = coll.GetFirstDocument
    While Not doc Is Nothing
    TAG = doc.GetItemValue("ПОЛЕ1")(0)+"~~"+doc.GetItemValue("ПОЛЕ2")(0)
    ListDocumentID(TAG) = doc.UniversalID
    Set doc = coll.GetNextDocument(coll)
    Wend

    'ListDocumentID - Тут уже документы с уникальными значениями из TAG
    Forall ID In ListDocumentID
    Set doc = s.CurrentDatabase.GetDocumentByUNID(ID)
    'Тут необходимые действия с документами
    End Forall
     
  6. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    КМК, лучше всё-таки сразу получить нужную выборку документов/ентрисов. я бы использовал вариант №1 ( http://codeby.net/ipb.html?s=&sh...st&p=174774 ), вывел все необходимые данные в столбцах представления и получал их по notesViewEntry.ColumnValues.
     
  7. Darker

    Darker Гость

    Лучше сразу из коллекции удалять
    Код (LotusScript):
        Dim coll As NotesDocumentCollection, doc As NotesDocument, tempDoc as NotesDocument
    Dim ListDocumentID List As String
    Set doc = coll.GetFirstDocument
    While Not doc Is Nothing
    Set tempDoc = doc
    Set doc = coll.GetNextDocument(doc)
    if Iselement(ListDocumentID(tempDoc.GetItemValue("ПОЛЕ1")(0)+"~~"+tempDoc.GetItemValue("ПОЛЕ2")(0))) then coll.DeleteDocument(tempDoc) else ListDocumentID(TAG)=""
    Wend
    и дальше юзать coll
     
  8. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    Ну если это представление будет делаться только для одного отчета то нафиг надо, а если таких отчетов будет 20 штук, и под каждое представление делать?

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



    Добавлено:
    Симпатичнее)
     
  9. leiba

    leiba Lotus team
    Lotus team

    Регистрация:
    18 июн 2010
    Сообщения:
    47
    Симпатии:
    0
    Очень понравился вариант Darker . Вот сразу в голову не пришло отсекать лишнее, а не выбирать нужное.

    P.S. Часто в отчетах бывает нужно количество документов с одинаковыми тэгами. Удобно подсчитывать его в элементах списка. В варианте с категоризированым представлением это тоже легко решается, а с видом с уникальным ключем, наверное нет.
     
  10. dimat

    dimat Lotus team
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    Всем спасибо. проблема решена:whoareyou?:
     
  11. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Эта дуристика с "удалением" не нужна вовсе.
    Если пользовать класс notesDocumentCollection, то дубликаты там невозможны по определению. Для теста попробуйте метод AddDocument, при добавлении уже существующего документа поймаете ошибку 4469.
     
  12. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    все верно. но тут вроде речь не про дубликаты документов, а про фильтрацию коллекции.
     
  13. Darker

    Darker Гость

    VladSh, вопрос относительный.
    К примеру есть мешок картошки, в котором нужно убрать гнилые.
    Есть два метода:
    1) Взять дополнительный пустой мешок, сшитый кустарным способом (в силу отсутствия стандартного метода получения нового пустого), и перекладывать туда не гнилые картофели
    2) Сразу взять мусорку и бросать туда гнилые, и останется у нас мешок нормальных

    Если у нас гнилых больше чем нормальных, то первый способ предпочтительней, в противном случае - второй



    ошибку 4469, поймать невозможно, так как документы берутся из коллекции
     
  14. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Darker
    Вариант 3-й и правильный (с точки зрения платформы) - получить коллекцию без гнилой картошки либо осуществить проход чисто по нормальной картошке :) для этого платформа предлагает кучу стандартных методов:
    1). Отстройка видов:
    а). Получение коллекций:
    - GetAllDocumentsByKey
    - GetAllEntriesByKey
    б). "Онлайн" проход с помощью NotesViewNavigator'а.
    2). Формирование строки запроса "на лету" и поиск - это notesDatabase.Search.

    Иногда бывают случаи, когда все отобранные документы нужны, но по различным условиям данные из них вытягиваются или запихиваются разные, а некоторые - общие, т.е. времени на проверку уйдёт гораздо меньше, чем 2 разных поиска и 2 разных перебора. Но таких случаев очень немного; в большинстве же подобные решения - это неправильное использование платформы.
     
  15. Darker

    Darker Гость

    VladSh, так задача тривиальная
    По мне, получение документов для разовой задачи, с использованием вида - накладно, создание индексов, и т.д., случаются случаи слета индексов.
     
  16. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Darker
    Чтобы индексы видов слетели это надо постараться. Слоган: "Берёшь вьюху - сделай ей Refresh!", никогда не подводило.
    При правильном проектировании приложений, вьюхи, по которым ищешь, не содержат большого количества документов, и доки в них не накапливаются.
    А бывают случаи, когда и для одного убойного отчёта лучше отстроить вьюху...
    notesDatabase.Search, и никаких тебе индексов.
     
Загрузка...

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