1. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление

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

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

  1. engao

    engao Гость

    Репутация:
    0
    Доброго времени суток.

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

    Спасибо!
     
  2. nvyush

    nvyush Well-Known Member
    Lotus team

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

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

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

    Akupaka А че я?.. О.о

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

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

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

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

    engao Гость

    Репутация:
    0
    Задача такая.

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

    nvyush Well-Known Member
    Lotus team

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

    Akupaka А че я?.. О.о

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

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

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

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

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

    Akupaka А че я?.. О.о

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

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

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

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

    engao Гость

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

    Klido Гость

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

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

    engao Гость

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

    Klido Гость

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

    Akupaka А че я?.. О.о

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

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

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

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

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

    Akupaka А че я?.. О.о

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

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

    Репутация:
    0
    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Код:
    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 Well-Known Member
    Lotus team

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

    Код:
    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...
     
Загрузка...
Похожие Темы - View для отлова
  1. Amfion
    Ответов:
    2
    Просмотров:
    1.114
  2. hosm
    Ответов:
    2
    Просмотров:
    1.952
  3. fedotxxl
    Ответов:
    0
    Просмотров:
    1.875
  4. mike
    Ответов:
    9
    Просмотров:
    4.313
  5. androtech
    Ответов:
    0
    Просмотров:
    158

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