使用DCount()
只是找出表或查询中是否有任何行可能相当低效,因为DCount()
必须运行整个查询并遍历所有记录以返回总计数,以便您可以将其与0
.
根据该查询的复杂性和其中的联接,以及联接是否使用具有索引的字段,运行该查询的成本可能与基础表中的记录数成指数比例。
要解决您的问题,请尝试以下操作:
确保查询中基础表的ID
字段有索引,并且or子句qlkpIDForNotes
中使用的所有字段也有索引。JOIN
WHERE
检查您是否可以使用主基础表或使用简化查询来测试是否有可能返回的记录,qlkpIDForNotes
简而言之,您可能不需要完整运行该查询来确定它是否有一些记录.
使用单独的函数,HasAny()
如下所示,而不是DCount()
只需要找出查询是否返回任何结果:
'-------------------------------------------------------------------------'
' Returns whether the given query returned any result at all. '
' Returns true if at least one record was returned. '
' To call: '
' InUse = HasAny("SELECT TOP 1 ID FROM Product WHERE PartID=" & partID) '
'-------------------------------------------------------------------------'
Public Function HasAny(ByVal selectquery As String) As Boolean
Dim db As DAO.database
Dim rs As DAO.RecordSet
Set db = CurrentDb
Set rs = db.OpenRecordset(selectquery, dbOpenForwardOnly)
HasAny = (rs.RecordCount > 0)
rs.Close
Set rs = Nothing
Set db = Nothing
End Function
有了这个,您可以简单地将代码重写为:
Private Sub btnNotes_Click()
'open the popup notes for the current record, if there are associated records '
If Not HasAny("qlkpIDForNotes") Then
MsgBox "There are no notes for this patient", vbOKOnly, "No information"
Else
DoCmd.OpenForm "fsubNotes",,,"ID = " & Me.displayID
End If
End Sub