【问题标题】:Access VBA Subform Dynamic SQL Parent Form Count Slow访问 VBA 子窗体动态 SQL 父窗体计数慢
【发布时间】:2020-02-13 10:49:20
【问题描述】:

我在表单上有一个过滤器私有函数,用于为子表单上的记录源动态生成 SQL,用于搜索记录。我运行主窗体的这个 onload,以及一系列文本框(日期)、组合框和复选框控件的更新后。下面是过滤器代码。当表单加载时,有 15,247 条记录。当我加载表单时,它被冻结了一段时间,得到计数。

子表单是数据表,我希望计数大于导航按钮记录数,所以我在主表单的表单页脚上放置了一个文本框。 为了在主窗体上显示子窗体记录的计数,我在子窗体的窗体页脚中放置了一个文本框,它的控制源 =count(*)

在主表单页脚文本框上,控件来源是
=[frmsubform].[Form]![txtCountrecs] & "记录"

它可以工作,但是太慢了。我想知道是否有办法让这变得不那么缓慢和滞后。

Private Sub Filters()
    Dim fSQL As String

    fSQL = "SELECT [fields] " & _
            "FROM tbltable1 LEFT JOIN tbltable2 ON tbltable1.ID = tbltable2.FKtbl1ID " & _
            "WHERE ((tbltable3.ID) Is Not Null) AND ((tbltable4.ID) Is Not Null)) "

    If Nz(Me.cboFilterTo.Value, 0) <> 0 Then
        fSQL = fSQL & " AND tbltable5.ID = " & Me.cboFilterTo.Column(0)
    End If

    If Nz(Me.cboFilterFrom.Value, 0) <> 0 Then
        fSQL = fSQL & " AND tbltable6.ID = " & Me.cboFilterFrom.Column(0)
    End If

    If Nz(Me.txtDateOnOrAfter, 0) <> 0 Then
        fSQL = fSQL & " AND tbltable4.dtdate >= " & Me.txtDateOnOrAfter
    End If

    If Nz(Me.txtDateOnOrBefore, 0) <> 0 Then
        fSQL = fSQL & " AND tbltable4.dtdate <= " & Me.txtDateOnOrBefore
    End If

    If Nz(Me.chkUncompleted, 0) <> 0 Then
        fSQL = fSQL & " AND nz(tbltable3.dtdatedone,0) = 0"
    End If

'Debug.Print fSQL
    Me.frmSubform.Form.RecordSource = fSQL
    Me.frmSubform.Form.Requery
End Sub

如果有任何方法可以加快速度,我很乐意提供一些建议。

【问题讨论】:

    标签: vba ms-access dynamic-sql subform record-count


    【解决方案1】:

    我找到了答案,所以我想为任何可能有帮助的人发布解决方案。

    为了使表单加载更快,我将初始 fSQL 选择转换为 SQL 视图,然后将初始 fSQL 设置为:

    fSQL = "SELECT * FROM vw_MyNewView WHERE 1 = 1 "
    

    然后,在我设置子表单的记录源并重新查询它之后,我有以下内容:

    With Me.frmSubform.Form.RecordsetClone
        If .RecordCount > 0 Then .MoveLast
        ccount = .RecordCount
    End With
    Me.txtCountRecords = ccount & " Records"
    

    表单加载速度更快,而且这个计数也很快制表。

    希望这对其他人有所帮助!

    【讨论】:

    • 对于 SQL 后端和更大的记录集,总是尝试加载没有基础记录的表单,然后只加载基于用户选择的过滤集,这是一个非常好的做法。很高兴你解决了!
    • 是的,我还必须提醒自己尽可能创建 SQL 视图,而不是在 VBA 中构建所有这些视图。它的加载速度要慢得多,在 VBA 中构建它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 2021-04-12
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多