Обновление индекса для вью

Тема в разделе "Lotus - Программирование", создана пользователем DNT, 1 фев 2007.

  1. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    Предистория: в базу документы заносятся путем срабатывания агента на приход новой почты. В пришедшем письме - вложеный файл Excel, на основании которого создаются документы в БД. За один запуск этот агент формирует около 50000 (!) документов.

    Проблема: когда пользователь заходит в эту БД и открывает вью - приходится очень долго ждать пока отобразятся все документы. Вторично зайдя в эту вьюху никакой задержки не наблюдается (индексы, я так полагаю, уже сформировались).

    Вопрос: можно ли после формирования документов сказать программно "Сформировать индексы для вью", потому как формирование индексов для БД в целом результата не даёт.

    P.S. Знаю, что теоретически в вопросах индексов "плаваю" поэтому сильно не пинайте.
    Спасибо.
     
  2. Ogion7

    Ogion7 Гость

  3. Elena Nefedova

    Elena Nefedova Гость

    Я тоже использую Call notesView.Refresh, правда только для того, чтобы кодом можно было поймать вновь созданные документы.
    Если у вас получится с UI-интерфейсом, то киньте сюда сообщение.
     
  4. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    Для: Ogion7
    Для: Elena Nefedova

    Если я правильно понял, то мне, по завершении работы основного агента, нужно инициализировать каждое из моих представлений Set View=db.GetView("Имя") и потом Call View.Refresh для каждого? Это построит индексы? Если так, счас попробую

    Для: Elena Nefedova

    Мне ж надо на сервере в агенте по приходу почты выполняться? UI разве можно использовать?
     
  5. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    Получилось! <_<

    Dim view As NotesView
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim views As Variant

    Set db = session.CurrentDatabase
    views = db.Views
    Forall v In views
    Set View=v
    Print Cstr(Time$) + " Start update index for: " + Cstr(view.Name)
    Call View.Refresh
    Print Cstr(Time$) + " Stop update index for: " + Cstr(view.Name)
    End Forall

    Внимание новый вопрос: как отследить что Call View.Refresh уже выполнился? Это возможно?
     
  6. Elena Nefedova

    Elena Nefedova Гость

    <!--QuoteBegin-DNT+1:02:2007, 13:29 -->
    <span class="vbquote">(DNT @ 1:02:2007, 13:29 )</span><!--QuoteEBegin-->Мне ж надо на сервере в агенте по приходу почты выполняться? UI разве можно использовать?
    [snapback]54664" rel="nofollow" target="_blank[/snapback]​
    [/quote]Имеется в виду UI как User Interface, а не как классы UI


    <!--QuoteBegin-DNT+1:02:2007, 13:59 -->
    <span class="vbquote">(DNT @ 1:02:2007, 13:59 )</span><!--QuoteEBegin-->как отследить что Call View.Refresh уже выполнился? Это возможно?
    [snapback]54674" rel="nofollow" target="_blank[/snapback]​
    [/quote]Второй Print выполнится только после завершения метода Refresh. Чтобы это понять, надо 1-й и 2-й Print выполнить с разными аргументами. Иначе лотус только одну строку может напечатать в StatusBar'е


    Самое-то главное: Будет ли обновляться вьюха в пользовательском интерфейсе после завершения работы данного кода?
     
  7. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    Для: Elena Nefedova

    На самом деле в живом коде у меня нет Print, я веду локальный "Журнал запуска агента". Записи добавляются в RText поле. Всё красиво получается:

    ...

    13:35:27 Start update index for: Абоненты
    13:35:27 Stop update index for: Абоненты
    13:35:27 Start update index for: Абоненты по услугам
    13:36:25 Stop update index for: Абоненты по услугам
    13:36:25 Start update index for: Настройки
    13:36:25 Stop update index for: Настройки
    ...

    Моя задача была, чтоб человек зайдя в БД и во вьюху не испытывал "тормозов" при её (вьюхи) открытии.
    При помощи вызова Call View.Refresh после накопления документов, эта задача реализована. Это ответ на ваш вопрос?

    Интересные цифры из лога: на обработку 11 файлов Excel (с их предварительным разархивированием из входящего письма) и формирование около 50 000 документов тратится менее 3-х минут, в то время на обновление индекса для 10-ти вьюх уходит 12 (!) минут....
     
  8. Elena Nefedova

    Elena Nefedova Гость

    <!--QuoteBegin-DNT+1:02:2007, 15:44 -->
    <span class="vbquote">(DNT @ 1:02:2007, 15:44 )</span><!--QuoteEBegin-->Моя задача была, чтоб человек зайдя в БД и во вьюху не испытывал "тормозов" при её (вьюхи) открытии.
    При помощи вызова Call View.Refresh после накопления документов, эта задача реализована. Это ответ на ваш вопрос?
    [snapback]54711" rel="nofollow" target="_blank[/snapback]​
    [/quote]Спасибо, это как раз нужный мне ответ - очень не хотелось генерить 50000 документов для теста :)
     
  9. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    Для: Elena Nefedova

    Вопрос не по теме (просто раньше вы об этом упоминали): как обрабатывать входящие документы на событие "Before new..."? Другими словами как из коллекцию, например сделать? Их ведь ещё нет в $Inbox... Или они будут в db.UnprocessedDocuments?

    И теоретический вопрос: чем плох триггер "After new..."?
     
  10. Ogion7

    Ogion7 Гость

    Когда-то делал, не обновляется :)

    Из хелпа пo view.Refresh

     
  11. Elena Nefedova

    Elena Nefedova Гость

    Нельзя коллекцию сделать. Документы в базу по одному добавляются.

    Да ничем он не плох. Все зависит от того, какая на сервере очередь агентов имеется.
    Но в семерке есть глючок - если добавить критерий отбора в After new.., то не обрабатываются документы, пока индексер не отработает - "зависают" надолго, и это раздражает пользователя.
     
  12. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    <!--QuoteBegin-Elena Nefedova+1:02:2007, 15:50 -->
    <span class="vbquote">(Elena Nefedova @ 1:02:2007, 15:50 )</span><!--QuoteEBegin-->Да ничем он не плох. Все зависит от того, какая на сервере очередь агентов имеется.
    Но в семерке есть глючок - если добавить критерий отбора в After new.., то не обрабатываются документы, пока индексер не отработает - "зависают" надолго, и это раздражает пользователя.
    [snapback]54720" rel="nofollow" target="_blank[/snapback]​
    [/quote]


    Да есть такое дело, замечал, но не знал что это индексер работает.
    Так, всё таки, как документы вытягивать при "Before new..."?
     
  13. Elena Nefedova

    Elena Nefedova Гость

    <!--QuoteBegin-DNT+1:02:2007, 17:02 -->
    <span class="vbquote">(DNT @ 1:02:2007, 17:02 )</span><!--QuoteEBegin-->Так, всё таки, как документы вытягивать при "Before new..."?
    [snapback]54721" rel="nofollow" target="_blank[/snapback]​
    [/quote]Session.DocumentContext
    Кстати, это и для веба тоже подходит.
     
  14. nor

    nor Гость

    Для: DNT

    Уважаемый, DNT. У меня к вам пару вопросов, которые меня заинтересовали.

    1. Как происходит разархивирование эттачмента в письме? Поделитесь кодом, если можно.
    2. Какое общее количество докуиментов в бд? Каков размер бд? Если одно письмо генерирует 50 000 документов, то 10 писем сгенирирует 500 000 документов? А 100 писем? И это все хранится и отображается в лотусовой базе?
     
  15. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    Для: nor

    Уважаемый это сильно. :D

    Ответы:

    <!--QuoteBegin-nor+3:02:2007, 22:19 -->
    <span class="vbquote">(nor @ 3:02:2007, 22:19 )</span><!--QuoteEBegin-->1. Как происходит разархивирование эттачмента в письме? Поделитесь кодом, если можно.
    [snapback]54930" rel="nofollow" target="_blank[/snapback]​
    [/quote]

    ...

    If ( o.Type = EMBED_ATTACHMENT ) Then
    FileName$ = Cstr(o.Source) ' имя файла
    TempDir$ = Environ("Temp") 'темповая директория Windows
    Call o.ExtractFile( TempDir$ & "\" & FileName$) 'извлекаем файл на диск
    'распаковываем 7z
    comand$ = "CMD.EXE /C c:\Arc\7z.exe e -y -o" + TempDir$ +" "+ TempDir$ & "\" & FileName$
    'вариант с winrar-ом
    'comand$ = "CMD.EXE /C c:\Arc\winrar.exe e -y "+ TempDir$ & "\" & FileName$ +" "+TempDir$
    rezult = Shell(comand$,1)
    Sleep 1

    'ПРОЦЕДУРА ОБРАБОТКИ ФАЙЛА
    'ОБРАБОТКА ФАЙЛА STOP

    Kill TempDir$ & "\" & FileName$
    End If
    ...


    <!--QuoteBegin-nor+3:02:2007, 22:19 -->
    <span class="vbquote">(nor @ 3:02:2007, 22:19 )</span><!--QuoteEBegin-->2. Какое общее количество докуиментов в бд? Каков размер бд? Если одно письмо генерирует 50 000 документов, то 10 писем сгенирирует 500 000 документов? А 100 писем? И это все хранится и отображается в лотусовой базе?
    [snapback]54930" rel="nofollow" target="_blank[/snapback]​
    [/quote]

    БД "мэйл-иновская" в неё приходит почта от оператора моб. связи один раз в месяц по каждому из предприятий корпоративной группы. В этих письмах приаттаченные файлы с раскладкой звонков по каждому корпоративному абоненту - отсюда такое кол. документов: на каждый звоночек создается документик. Цифра 50 000 получилась при обработке 11 предприятий за один месяц. Т.е. другими словами наполняемость БД примерно 50k документов в месяц.
     
  16. nor

    nor Гость

    очень интересно, спасибо
     
Загрузка...

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