View для отлова дублирующихся данных

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

  1. engao

    engao Гость

    Доброго времени суток.

    Как можно построить в Лотусе view для отображения документов с дублирующимися данными (например: в 2-х разных документах в поле Email одинаковые значения)?

    Спасибо!
     
  2. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    engao
    Первый столбец — категоризованный с формулой типа Email + " (" + @DocDescendants + ")", второй — полем номера документа или другим, идентифицирующим документ.
     
  3. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    engao
    не согласен что для этого необходимо создавать вид, лишь увеличиваете нагрузку на сервер
     
  4. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    если целью есть проверка на дублирование при создании документа, то делаешь вид с сортировкой по ключу и производишь при сохранении документа поиск по виду NotesView.GetDocumentByKey(), если идет пересохранение документа, то пригодится еще и проверка унидов сохраняемого и найденного документов.

    "А Баба Яга против!" )) ты предложение тогда свое опубликуй, а не только смуту наводишь :)
     
  5. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    Akupaka
    Баба Йога говорит, что существует КУЧА способов проверить дублирующие данные, но для начала стоило бы более детально описать задачу :)
     
  6. engao

    engao Гость

    Задача такая.

    Ксть база и в ней 500 тыщ документов. При создании этих 500 тыщ документов никто с проверкой данных не заморачивался.
    Теперь стоит задача - навести порядок. Например убрать дублирующиеся записи по полю Email. Но автоматом удалять нельзя, все это должно быть сделано вручную. Вот нужна такая View для пользователей.
     
  7. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Кмк, лучше сделать приватную папку и складывать туда повторяющиеся записи агентом, ищущем повторы. Так можно выбрать только дублирующиеся записи. То, что я предлагал выше, выведет все документы, и выискивать среди них повторы пользователю будет затруднительно.
     
  8. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    думаю, в этом случае будет наиболее удобным вид описанный nvy
    вид с категорией по ключу поиска. только кол-во документов в категории я бы сделал через тоталз.
    после отлаживания, если видом не будут пользоваться, его можно убить, либо только индекс, а индексацию сделать ручной, чтобы сервер не заморачивался. имхо.
    зы: а предварительно, реализовать механизм проверки добавления дублирующих записей, чтобы очистка была одноразовой ;)

    А что скажет Баба Йога? ))

    зы2: а с папкой даже интереснее.
     
  9. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    Akupaka
    скажу, что правильнее всего было бы для начала запустить агент, который пометит дубликаты и вышлет их или почтой, или через ексель с гиперсылкой или уже в отдельную папку/вид, но уж никак не создавать вид, который будет играться с 500К доков ;)
     
  10. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    что такое 500 тыщ доков? тьфу! тем более, если отображать два-три небольших поля

    Добавлено:
    а он их должен как перебрать? может dbseach выполнять?
     
  11. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    Akupaka
    берем все доки, загоняем в свой класс, перебираем в памяти, получаем необходимое, оформляем красиво результат
    если всё делать на стороне сервера то 500К переберутся менее чем за минуту
     
  12. engao

    engao Гость

    В итоге получаем что-то вроде очета, но никак не view?
     
  13. Klido

    Klido Гость

    в рамках задачи - как-то много :) если нет готового "своего" класса, реализованного перебора, красоты оформления - насколько трудоемкость превысит вьюху по 1-му полю (которое ищут)?

    а сколько потенциально е-мэлов разных в этих 500К доков?
     
  14. engao

    engao Гость

    E-mail - частный случай. Я думаю, будет около 5% всех документов. Как вариант думаю использовать NotesSQL и слить данные в Ms Access и там обработать, но задача в том, что это нужно ежедневно.
     
  15. Klido

    Klido Гость

    выше уже написали - сразу при получении задачи надо внедрить контроль при создании, а затем уже разгрести остальное...
    и все-таки - нужна нормализация по нескольким ключам или...? Если по 3-5 ключам - руками быстрее через вьюхи, если сложнее - да, слить в реляционку, например, DECSом... Что там с ними делать - другой вопрос...
     
  16. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    надеюсь, ты шутишь
     
  17. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    А что такого? Завести список(list) байтов(byte) для каждого поля. Ключ ограничить, например, 200 символами. Достаточно быстро всё проверим. Памяти должно хватить.

    Добавлено: Класс, по-моему, здесь лишний. И так достаточно просто. :)

    Добавлено: Проверил на 70 тыс. Две минуты и сорок секунд на перебор с проверкой унида. Заодно дергал значение поля.
    Памяти по расчетам список кушает 70000*32*2+70000=4.3Мб. В реальности больше выйдет.
    Самое долгое выйдет - это представление информации. Например, в папку кидать.
     
  18. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Medevic
    код не жалко показать? че-то я не понял, что именно ты делал для проверок.
    или алгоритьм подробный
     
  19. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Код (Text):
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim doc As NotesDocument
    Dim dc As NotesDocumentCollection
    Dim l List As Byte
    Dim tag As String
    Dim i As Long
    Dim k As Long

    Set db = session.CurrentDatabase

    Set dc = db.Search({@All}, Nothing, 0)
    i = dc.Count
    k = 0
    Set doc = dc.GetFirstDocument()
    While Not (doc Is Nothing)
    tag = doc.GetItemValue("Author")(0)
    tag = doc.UniversalID
    If Not Iselement(l(tag)) Then
    l(tag) = 1
    Else
    'повтор
    k = k + 1
    End If
    i = i - 1
    Print Cstr(i) + " " + Cstr(k)
    Set doc = dc.GetNextDocument(doc)
    Wend
     
  20. rinsk

    rinsk Lotus team
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    799
    Симпатии:
    78
    Первый столбец категоризируем, во втором - Total

    Код (Text):
    Sub Initialize()
    Dim s As New NotesSession
    Dim db As NotesDatabase
    Dim v As NotesView
    Dim nv As NotesViewNavigator
    Dim en As NotesViewEntry
    Dim cl As NotesDocumentCollection
    Dim doc As NotesDocument
    Set db=s.Currentdatabase
    Set v=db.Getview("$MessageID")
    v.Autoupdate=false
    Set nv=v.Createviewnav()
    Set en=nv.Getfirst()
    Do While Not en Is Nothing
    If en.Columnvalues(3)>1 then
    'Print en.Columnvalues(0) & "--" &en.Columnvalues(3)
    Set cl=v.Getalldocumentsbykey(en.Columnvalues(0),true)
    Set doc=cl.Getfirstdocument()
    Call cl.Deletedocument(doc)
    'Call cl.Putallinfolder("Dubl") ' если надо - то в папку
    Call cl.Removeall(true) ' я решил грохать сразу
    End If
    Set en=nv.Getnextcategory(en)
    Loop
    End Sub
    На 200 тыщ категорий работало секунд 20...
     
Загрузка...

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