You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 03:46:13