LotusScript定时代理ComputeWithForm不计算含@DBLookup字段求解
解决方案
首先明确这是Domino平台的已知原生限制:ComputeWithForm方法设计上就不支持执行@DbLookup、@DbColumn等所有@Db类函数,该限制有IBM官方的正式确认,和权限、服务器配置无关。
推荐标准方案(按优先级排序)
方案1:将Lookup逻辑改用LotusScript直接实现(批量场景最优)
完全避开表单计算字段的@DbLookup依赖,在代理新增文档时直接查询目标视图取值,性能最高,适合你当前批量新增数据的场景,示例代码如下:Sub Initialize Dim s As New NotesSession Dim db As NotesDatabase Set db = s.CurrentDatabase ' 提前初始化要Lookup的视图,避免循环内重复打开 Dim lookupView As NotesView Set lookupView = db.GetView("(columnName)") ' 对应@DbLookup使用的视图名 Dim view As NotesView Set view = db.GetView("viewName") Do Dim doc As New NotesDocument(db) ' --- 其他新增文档的逻辑代码 --- Dim key As String key = doc.fieldName(0) ' 对应@DbLookup的匹配键 Dim lookupDoc As NotesDocument Set lookupDoc = lookupView.GetDocumentByKey(key, True) If Not lookupDoc Is Nothing Then ' 把Lookup到的第2列值直接赋值给对应字段 doc.empname = lookupDoc.ColumnValues(1) ' 列索引从0开始,第2列对应索引1 Else doc.empname = "no name" End If Call doc.ComputeWithForm(False, False) ' 此时可正常计算其他非@Db类的计算字段 Call doc.Save(True, False) Loop Call view.Refresh() End Sub方案2:用Evaluate函数执行@DbLookup公式
如果你不想改写原有公式逻辑,可以直接在代理中用Evaluate执行公式获取结果后赋值给字段:' 放在新增文档的逻辑之后,ComputeWithForm之前执行 Dim formula As String formula = |empname := @DbLookup("Notes" : "NoCache"; "serverName" : "dbName.nsf"; "(columnName)"; fieldName; 2);@If(@IsError(empname); "no name"; empname)| Dim result As Variant result = Evaluate(formula, doc) doc.empname = result(0)方案3:后台刷新文档(仅适合小数据量场景)
如果必须完全依赖表单的计算逻辑,可在所有文档新增完成后,调用NotesDatabase的UpdateFTIndex方法后,使用代理触发全部文档的刷新,该方式性能较差,不建议超过1000条的批量场景使用。
补充说明
你测试中得到的"no name"结果就是因为ComputeWithForm跳过了@DbLookup执行直接返回了错误分支的默认值,和公式正确性、权限配置无关,不需要再排查权限、视图索引类问题。
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

