LotusScript调度代理刷新未使用@DBLookup处理计算字段



我有一个LotusScript调度代理,它在从数据同步过程添加许多新记录后刷新视图。除了使用@DBLookup的任何计算字段外,刷新工作得很好。我还尝试在保存每个新文档之前使用ComputeWithForm。从我收集到的,ComputeWithForm不能很好地与@DBLookup一起玩,这是我唯一真正的症结所在。如果有一个标准的工作围绕,请指出我在正确的方向。我已经仔细检查了查找服务器是否与代理服务器相同,并且服务器具有管理器级别的访问权限以及对文档和视图的所有权限。谢谢你的帮助。

要求代码:

已调度LotusScript代理

Sub Initialize
Dim s As New NotesSession
Dim db As NotesDatabase
Set db = s.CurrentDatabase
Set view = db.GetView("viewName")
Do
Dim doc As New NotesDocument(db)
--- other code that adds a new document---
Call doc.ComputeWithForm(False, False)
Call doc.Save(True, False)
Loop
Call view.Refresh()

计算字段公式代码在文档

@DbLookup("Notes" : "NoCache"; "serverName" : "dbName.nsf"; "(columnName)"; fieldName; 2);

如上所述,当从UI端运行时,@DBLookup运行良好,调度代理运行良好,ComputeWithForm运行良好并更新表单中的所有计算字段,除了那些带有@DBLookup的字段。我的假设是"ComputeWithForm"与"dblookup"不能很好地配合。来自于Stack Overflow上关于这个主题的其他几篇文章,以及我们的朋友Google搜索提供给我的其他来源。

请参考IBM文档"ComputeWithForm不计算包含@Db命令的默认值"。(#146472)获取更多信息。

只是为了确保它正在尝试刷新computed字段,我将computed字段的公式代码更改为以下代码,并得到结果"no name"从调度代理刷新时的名称,以及从UI刷新时的实际名称。

计算字段公式代码在文档

empname := @DbLookup("Notes" : "NoCache"; "serverName" : "dbName.nsf"; "(columnName)"; fieldName; 2);
@If(@IsError(empname); "no name"; empname)

这很可能是一个安全问题。当您从UI运行时,用户可以访问由@DbLookup函数引用的数据库、视图和文档。当您在服务器上作为代理运行它时,它是以服务器的ID运行的,而不是用户的ID,并且它没有访问权限。即使服务器名在两个数据库的ACL中,它也没有访问权限。

旧的(20多年前的)解决方案是将包含计算字段的数据库的副本id放入作为查找目标的数据库的ACL中。我已经很久没这么做了。我不记得副本id是否必须以冒号分隔的两个16个字符部分的格式表示,还是以单个32个字符的字符串表示。使用副本ID是必要的,因为这是在对代理进行签名之前。无法建立编写代理的用户的身份,并且在运行代理时使用服务器的身份将为任何具有设计访问权限的人提供后门,以读取域内任何服务器上的任何其他数据库。

新的解决方案是通过将签名者的姓名(或组)放入目标数据库的ACL、来填充Server Document中的Trusted Servers字段,从而确保代理的签名者能够访问目标数据库。包含代理和computed字段的数据库所在的服务器的名称必须位于@DbLookup试图访问的数据库所在的服务器的server Document中的Trusted Servers字段中。这告诉服务器"如果代理签名出现在由另一个服务器打开的会话中,则可以信任代理签名作为有效的访问证明"。

最新更新