Notes数据库脚本调用报错:找不到外部名称,请求解决方法
解决Notes数据库删除文档时的"Cannot find external name"错误
从你的描述来看,核心问题大概率是脚本库循环引用加上Notes编译器无法正确解析依赖导致的,再加上不能全量编译的限制,咱们可以试试这些分步的解决方案:
1. 打破循环引用并分步编译脚本库
循环引用(uiMaatwerk → uiMaatwerk2 → uiMaatwerk3,若存在反向引用则更严重)是Notes脚本库的致命问题,会直接导致外部函数无法被找到。咱们可以分步编译来绕开这个问题:
- 先打开
uiMaatwerk2脚本库,暂时移除对uiMaatwerk3的引用,保存并关闭 - 打开
uiMaatwerk3脚本库,确认它没有引用uiMaatwerk或uiMaatwerk2(如果有也暂时移除),然后按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.Documents(NotesDocumentCollection类型)和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 SubSource.Document.ParentDatabase.UnprocessedDocuments来获取选中的文档集合,和数据库脚本里的Source.Documents效果一致) - 这样删除操作会直接触发表单的事件,绕开数据库脚本的引用问题,适合无法修改数据库脚本编译状态的场景
4. 清理Notes客户端缓存
Notes客户端有时候会缓存旧的脚本库信息,导致你修改后的代码不生效:
- 完全关闭Notes客户端
- 找到Notes的数据目录(通常是
C:\Users\<你的用户名>\AppData\Local\IBM\Notes\Data),删除cache.ndk和iconcache.ndk这两个缓存文件 - 重新打开Notes和目标数据库,再测试删除操作
这些方法都不需要全量编译整个数据库,应该能解决你遇到的问题。
内容的提问来源于stack exchange,提问作者Nuri Ensing




