.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
我正在为研究参与者创建一个联系信息数据库。在其中,我有一个带有命令按钮的表单,该按钮应该根据表单上文本字段之一的值(链接到 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