Программно изменить значение поля без ввода режима редактирования и при этом обновить форму - PullRequest
1 голос
/ 06 марта 2012

В моем приложении Lotus Notes (классическое, не использующее XPages) пользователь не сможет редактировать документы напрямую.

Вместо этого изменения будут происходить на основе диалога и инициироваться через действия в форме.

Например, у меня есть код вызова действия, подобный следующему:

Dim ws As New NotesUIWorkspace
Dim result As String
Dim document As NotesDocument
Dim options(1 To 6) As String

'... - Fill options

Set document = ws.CurrentDocument.Document
result = ws.Prompt(PROMPT_OKCANCELCOMBO, "New Value", "Please choose the new value", document.Foo(0), options)

If result <> "" Then
    document.Foo = result

    Call document.ComputeWithForm(False, True)
    Call document.Save(True, False)
End If

Обновляет значение Foo до значения, выбранного пользователем в диалоговом окне.

Однако это новое значение не показывается пользователю - форма, похоже, не обновляется.
Повторное открытие и закрытие формы показывает новое значение; это определенно обновляется.

Самым близким, что я мог получить, был следующий код (внутри блока if):

ws.CurrentDocument.EditMode = True
document.Foo = result
Call ws.CurrentDocument.Save()
ws.CurrentDocument.EditMode = False

Тем не менее, это решение кажется мне немного неоптимальным, так как я должен войти в режим редактирования.

Как я могу обновить форму, используя Notes Script, чтобы отразить изменение поля без необходимости входа в режим редактирования?
Такие методы, как ws.CurrentDocument.Refresh, либо не показывают никакого эффекта, либо вызывают ошибки, так как их нельзя использовать вне режима редактирования.

Заранее большое спасибо за ваши идеи, советы и решения!

Ответы [ 4 ]

2 голосов
/ 09 марта 2012

Я нашел другое решение, избегающее входа в режим редактирования:

В документации к Reload говорится:

Изменения, внесенные в внутренний документ вне текущего сеанса редактирования(например, агентом или другим пользователем) не отображаются, пока документ не будет закрыт и снова открыт.Вы можете закрыть и снова открыть интерфейсный документ с помощью NotesUIDocument.Close(True) и NotesUIWorkspace.EditDocument.

Таким образом, документ можно «обновить» (с небольшим мерцанием), используя:

Dim ws As New NotesUIWorkspace
Dim document As NotesDocument
Set document = ws.CurrentDocument.Document
'...
Call ws.Currentdocument.Close(True)
Call ws.Editdocument(False, document)   
1 голос
/ 06 марта 2012

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

Контролируется лучший способ разрешить пользователю редактировать только определенные поля.Раздел доступа.

1 голос
/ 06 марта 2012

Ваш ответ самый лучший. Переход в режим редактирования и установка поля с сохранением или просто обновление страницы после того, как вы уже установили поле, является правильной идеей. Это печально, но необходимо.

Пользователю, конечно, понадобятся права на редактирование документа, что представляет другую проблему. Как запретить пользователю вводить элемент управления E или нажимать умную иконку для редактирования документа?

Для этого вы можете установить глобальную переменную, которая контролирует доступ к редактированию документа. Когда вы открываете свой диалог, вы можете установить для этой глобальной переменной значение true, а затем вернуть ее в значение false после внесения изменений. В режиме запроса измененный набор событий продолжается до значения этой глобальной переменной.

0 голосов
/ 03 декабря 2013

Допустим, у вас есть стол.Вы хотите показать следующую строку, чтобы добавить элемент заказа или что-то:

@setfield("NumOrders";NumOrders+1);
@Command( [ViewRefreshFields] )  

Вам нужно скрытое поле NumOrders, тогда обновление будет работать.

@Command( [ViewRefreshFields] )

Это так просто!

...