• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

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

Mitya

Mitya
А вот добавленные документы как связываются?
Прописываешь в них UNID "нового" документа и тогда они отображаются?
Если все так как я описал, то тебе надо сохранять документ перед добавлением.
И выводить сообщение, что мол необходимо сохранить. Сэкономишь кучу времени и нервов.
Все так!!!
тока, добавил в action
Код:
....
If Doc.IsNewNote Then		
If docui.EditMode Then docui.save		
End If
....
Set docnew = db.CreateDocument
docnew.Form = "Test"
Call docnew.ReplaceItemValue("UNID",doc.UniversalID)
Call docnew.Save(True, False)
....
Call ws.ViewRefresh
Call ws.ViewRefresh
И все равно, акция "правильно" отрабатывает только после переоткрытия документа - ПОЧЕМУ?
:D
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
180
Mitya
Код:
If docui.EditMode Then docui.save
НЕ надо самому сохранять, пусть пользователь сохраняет документ сам по кнопке "сохранить".
Ты таким образом заставляешь его сделать пересчет документа, сохранение на диск и обновление данных.
По сути все равно что сохранить - переоткрыть.

Вот попробуй сам. убери это сохранение. Создай док, сохрани через Ctrl+S, добавь новые документы.
 
M

Mitya

Mitya
Код:
If docui.EditMode Then docui.save
НЕ надо самому сохранять, пусть пользователь сохраняет документ сам по кнопке "сохранить".
Ты таким образом заставляешь его сделать пересчет документа, сохранение на диск и обновление данных.
По сути все равно что сохранить - переоткрыть.

Вот попробуй сам. убери это сохранение. Создай док, сохрани через Ctrl+S, добавь новые документы.

убрал, создаю док, нажимаю на Ctrl+S, нажимаю на акцию - тишина =((
Закрываю док, открываю док, вижу во внедренном доки что добавлял после Ctrl+S, жму на акцию - внедренный вид обновляется! :D
Как так!?!?!?
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
180
Забавно... Хотя...
Вот мой код из внедренного представления, причем представление совсем в другой базе находится.
Документ, основной, создается через backEnd. Возможно дело как раз в этом.
При первом открытии у него уже есть все Item'ы, но при этом он не сохранен.
Предположу, что твой основной документ создается через @Command([Compose]) Так?
Код:
Sub Click(Source As Button)
On Error Goto handler
Const FuncName = {Кнопка "Добавить" }
Dim ErrStr As String

Dim authNames(1) As Variant

Dim macro As Variant
macro = Evaluate({@NoteID},parentDoc)
If macro(0) = {NT00000000} Then
Msgbox "Требуется сохранить документ.",48,parentDoc.ParentDatabase.Title
Goto endh
End If

authNames(0) = PD_GetPersoneRusName(Implode(Evaluate({@UserName})))
authNames(1) = PD_GetPersoneLNName(Implode(Evaluate({@UserName})))

If DSUI_CreateDocument(parentDoc,"",authNames) Then
Dim ws As New NotesUIWorkspace
Call ws.ViewRefresh
Call ws.ViewRefresh
End If

Goto endh

handler:
ErrStr = DESIGN & ", " & FuncName & ": " & Err &", в стр " & Erl & nLine & Error$
Call ErrorObj.Initialize(Err,ErrStr)
Call ErrorObj.Log()
Resume endh
endh:
End Sub
 

VladSh

начинающий
Lotus Team
11.12.2009
1 784
157
BIT
57
p.s. хм.. так OnUnload - обработчик события, возникающего перед закрытием документа по форе. А я же docNew не открываю по форме =(
Где-то в смежной теме было, где рассматривался вопрос об обходе крэша в действии внедрённого вида (т.е. тот вопрос, что вы и задаёте сейчас, а эта тема совсем о другом!).

В кратце.
Создаём агент, в котором:
Код:
- nuidCurrent.Save 'и проверка на возможность сохранения, если не сохранился - выходим

- ваша логика: изменения документа, находящегося в виде или создание нового

- nuiws.ViewRefresh
- nuidCurrent.Refresh()
Агент в действии вида вызываем с помощью @... ToolsRunMacro.
 
A

alexas

Пробую отловить uidoc основного документа ....
Если это делается с целью рефрешить UIDoc - занятие бесперспективное, крах клиента неизбежен.
Потом, почему надо создавать новый док обязательно из вида? Сделайте это из кнопки на основном доке (оформить можно так, что будет неотличимо от кнопки в виде), тогда в скрипте сохранится контекст UI основного дока и можно спокойно делать uidoc.Refresh или ws.ViewRefresh без проблем.
 
A

alexas

Агент в действии вида вызываем с помощью @... ToolsRunMacro.
"действие вида" вроде как на LS (док в BackEnd-е создается), ToolsRunMacro не катит.

link removed работает на Ура и очень универсально, применимо и для проблем из этой темы. Listener делаю на NotesTimer или JS, а флажок, который проверяю может быть в основном доке, в ProfileDoc или в Environment - в зависимости от ситуации. (Web технологии - в клиент :D )
 

VladSh

начинающий
Lotus Team
11.12.2009
1 784
157
BIT
57
alexas
Если код принципиально должен быть в действии вида, тогда крэш за принципиальность) А если надо решить задачу и обойти крэш, то можно пострадать конечно, но перенести код в агент.
 
A

alexas

Если код принципиально должен быть в действии вида, тогда крэш за принципиальность) А если надо решить задачу и обойти крэш, то можно пострадать конечно, но перенести код в агент.
Так я с этого и начал. Только не "перенести код в агент", а перенести код из действия вида - в кнопку на основном доке. Так проще.
 

VladSh

начинающий
Lotus Team
11.12.2009
1 784
157
BIT
57
перенести код из действия вида - в кнопку на основном доке. Так проще.
Это не решает всех проблем. Иногда надо выделить док в виде, нажать действие, которое может создать док.
Ещё минус - нелогичность интерфейса, т.к. действия в документе, пользователь ожидает, будут работать для текущего документа.
Все эти проблемы решаются, если их решать, а не обходить (к слову, я раньше тоже так делал - переносил код в действие на основном документе).
 
A

alexas

Это не решает всех проблем. Иногда надо выделить док в виде, нажать действие, которое может создать док.
Конечно ситуации бывают разные, поэтому у меня стандартный функционал для EmbView - на OnSelect запоминать UNID дока, на всякий случай. Дальше, делай что хочешь - создавай док, удаляй, хоть еще что-нибудь делай опираясь на инфу выделенного и открытого дока.
Ещё минус - нелогичность интерфейса, т.к. действия в документе, пользователь ожидает, будут работать для текущего документа.
Согласен, что нелогичность интерфейса недопустима, выше я и написал - оформить кнопки, как акции вида (в таблице: 1 строка - кнопки ака ViewAction, 2 строка - собственно EmbView) - интерфейс не отличишь от вида с акциями. Но есть большей плюс: возможность сделать акции зависимыми от контекста основного и(или) выделенного в виде документа и действий юзера (событий, возникающих при работе с документом).
 

Мыш

Lotus Team
12.02.2008
1 220
29
BIT
68
"действие вида" вроде как на LS (док в BackEnd-е создается), ToolsRunMacro не катит.

Все-таки, каковы точно условия задачи? Я понял так:
"Создаем новый док-т (основной) по форме, в нем, в действии внедренного представления, создаем в базе новые документы в back-end. Хотим отобразить их в этом представлении сразу же после их сохранения, при этом не сохраняя/переоткрывая основной док-т."
Если так, то выносим код из действия в агент (target = None), в действии вида запускаем через ToolsRunMacro, в агенте после doc.Save вызываем view.Refresh.
Вообще говоря, у мну это работает... :rolleyes: Видимо, условия все-таки не допонял?
 

Мыш

Lotus Team
12.02.2008
1 220
29
BIT
68
VladSh, дык мне интересно стало - мож в каком-то хитровывернутом случае это не работает? Или вдруг в новых версиях "пофиксили"? :) Это ж Лотус, глаз да глаз нужен... :)))
 
Мы в соцсетях:

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