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

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

  1. DNT

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

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    На форме есть встроенное вью, на "Queryopendocument" которого открывается документ в диалогбоксе, выполняются некоторые действия пользователем - вводятся данные в документ.
    Далее документ с диалогбоксом вместе закрываются и я автоматически нужно обновить некоторые "статистические данные" в исходном документе.
    Сейчас это происходит так :

    Код (LotusScript):
    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?
    Может вынести эти данные в другой фрейм и там както красиво рефрешить?
    Ткните меня в нужном направлении.
    СПС.
     
  2. alexas1

    alexas1 Lotus team
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    562
    Симпатии:
    214
    Я правильно понял, что по данным из вьюх обновляется тот же док?
    В диалогбоксе, сразу на открытии, получить "старые" view.EntryCount.
    Перед сохранением вычислить, на базе введённого "новые" значения (ведь понятно, как они изменятся, не обязательно вычислять итог вьюшкой).
    Итог - одно сохранение вместо двух.
     
  3. DNT

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

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    Да, правильно понял. Попробую такой подход. Спасибо. Но там осложнения: надо учитывать по какой форме открыт док, надо дать пользователю отменить введенные данные, соответственно делать -1...
    Хотелось "прозрачности" что ли: ввод, удаление это один процесс - подсчет итогов другой.
    Попробую, но первое что приходит на ум - возможно теперь будут лаги с открытием документа для ввода. Буду пробовать.

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    не помню - есть ли саммари в колонках через ЛС
     
  5. alexas1

    alexas1 Lotus team
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    562
    Симпатии:
    214
    Будет тот же лаг, только "вид сбоку".
    Обязательно будет, если делать "влоб" - брать EntryCount надо на PostOpen уже после появления формы в UI.
    Пример, как это сделать http://codeby.net/forum/threads/50686/page-2#post-255828 на JS.
    Или background агентом на клиенте (запускать его только собакой!)

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

    Этого должно быть достаточно.
     
    2 пользователям это понравилось.
  6. DNT

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

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    не могу въехать никак в это... объясни в двух словах но подробнее, плиз
     
  7. alexas1

    alexas1 Lotus team
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    562
    Симпатии:
    214
    Я, всего лишь, имел ввиду, что не всегда можно применить собаки, где хочется.
    В твоём случае, логично запускать 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
    При сохранении, дизигнер будет страшно пугать - плюёшь:)
    В теле типа:
    Код (LotusScript):
    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
     
Загрузка...

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