You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Notes数据库脚本调用报错:找不到外部名称,请求解决方法

解决Notes数据库删除文档时的"Cannot find external name"错误

从你的描述来看,核心问题大概率是脚本库循环引用加上Notes编译器无法正确解析依赖导致的,再加上不能全量编译的限制,咱们可以试试这些分步的解决方案:

1. 打破循环引用并分步编译脚本库

循环引用(uiMaatwerk → uiMaatwerk2 → uiMaatwerk3,若存在反向引用则更严重)是Notes脚本库的致命问题,会直接导致外部函数无法被找到。咱们可以分步编译来绕开这个问题:

  • 先打开uiMaatwerk2脚本库,暂时移除对uiMaatwerk3的引用,保存并关闭
  • 打开uiMaatwerk3脚本库,确认它没有引用uiMaatwerkuiMaatwerk2(如果有也暂时移除),然后按Ctrl+Shift+F9单独编译这个库(或者通过菜单「设计」→「编译」)
  • 回到uiMaatwerk2,重新添加对uiMaatwerk3的引用,再次编译uiMaatwerk2
  • 最后打开数据库的脚本(就是你写Querydocumentdelete的地方),按Ctrl+Shift+F9单独编译这段代码

这种分步编译的方式可以让Notes编译器逐个解析依赖,避免循环引用带来的解析混乱。

2. 确认DeleteDocument函数的可见性和参数匹配

别忽略最基础的细节:

  • 确保uiMaatwerk3里的DeleteDocument公共函数,也就是用Public Function DeleteDocument(docColl As NotesDocumentCollection, confirm As Boolean)定义的(如果是Private,外部脚本根本调用不到)
  • 核对调用时的参数类型:你传入的是Source.DocumentsNotesDocumentCollection类型)和False(布尔值),函数的参数类型必须完全匹配,不能有类型不兼容的情况

3. 绕过数据库脚本,改用表单级事件触发

如果数据库脚本的问题始终无法解决,可以把删除逻辑移到表单的QueryDocumentDelete事件里:

  • 打开数据库中所有允许删除的表单,添加以下代码:
    Sub Querydocumentdelete(Source As Notesuidocument, Continue As Variant)
        If Not DeleteDocument(Source.Document.ParentDatabase.UnprocessedDocuments, False) Then
            Continue = False
        End If
    End Sub
    
    (注意这里用Source.Document.ParentDatabase.UnprocessedDocuments来获取选中的文档集合,和数据库脚本里的Source.Documents效果一致)
  • 这样删除操作会直接触发表单的事件,绕开数据库脚本的引用问题,适合无法修改数据库脚本编译状态的场景

4. 清理Notes客户端缓存

Notes客户端有时候会缓存旧的脚本库信息,导致你修改后的代码不生效:

  • 完全关闭Notes客户端
  • 找到Notes的数据目录(通常是C:\Users\<你的用户名>\AppData\Local\IBM\Notes\Data),删除cache.ndkiconcache.ndk这两个缓存文件
  • 重新打开Notes和目标数据库,再测试删除操作

这些方法都不需要全量编译整个数据库,应该能解决你遇到的问题。

内容的提问来源于stack exchange,提问作者Nuri Ensing

火山引擎 最新活动