Обновление внедренной вьюхи в доке

Тема в разделе "Lotus - Программирование", создана пользователем Klido, 17 дек 2009.

  1. Klido

    Klido Гость

    Внедренная вьюха с экшеном, создающим док в эту вьюху (запуск агента) - просто так без ручного рефреша док не отображает сразу...
    Авторского доступа у юзера к основному доку нет.
    ws.CurrentDocument.Refresh из агента не катит - команда недоступна в данном контексте - оно и понятно...
    @-обновления ничего не делают из-за режима чтения...

    Анриал из чтения обновить вьюху или есть способ?
     
  2. ToxaRat

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

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    Klido
    ставь в свойсве вида индекс - автоматикал
    и юзай скрипт
    ws.ViewRefresh
     
  3. Klido

    Klido Гость

    стоит, конечно...


    ага, оно - вот я про что забыл :) спсб
     
  4. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Задолбался...
    Все начальные условия, как и всегда были выполнены: у внедрённого представления было выставлено обновление индекса в Automatic + в форме создаваемого документа всё было сделано, как описано:
    но документ после создания и закрытия не отображался.

    Пробовал в коде создания документа в виде отлавливать события QuerySave и onUnload создаваемого UI-документа, а в обработчиках обновлять вид, но не получалось, т.к. обновление происходило в контексте хоть и закрываемого, но ещё открытого на экране создававшегося документа.

    Пробовал перебросить код в агент, чтобы при завершении агента документ обновился, но это не помогло, т.к. из агентов не работает отлов событий (On Event) создаваемого UI-документа.

    Генерировать переоткрытие документа с внедрённым представлением не стал, т.к. это чревато в случаях, когда были нажаты какие-либо действия внедрённого вида, на которых установлен отлов каких-то внешних событий.

    Помогло дополнительно к начальным условиям установка галки «Automatically refresh fields» в свойствах формы, содержащий внедрённый вид.
     
  5. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Блин, даже эта галка в некоторых случаях не работает...(
    Сделал бэкграундный LS-агент, который должен в цикле определять, закрылся ли созданный документ, а потом делать nuiws.ViewRefresh() и завершать агент, но оно работает как-то через раз - валит клиента. Думаю, может можно сделать это как-то на Java? Что посоветуете?
     
  6. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    VladSh
    Если открываешь документ не в диалоге, то весь код выполняется до конца, даже если документ уже открыт на экране.
    попробуй 2 раза вызывать подряд на сохранении или закрытии : Call nuiwsView.ViewRefresh
    Может стоит переработать именно с переоткрытием? при создании данного докмента - закрывать основной, затем при закрытии нового - открывать.
     
  7. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Это общеизвестно) Но On Event всё-таки работает по открытому доку, просто Call nuiwsView.ViewRefresh выполняется не в контексте документа с внедрённым видом, а в контексте созданного документа.

    Это работает только при закрытии создаваемого документа из обычного вида, не внедрённого. Чтобы док отображался во внедрённом надо кроме вида (Call nuiwsView.ViewRefresh) ещё и рефрешить документ - в виде-то док появляется, - я кнопку добавил, которая показывает количество энтрисов до и после создания-сохранения-закрытия, и док реально в виде добавляется, но не отображается в во внедрённом виде, т.к. именно документ надо обновлять. Для ситуации EditMode всё работает, вот
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">скрипт</div></div><div class="sp-body"><div class="sp-content">
    Код (LotusScript):
    Sub Initialize
    Set view_nuiws = New NotesUIWorkspace
    Set view_nuiv = view_nuiws.CurrentView
    Set view_nuid = view_nuiws.CurrentDocument
    End Sub

    Sub Queryclose(Source As Notesuidocument, Continue As Variant)
    If Not view_nuiv Is Nothing Then
    Call view_nuiv.View.Refresh()
    End If

    Call view_nuiws.ViewRefresh()

    If Not view_nuid Is Nothing Then
    If view_nuid.EditMode Then
    Call view_nuid.Refresh()    'здесь работает, но только если не перевести основной в ReadMode с помощью Ctrl+E
    Else
    'здесь пробовал так
    view_nuid.Document.ReplaceItemValue("$DOCUMENTUPDATE", 1).savetodisk = 0
    Call view_nuid.Close()
    'а на QC основного проверяю и вычищаю этот item, но при вычищении - проблема изменения документа - начинает спрашивать, сохранить или нет, т.е. этот вариант отпадает...
    End If
    End If
    End Sub
    В основном есть несколько внедрённых вьюх, из каждой может создаваться свой документ, если переоткрыть, то другие документы, созданные из основного, при закрытии не переоткроют основной, т.к. при первом переоткрытии во всех вспомогательных разрушится первоначальный UI-контекст основного документа.

    Идеальным вариантом было бы как-то после закрытия любого документа выполнять код в основном, допустим эмулировать нажатия кнопки с Call nuiws.ViewRefresh(), но как это сделать пока непонятно.
     
  8. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Решил запуском бэкграундного агента на Onunload форм создаваемых-сохраняемых-закрываемых документов с обновлением основного.
    Код агента:
    Код (LotusScript):
    Dim nuiws As NotesUIWorkspace
    Sleep(1)
    Set nuiws = New NotesUIWorkspace
    Call nuiws.ViewRefresh()
    Всё работает и в режиме редактирования, и в режиме чтения. Единственное, что часики на пол секунды появляются после закрытия документа, и сам док во внедрённой вьюхе появляется не мгновенно.
    Решение от галки «Automatically refresh fields» в свойствах формы не зависит.
     
  9. azat20

    azat20 Well-Known Member

    Регистрация:
    22 июл 2008
    Сообщения:
    244
    Симпатии:
    0
    В Declarations
    Код (LotusScript):
    Declare Sub keybd_event Lib "user32.dll" (Byval bVk As Integer, Byval bScan As Integer, Byval dwFlags As Integer,Byval dwExtraInfo As Integer)
    В PostSave
    Код (LotusScript):
    keybd_event &h78,0,0,0
    понятное дело, работает только под Win
     
  10. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Azat
    Ранее в этих местах использовался код для эмуляции нажатия F9; изыскания были как раз по причине ухода от WinAPI.
     
  11. Darkhan

    Darkhan Well-Known Member

    Регистрация:
    14 дек 2012
    Сообщения:
    95
    Симпатии:
    4
    Есть еще "хардкорный" NotesTimer, который можно посадить в контекст дока(вьюхи), и дальше играться с переменными окружения.... но это просто хлипкая подпорка))
     
  12. Mitya

    Mitya Well-Known Member

    Регистрация:
    13 июн 2012
    Сообщения:
    111
    Симпатии:
    0
    Так я и не понял... что, как B)

    Пробую отловить uidoc основного документа, делаю так:
    1) Создаю "Library" (Declaration) Public uidoc As NotesUIDocument
    2) В основном док (Global) Use"Library" + в (Postopen) Set uidoc=Source
    3) Подключаю библиотеку к виду, и в конце акции вида делаю Call uidoc.Refresh

    Object variable not set :blink: есть у меня шанс, иду к успеху?
     
  13. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    К красному экрану)))
    Mitya
    условия какие? вьюха где находится? может все проще можно.
    P.S. uidoc в представлении кто будет заполнять? для формы и для вьюхи - разные контексты.
     
  14. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Mitya
    пацан к успеху шел
    Варианты "как сделать" находятся ниже того сообщения, на которое вы дали цитату.
     
  15. Mitya

    Mitya Well-Known Member

    Регистрация:
    13 июн 2012
    Сообщения:
    111
    Симпатии:
    0
    :D

    Новый день ничего не принес. А могло и фортануть.
    I need help
    1) бэкграунд агент - это агент с поднятым флагом "Run in background client thread" ?
    2) Во внедренном представлении акция выполняет:
    Код (Text):
    ....
    Set docnew = db.CreateDocument
    docnew.Form = "Test"
    Call docnew.ReplaceItemValue("1",doc.1)
    Call docnew.ReplaceItemValue("2",doc.2)
    Call docnew.Save(True, False)
    ....
    3) В самой форме "Test" (onUnload) @Command([RunAgent];"RefreshAgent")
    4) И, если я правильно понял, то внедренное представление никак не связано с документом?
    Меня все не отпускает возможность отловить UI основного документа, и обновлять это UIDoc в акции внедренного представления.

    p.s. хм.. так OnUnload - обработчик события, возникающего перед закрытием документа по форе. А я же docNew не открываю по форме =(
     
  16. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Попробуй так ловить основной документ, потом в Action делать refresh. На твой страх и риск.
    Код (LotusScript):
    Sub Postopen(Source As Notesuiview)

    Set viewUI = Source ' Объявлен в (Globals)
    Dim ws As New NotesUIWorkspace

    Set parentUIDoc = ws.CurrentDocument ' Объявлен в (Globals)
    Set parentDoc = parentUIDoc.Document ' Объявлен в (Globals)
     
  17. Mitya

    Mitya Well-Known Member

    Регистрация:
    13 июн 2012
    Сообщения:
    111
    Симпатии:
    0
    Страх оправдан, лотус завалился на строке Call parentUIdoc.Refresh в Акции внедренного представления =))

    Так все же, как обновить внедренное представление в документа, если в представлении по акции создается новый документ без открытия по форме.

    Как вариант, вынести акции представления на форму документа. Но это не вариант :D
     
  18. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Вот в который раз убеждаюсь...
    Сделать что надо? Обновить документ или представление?

    Представление обновляется кодом в Actions:
    Код (LotusScript):
            Dim ws As New NotesUIWorkspace
    Call ws.ViewRefresh
    Call ws.ViewRefresh
     
  19. Mitya

    Mitya Well-Known Member

    Регистрация:
    13 июн 2012
    Сообщения:
    111
    Симпатии:
    0
    У меня работает, если док сохранен, а вот если он новый... хоть 3 раза Call ws.ViewRefresh - и ничего
    а сохранять док перед акцией вообще не хочется.

    И зачем 2 раза вызывать ViewRefresh, если не сложно

    ВОТ! Нужно обновить новый док по акции внедренного представления, для того, чтобы отобразить все добавленные документы по акции
     
  20. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Mitya
    А вот добавленные документы как связываются?
    Прописываешь в них UNID "нового" документа и тогда они отображаются?
    Если все так как я описал, то тебе надо сохранять документ перед добавлением.
    И выводить сообщение, что мол необходимо сохранить. Сэкономишь кучу времени и нервов.
     
Загрузка...

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