Онлайн обновление полей на форме.

DNT

Постоялец форума
Lotus team
12.10.2005
594
2
#1
На форме есть встроенное вью, на "Queryopendocument" которого открывается документ в диалогбоксе, выполняются некоторые действия пользователем - вводятся данные в документ.
Далее документ с диалогбоксом вместе закрываются и я автоматически нужно обновить некоторые "статистические данные" в исходном документе.
Сейчас это происходит так :

Код:
Dim db As NotesDatabase
Set db = ws.CurrentDatabase.Database
Dim view As NotesView
 
Set  view = db.GetView("(CNTDataWeek)")
Call ws.CurrentDocument.FieldSetText ("week",Cstr(view.EntryCount))
 
Set  view = db.GetView("(CNTDataPeriod)")
Call ws.CurrentDocument.FieldSetText ("period",Cstr(view.EntryCount))
 
Set  view = db.GetView("(CNTDataToday)")
Call ws.CurrentDocument.FieldSetText ("day",Cstr(view.EntryCount))
 
Set  view = db.GetView("(CNTDataUpload)")
Call ws.CurrentDocument.FieldSetText ("upload",Cstr(view.EntryCount))
т.е. в базе есть вьюшки в которые отбираются определенным образом документы, этот код считает кол-во доков в каждой вьюхе и обновляет поля в документе.
Все работает. Но есть видимые "зависоны" UI: на полсекунды виден лаг. Т.е. тормозит такой подход.

Как-бы реализовать это дело более красиво? JavaScript?
Может вынести эти данные в другой фрейм и там както красиво рефрешить?
Ткните меня в нужном направлении.
СПС.
 

alexas1

Lotus team
10.04.2014
726
145
#2
Я правильно понял, что по данным из вьюх обновляется тот же док?
В диалогбоксе, сразу на открытии, получить "старые" view.EntryCount.
Перед сохранением вычислить, на базе введённого "новые" значения (ведь понятно, как они изменятся, не обязательно вычислять итог вьюшкой).
Итог - одно сохранение вместо двух.
 

DNT

Постоялец форума
Lotus team
12.10.2005
594
2
#3
Да, правильно понял. Попробую такой подход. Спасибо. Но там осложнения: надо учитывать по какой форме открыт док, надо дать пользователю отменить введенные данные, соответственно делать -1...
Хотелось "прозрачности" что ли: ввод, удаление это один процесс - подсчет итогов другой.
Попробую, но первое что приходит на ум - возможно теперь будут лаги с открытием документа для ввода. Буду пробовать.

Еще будут идеи? Интересны варианты реализации.
Прошло на ум - форму статистики перенести в соседний фрейм, в поля забить формулы для взятия кол.документов из вьюх, а после добавления или удаления основных документов просто заставлять рефрешить фрейм.
Завтра попробую оба варианта - посмотрим какой быстрее.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#4
не помню - есть ли саммари в колонках через ЛС
 

alexas1

Lotus team
10.04.2014
726
145
#5
после добавления или удаления основных документов просто заставлять рефрешить фрейм.
Будет тот же лаг, только "вид сбоку".
возможно теперь будут лаги с открытием документа для ввода
Обязательно будет, если делать "влоб" - брать EntryCount надо на PostOpen уже после появления формы в UI.
Пример, как это сделать http://codeby.net/forum/threads/50686/page-2#post-255828 на JS.
Или background агентом на клиенте (запускать его только собакой!)

Кста, можно ващще не менять твою логику, но код с энтрикаунтами запихнуть, опять же, в background агент (если доступен его запуск собакой)

Этого должно быть достаточно.
 
Симпатии: Понравилось DNT

alexas1

Lotus team
10.04.2014
726
145
#7
не могу въехать никак в это... объясни в двух словах но подробнее, плиз
Я, всего лишь, имел ввиду, что не всегда можно применить собаки, где хочется.
В твоём случае, логично запускать background agent в Queryclose, а там у тебя уже может быть LS - @Command( [RunAgent] ; "MyBackgroundAgent" ) не запустить (LS agent run - не катит, evaluate("@...") - не катит), а на terminate собаку не запустить ... В общем, могут быть случаи, что background agent хрен запустишь, где надо.
По поводу агента:
trigger - action menu selection, taget - none, options - run in background clien thread
При сохранении, дизигнер будет страшно пугать - плюёшь:)
В теле типа:
Код:
Dim ws As New NotesUIWorkspace
Dim uiview As NotesUIView
Dim s As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Set uiview = ws.CurrentView
Set db = s.CurrentDatabase
Set doc = db.GetDocumentByID(uiview.CaretNoteID)
' doc - твой документ, который, ты только что закрыл
........
работа с энтрикаунтами\запись в doc
refresh ws