• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы Klido
  • Дата начала
K

Klido

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

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

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
Klido
ставь в свойсве вида индекс - автоматикал
и юзай скрипт
ws.ViewRefresh
 

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
53
Задолбался...
Все начальные условия, как и всегда были выполнены: у внедрённого представления было выставлено обновление индекса в Automatic + в форме создаваемого документа всё было сделано, как описано:
В событиях формы прописываем:

В (Declarations):
Dim nuiwsView As NotesUIWorkspace

На Initialize:
Set nuiwsView = New NotesUIWorkspace

На Queryclose и иногда на PostSave:
Call nuiwsView.ViewRefresh
но документ после создания и закрытия не отображался.

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

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

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

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

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
53
Блин, даже эта галка в некоторых случаях не работает...(
Сделал бэкграундный LS-агент, который должен в цикле определять, закрылся ли созданный документ, а потом делать nuiws.ViewRefresh() и завершать агент, но оно работает как-то через раз - валит клиента. Думаю, может можно сделать это как-то на Java? Что посоветуете?
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
159
VladSh
Если открываешь документ не в диалоге, то весь код выполняется до конца, даже если документ уже открыт на экране.
попробуй 2 раза вызывать подряд на сохранении или закрытии : Call nuiwsView.ViewRefresh
Может стоит переработать именно с переоткрытием? при создании данного докмента - закрывать основной, затем при закрытии нового - открывать.
 

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
53
Если открываешь документ не в диалоге, то весь код выполняется до конца, даже если документ уже открыт на экране.
Это общеизвестно) Но On Event всё-таки работает по открытому доку, просто Call nuiwsView.ViewRefresh выполняется не в контексте документа с внедрённым видом, а в контексте созданного документа.

попробуй 2 раза вызывать подряд на сохранении или закрытии : 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">
Код:
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(), но как это сделать пока непонятно.
 

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
53
Решил запуском бэкграундного агента на Onunload форм создаваемых-сохраняемых-закрываемых документов с обновлением основного.
Код агента:
Код:
Dim nuiws As NotesUIWorkspace
Sleep(1)
Set nuiws = New NotesUIWorkspace
Call nuiws.ViewRefresh()
Всё работает и в режиме редактирования, и в режиме чтения. Единственное, что часики на пол секунды появляются после закрытия документа, и сам док во внедрённой вьюхе появляется не мгновенно.
Решение от галки «Automatically refresh fields» в свойствах формы не зависит.
 
A

azat20

В Declarations
Код:
Declare Sub keybd_event Lib "user32.dll" (Byval bVk As Integer, Byval bScan As Integer, Byval dwFlags As Integer,Byval dwExtraInfo As Integer)
В PostSave
Код:
keybd_event &h78,0,0,0

понятное дело, работает только под Win
 

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
53
Azat
Ранее в этих местах использовался код для эмуляции нажатия F9; изыскания были как раз по причине ухода от WinAPI.
 

Darkhan

Green Team
14.12.2012
99
2
BIT
0
Есть еще "хардкорный" NotesTimer, который можно посадить в контекст дока(вьюхи), и дальше играться с переменными окружения.... но это просто хлипкая подпорка))
 
M

Mitya

Внедренная вьюха с экшеном, создающим док в эту вьюху (запуск агента) - просто так без ручного рефреша док не отображает сразу...
Klido сказал(а):
Для ситуации EditMode всё работает, вот
Код:
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

Так я и не понял... что, как 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: есть у меня шанс, иду к успеху?
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
159
есть у меня шанс, иду к успеху?
К красному экрану)))
Mitya
условия какие? вьюха где находится? может все проще можно.
P.S. uidoc в представлении кто будет заполнять? для формы и для вьюхи - разные контексты.
 
M

Mitya

Mitya
пацан к успеху шел
Варианты "как сделать" находятся ниже того сообщения, на которое вы дали цитату.
:D

Новый день ничего не принес. А могло и фортануть.
VladSh сказал(а):
Решил запуском бэкграундного агента на Onunload форм создаваемых-сохраняемых-закрываемых документов с обновлением основного.
Код агента:
Код:
Dim nuiws As NotesUIWorkspace
Sleep(1)
Set nuiws = New NotesUIWorkspace
Call nuiws.ViewRefresh()
I need help
1) бэкграунд агент - это агент с поднятым флагом "Run in background client thread" ?
2) Во внедренном представлении акция выполняет:
Код:
....
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 не открываю по форме =(
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
159
Меня все не отпускает возможность отловить UI основного документа, и обновлять это UIDoc в акции внедренного представления.
Попробуй так ловить основной документ, потом в Action делать refresh. На твой страх и риск.
Код:
Sub Postopen(Source As Notesuiview)

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

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

Mitya

Попробуй так ловить основной документ, потом в Action делать refresh. На твой страх и риск.
Код:
Sub Postopen(Source As Notesuiview)

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

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

Страх оправдан, лотус завалился на строке Call parentUIdoc.Refresh в Акции внедренного представления =))

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

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

savl

Lotus Team
28.10.2011
2 597
310
BIT
159
Вот в который раз убеждаюсь...
Сделать что надо? Обновить документ или представление?

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

Mitya

Вот в который раз убеждаюсь...
Сделать что надо? Обновить документ или представление?

Представление обновляется кодом в Actions:
Код:
		Dim ws As New NotesUIWorkspace
Call ws.ViewRefresh
Call ws.ViewRefresh
У меня работает, если док сохранен, а вот если он новый... хоть 3 раза Call ws.ViewRefresh - и ничего
а сохранять док перед акцией вообще не хочется.

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

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

savl

Lotus Team
28.10.2011
2 597
310
BIT
159
Mitya
А вот добавленные документы как связываются?
Прописываешь в них UNID "нового" документа и тогда они отображаются?
Если все так как я описал, то тебе надо сохранять документ перед добавлением.
И выводить сообщение, что мол необходимо сохранить. Сэкономишь кучу времени и нервов.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!