1

我在表单上有许多按钮,它们向用户提供附加信息,每个按钮都使用 DCount 来查看是否有任何信息要显示,如果有,则打开一个弹出表单来显示它。一切都运行良好,但现在对于一个特定的按钮,打开弹出表单需要 30 秒到 1 分钟之间的任何时间,这显然是不可接受的。无法理解为什么它最初运行良好,但现在变得如此缓慢。所有其他按钮仍会在一秒钟内打开它们的表单。VBA是:

Private Sub btnNotes_Click()
  'open the popup notes for the current record, if there are associated records
  If DCount("ID","qlkpIDForNotes") = 0 Then
    MsgBox "There are no notes for this patient", vbOKOnly, "No information"
  Else
    DoCmd.OpenForm "fsubNotes",,,"ID = " & Me.displayID
  End If
End Sub

被查询的表大约有 40,000 行,其中检查其他按钮的最大表大约有 12,000 行。已尝试直接在表上而不是通过查询执行 DCount,但没有任何区别。还尝试从原始表中取出一部分数据,将大约 1100 行复制到一个新表中并对其进行测试。打开仍然需要12秒。任何想法,任何人?

4

1 回答 1

2

使用DCount()只是找出表或查询中是否有任何行可能相当低效,因为DCount()必须运行整个查询并遍历所有记录以返回总计数,以便您可以将其与0.

根据该查询的复杂性和其中的联接,以及联接是否使用具有索引的字段,运行该查询的成本可能与基础表中的记录数成指数比例。

要解决您的问题,请尝试以下操作:

  1. 确保查询中基础表的ID字段有索引,并且or子句qlkpIDForNotes中使用的所有字段也有索引。JOINWHERE

  2. 检查您是否可以使用主基础表或使用简化查询来测试是否有可能返回的记录,qlkpIDForNotes简而言之,您可能不需要完整运行该查询来确定它是否有一些记录.

  3. 使用单独的函数,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
于 2012-10-15T08:25:24.497 回答