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

DNT

Постоялец форума
Lotus team
12.10.2005
590
2
#1
Предистория: в базу документы заносятся путем срабатывания агента на приход новой почты. В пришедшем письме - вложеный файл Excel, на основании которого создаются документы в БД. За один запуск этот агент формирует около 50000 (!) документов.

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

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

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

Elena Nefedova

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

DNT

Постоялец форума
Lotus team
12.10.2005
590
2
#4
Для: Ogion7
Для: Elena Nefedova

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

Для: Elena Nefedova

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

DNT

Постоялец форума
Lotus team
12.10.2005
590
2
#5
Получилось! <_<

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 уже выполнился? Это возможно?
 
E

Elena Nefedova

#6
<!--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'е


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

DNT

Постоялец форума
Lotus team
12.10.2005
590
2
#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 (!) минут....
 
E

Elena Nefedova

#8
<!--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 документов для теста :)
 

DNT

Постоялец форума
Lotus team
12.10.2005
590
2
#9
Для: Elena Nefedova

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

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

Ogion7

#10
Самое-то главное: Будет ли обновляться вьюха в пользовательском интерфейсе после завершения работы данного кода?
Когда-то делал, не обновляется :)

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

This method does not refresh the front-end view that the interactive user sees, nor does it rebuild the front-end view. See ViewRefresh and ViewRebuild in NotesUIWorkspace.
 
E

Elena Nefedova

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

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

DNT

Постоялец форума
Lotus team
12.10.2005
590
2
#12
<!--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..."?
 
E

Elena Nefedova

#13
<!--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
Кстати, это и для веба тоже подходит.
 
N
#14
Для: DNT

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

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

DNT

Постоялец форума
Lotus team
12.10.2005
590
2
#15
Для: 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 документов в месяц.