为何调用doc.Save()后代码仅处理单个doc?求修复方案
问题解决:Lotus Notes遍历文档时Save导致循环中断
问题现象
执行doc.Save(True, True)后,循环仅处理第一个文档,无法遍历全部;移除Save操作后,循环可正常遍历所有文档。
含Save的代码
While Not (doc Is Nothing) If doc.count(0) = 1 Then For l%=1 To 30 num$=Trim(CStr(l%)) If Trim(doc.getitemvalue("item"+num$)(0))="" Then Exit For i1=Format$(Now,"YYYYMMDD") i2=Format$(Now,"hhmmss") i3=Trim(doc.phone(0)) i4=Trim(doc.getitemvalue("item"+num$)(0)) print i1+i2+i3+i4 Next End If doc.count = 2 doc.Save( True, True ) Set doc=v.getnextdocument(doc) Wend
含Save的输出
2022102433phone1item1 2022102433phone1item2 2022102433phone1item3
不含Save的代码
While Not (doc Is Nothing) If doc.count(0) = 1 Then For l%=1 To 30 num$=Trim(CStr(l%)) If Trim(doc.getitemvalue("item"+num$)(0))="" Then Exit For i1=Format$(Now,"YYYYMMDD") i2=Format$(Now,"hhmmss") i3=Trim(doc.phone(0)) i4=Trim(doc.getitemvalue("item"+num$)(0)) print i1+i2+i3+i4 Next End If Set doc=v.getnextdocument(doc) Wend
不含Save的输出
2022102433phone1item1 2022102433phone1item2 2022102433phone1item3 2022102433phone2item1 2022102433phone2item2 2022102433phone2item3 2022102433phone3item1 2022102433phone3item2 2022102433phone3item3
问题原因
在Lotus Notes/Domino对象模型中,doc.Save(True, True)的第二个True参数会强制刷新视图索引;加上你修改了doc.count字段,文档在视图中的位置可能发生变化,导致后续调用GetNextDocument(doc)时无法定位到正确的下一个文档,循环提前终止。
修复方案
核心思路是先获取下一个文档的引用,再保存当前文档,避免保存操作破坏遍历的游标连续性。
修改后的代码:
Dim nextDoc As NotesDocument While Not (doc Is Nothing) If doc.count(0) = 1 Then For l%=1 To 30 num$=Trim(CStr(l%)) If Trim(doc.getitemvalue("item"+num$)(0))="" Then Exit For i1=Format$(Now,"YYYYMMDD") i2=Format$(Now,"hhmmss") i3=Trim(doc.phone(0)) i4=Trim(doc.getitemvalue("item"+num$)(0)) print i1+i2+i3+i4 Next End If ' 先获取下一个文档的引用,存储到临时变量 Set nextDoc = v.getnextdocument(doc) ' 修改当前文档字段并保存 doc.count = 2 doc.Save(True, True) ' 这里可以保留原Save参数,不影响遍历 ' 将doc切换到预先获取的下一个文档 Set doc = nextDoc Wend
原理说明
先调用GetNextDocument拿到下一个文档的引用并存在临时变量里,再处理当前文档的修改和保存。此时即使当前文档保存后视图索引变化,已经获取的nextDoc引用不会失效,循环可以继续正常遍历后续所有文档。
内容的提问来源于stack exchange,提问作者rexwang
相关产品推荐
相关产品推荐

