以编程方式更改字段的值而不输入editmode并仍然刷新表单

时间:2012-03-06 11:29:46

标签: lotus-notes lotus-domino lotusscript

在我的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-block中):

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

然而,这个解决方案对我来说似乎有点不理想,因为我必须进入编辑模式。

如何使用Notes脚本刷新表单以反映字段的更改而无需进入编辑模式?
ws.CurrentDocument.Refresh之类的方法不会显示任何效果或引发错误,因为它们无法在编辑模式之外使用。

非常感谢您的想法,提示和解决方案!

4 个答案:

答案 0 :(得分:2)

我找到了另一种避免进入编辑模式的解决方案:

作为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 :(得分:1)

你的回答是最好的。进入编辑模式并设置字段并保存或只是在设置字段后刷新页面是正确的想法。这是不幸的,但有必要。

用户需要对文档进行编辑权限,这当然会带来另一个问题。如何阻止用户键入控件E或单击智能图标来编辑文档?

为此,您可以设置一个全局变量来控制对编辑文档的访问。当您打开对话框时,可以将该全局变量设置为true,然后在进行更改后将其设置为false。在查询模式中,更改事件集继续到该全局变量的值。

答案 2 :(得分:1)

如果您的用户拥有该文档的编辑权限,则无法阻止他绕过表单中的任何脚本操作,只需编辑它即可。

让用户只编辑特定字段的更好方法是受控访问部分。

答案 3 :(得分:0)

让我们说你有一张桌子。您想要显示下一行以添加订单商品或其他内容:

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

您需要隐藏字段NumOrders,然后刷新才能生效。

@Command( [ViewRefreshFields] )

就这么简单!