Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问VBA子窗体动态SQL父窗体计数缓慢_Vba_Ms Access_Dynamic Sql_Subform_Record Count - Fatal编程技术网

访问VBA子窗体动态SQL父窗体计数缓慢

访问VBA子窗体动态SQL父窗体计数缓慢,vba,ms-access,dynamic-sql,subform,record-count,Vba,Ms Access,Dynamic Sql,Subform,Record Count,我在表单上有一个filters私有函数,用于为子表单上的记录源动态生成SQL,用于搜索记录。我运行这个主窗体的onload,以及一系列文本框(日期)、combo框和复选框控件的更新。下面是过滤器代码。加载表单时,有15247条记录。当我加载表单时,它会被冻结一段时间,以获取计数 子表单是数据表,我希望计数大于导航按钮记录计数,所以我在主表单的表单页脚上放了一个文本框。 为了显示主窗体上子窗体记录的计数,我在子窗体的窗体页脚中放置了一个文本框,它的控制源=计数(*) 在主表单页脚文本框中,控制源为

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

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

在主表单页脚文本框中,控制源为
=[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
专用子过滤器()
将fSQL设置为字符串
fSQL=“选择[字段]”和_
“从tbltable1左连接tbltable1.ID=tbltable2.FKtbl1ID上的tbltable2”&_
“其中((tbltable3.ID)不为Null)和((tbltable4.ID)不为Null))”
如果Nz(Me.cboFilterTo.Value,0)为0,则
fSQL=fSQL&“和tbltable5.ID=“&Me.cboFilterTo.Column(0)
如果结束
如果Nz(Me.cboFilterFrom.Value,0)为0,则
fSQL=fSQL&“和tbltable6.ID=“&Me.cboFilterFrom.Column(0)
如果结束
如果Nz(Me.txtDateOnOrAfter,0)0,则
fSQL=fSQL&“和tbltable4.dtdate>=”&Me.txtDateOnOrAfter
如果结束
如果Nz(Me.txtDateOnOrBefore,0)0,则

fSQL=fSQL&“和tbltable4.dtdate我找到了答案,所以我想为任何可能有帮助的人发布解决方案

为了加快表单加载速度,我将初始fSQL select转换为SQL视图,然后将初始fSQL设置为:

fSQL = "SELECT * FROM vw_MyNewView WHERE 1 = 1 "
然后,在设置子窗体的recordsource并重新查询它之后,我有以下内容:

With Me.frmSubform.Form.RecordsetClone
    If .RecordCount > 0 Then .MoveLast
    ccount = .RecordCount
End With
Me.txtCountRecords = ccount & " Records"
表单加载速度更快,而且该计数也可以快速制表


希望这对其他人有帮助!

通常,对于SQL后端和更大的记录集,总是尝试加载一个没有底层记录的表单,然后根据用户选择只加载一个筛选集,这是一种非常好的做法。很高兴你把它整理好了!是的,我还必须提醒自己尽可能创建SQL视图,而不是在VB中构建所有视图A.它的加载速度非常慢,在VBA中构建它。