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