.FindFirst 在 Access 中无法正常工作

.FindFirst Not Working Properly in Access

我正在为研究参与者创建一个联系信息数据库。在其中,我有一个带有命令按钮的表单,该按钮应该根据表单上文本字段之一的值(链接到 table 其中字段自动计算为 0 或 2)。基本上,如果此字段的值为 0,那么我希望为该参与者保存“UnsignedLetter”报告,或者如果此字段的值为 2,我希望保存“SignedLetter”报告。

除了选择要保存的正确报告之外,我已经完成了大部分工作。 FindFirst 似乎是最接近成功的,但它并不完全正确。当我单击下面代码的按钮时,编码为 0 的参与者将获得报告的两个版本,而不仅仅是“UnsignedLetter”版本。编码为 2 的参与者不会发生同样的情况。例如,在 5 人的记录集中,3 人编码为 2,2 人编码为 0,我得到 3 个正确的“SignedLetter”pdf,2 个正确的“UnsignedLetter”pdf,以及一个另外 2 个不正确的“SignedLetter”pdf。这是我正在使用的代码:

Private Sub SaveLetters_Click()
    Dim rs As DAO.Recordset
    Dim sFolder               As String
    Dim sFile                 As String
        
    On Error GoTo Error_Handler

    sFolder = Application.CurrentProject.Path & "\"
    
    Set rs = Me.RecordsetClone
    
    With rs
          
        .FindFirst "OncID = 2"
                
            Do While Not .EOF
                DoCmd.OpenReport "SignedLetter", acViewPreview, , "[ID]=" & ![ID], 
acHidden
                sFile = Nz(![UNumber], "") & "_signed" & ".pdf"
                sFile = sFolder & sFile
                DoCmd.OutputTo acOutputReport, "SignedLetter", acFormatPDF, sFile, , , , 
acExportQualityPrint
            
                DoCmd.Close acReport, "SignedLetter"
                .MoveNext
            Loop
        
    End With
    
    With rs
    
        .FindFirst "OncID = 0"
        
        Do While Not .EOF
            DoCmd.OpenReport "UnsignedLetter", acViewPreview, , "[ID]=" & ![ID], acHidden
            sFile = Nz(![UNumber], "") & "_unsigned" & ".pdf"
            sFile = sFolder & sFile
            DoCmd.OutputTo acOutputReport, "UnsignedLetter", acFormatPDF, sFile, , , , 
            acExportQualityPrint
            
            DoCmd.Close acReport, "UnsignedLetter"
            .MoveNext
           
        Loop
      End With
      
MsgBox "Letters Sent to File", vbOKOnly + vbInformation, "Task Completed"

    Application.FollowHyperlink sFolder

Error_Handler_Exit:
    On Error Resume Next
    If Not rs Is Nothing Then
        rs.Close
        Set rs = Nothing
    End If
    Exit Sub

Error_Handler:
    If Err.Number <> 2501 Then
        MsgBox "The following error has occured" & vbCrLf & vbCrLf & _
               "Error Number: " & Err.Number & vbCrLf & _
               "Error Source: cmd_GenPDFs_Click" & vbCrLf & _
               "Error Description: " & Err.Description & _
               Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _
               , vbOKOnly + vbCritical, "An Error has Occured!"
    End If
    Resume Error_Handler_Exit
End Sub

此时我已经搜索了 2 天,但找不到任何解决方案。我已经尝试分别执行 2 With rs,使用 1 With rs 作为 If .NoMatch 语句的 Then 部分之后的另一个,更改计算以生成文本而不是一个数字,以及我能想到或在网上找到的任何其他内容。我觉得此时此刻我差点掉下眼泪,非常感谢你们提供的任何帮助。

不需要FindFirst。两个报告的大部分代码是相同的。使用 If Then Else 和变量 select 适当的报告并动态执行命令。

Dim sRpt As String
With Me.RecordsetClone
Do While Not .EOF
    If !OncID = 0 Then
        sRpt = "Unsigned"
    Else
        sRpt = "Signed"
    End If
    DoCmd.OpenReport sRpt & "Letter", acViewPreview, , "[ID]=" & ![ID], acHidden
    DoCmd.OutputTo acOutputReport, , acFormatPDF, _
        CurrentProject.Path & "\" & Nz(![UNumber], "") & "_" & sRpt & ".pdf"
    DoCmd.Close
    .MoveNext
Loop
End With