记录集 BOF/EOF 无法处理 Null

Recordset BOF/EOF cannot handle Nulls

我有一个表单,想在没有记录时显示一条消息。以下代码中的 SQL 不显示任何记录 (Null)(目前应该如此)。该功能无法正常工作。它既不 returns 数字也不显示消息。如果我把这个函数放在一个有记录的表单中,它就会准确地计算它们。

Public Function NumRecs() As Integer

Dim rs As DAO.Recordset

Set rs = CurrentDb.OpenRecordset("SELECT tblClient.ClientName, tblInvoices.SentToPayer, [Adjustment]+[MyFee]+[DBSFee] AS TotFees, tblClient.ClientID, tblDisclosure.ApplicantForenames, tblDisclosure.AppEmail " & _
                             "FROM ((tblInvoiceDetails INNER JOIN tblDisclosure ON tblInvoiceDetails.DiscLookup = tblDisclosure.ID) INNER JOIN tblInvoices ON tblInvoiceDetails.InvoiceLookup = tblInvoices.ID) INNER JOIN ((tblOfficerDetails INNER JOIN tblOfficers ON tblOfficerDetails.OfficerLookup = tblOfficers.ID) INNER JOIN tblClient ON tblOfficerDetails.ClientLookup = tblClient.ClientID) ON tblInvoices.AppLookup = tblClient.ClientID " & _
                             "WHERE (((tblInvoices.DatePaid) Is Null)) ")

If Not rs.BOF And Not rs.EOF Then
    NumRecs = Me.Recordset.RecordCount
Else
    DisplayMessage ("No records.")
    NumRecs = 0
End If

rs.Close
Set rs = Nothing

End Function

为了使用 DAO 获取记录数,您需要 MoveLast。另外,尝试更改 'EOF' 检查(见下文):

Public Function NumRecs() As Integer
Dim dbs As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL as String

strSQL = "SELECT tblClient.ClientName, tblInvoices.SentToPayer, [Adjustment]+[MyFee]+[DBSFee] AS TotFees, tblClient.ClientID, tblDisclosure.ApplicantForenames, tblDisclosure.AppEmail " & _ 
"FROM ((tblInvoiceDetails INNER JOIN tblDisclosure ON tblInvoiceDetails.DiscLookup = tblDisclosure.ID) INNER JOIN tblInvoices ON tblInvoiceDetails.InvoiceLookup = tblInvoices.ID) INNER JOIN ((tblOfficerDetails INNER JOIN tblOfficers ON tblOfficerDetails.OfficerLookup = tblOfficers.ID) INNER JOIN tblClient ON tblOfficerDetails.ClientLookup = tblClient.ClientID) ON tblInvoices.AppLookup = tblClient.ClientID " & _ 
"WHERE (((tblInvoices.DatePaid) Is Null))"

Set dbs = CurrentDB
Set rs = dbs.OpenRecordset(strSQL)

If Not rs.EOF Then 
    rs.MoveLast         ' ADD THIS LINE
    NumRecs = rs.RecordCount 
Else 
    DisplayMessage ("No records.") 
    NumRecs = 0 
End If

rs.Close 
Set rs = Nothing
dbs.Close
Set dbs = Nothing

End Function`

每当我需要在 DAO 中记录计数时,我总是 MoveLast 然后 MoveFirst

Dim db as DAO.Database
Dim rst as DAO.Recordset
Dim strSQL as string

strSQL = ""  ' your query here

Set db=CurrentDB()
   Set rst=db.OpenRecordset(stSQL,dbOpenDynaSet)
      With rst
         If NOT (.EOF and .BOF) Then   ' There are records to be had
            Dim iRecCount as Integer
            .MoveLast: .MoveFirst       
              ' DAO typically requires the all records before the count
              ' count is correct
            iRecCount = .RecordCount

         Else    ' There are NOT records to be had
            ' ADD YOUR MESSAGE HERE FOR NO RECORDS.
         End If
         .Close
      End with
   Set rst=nothing
Set db=nothing

我可以选择在 VBA 外部构建我的查询并添加参数。这就是为什么我知道我的查询正在产生我期望的结果。然后您可以将您的查询引用为 CurrentDB() 对象的 QueryDefs 对象。然后将您的参数作为 QueryDef 的 属性。

以下是 Allen Browne 关于 Recordsets 的精彩读物。 http://allenbrowne.com/ser-29.html

"I have a form and want to display a message when there are no records."

您无需打开另一个 DAO.Recordset 即可完成该任务。只需使用 RecordsetClone,它已经存在。

Private Sub Form_Load()
    Dim lngRowCount As Long

    lngRowCount = 0
    With Me.RecordsetClone
        If Not (.BOF And .EOF) Then
            .MoveLast
            lngRowCount = .RecordCount
        End If
    End With
    MsgBox lngRowCount & " records"
End Sub

您真正需要的是:

Public Function NumRecs() As Integer

    Dim rs As DAO.Recordset

    Set rs = Me.RecordsetClone
    If rs.RecordCount = 0 Then
        DisplayMessage ("No records.")
    Else
       rs.MoveLast
       NumRecs = rs.RecordCount
    End If
    rs.Close    
    Set rs = Nothing

End Function