テーブルまたはクエリに行があるか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