我正在寻找一种提高Access 2007表单速度/性能的方法。用户有两种不同的数据视图,每种视图都有不同的过滤和排序标准。我有一个复选框切换此选项并具有处理切换事件的代码:
Private Sub FilterOpenJobs_Click()
If (FilterOpenJobs.Value) Then
Me.Filter = "Status='Open'"
Me.OrderBy = "EndDate"
Me.FilterOn = True
Me.OrderByOn = True
Else
Me.Filter = ""
Me.OrderBy = "JOB_NO"
Me.FilterOn = False
Me.OrderByOn = False
End If
End Sub
我遇到的问题是表单记录源相当大,应用过滤器和排序需要一些时间。 (另请注意,记录来自混合来源:一些访问表,一些dBase表。)它运行缓慢,我能够看到FilterOn
调用和OrderByOn
调用之间的中间结果。
无论如何应用过滤器并同时排序?有没有办法锁定表单更新,以便两者都可以立即发生?我最好为表单RecordSource
属性分配一个新值吗?如果在行源SQL中完成过滤和排序,表单会运行得更快吗?
答案 0 :(得分:1)
“无论如何应用过滤器并同时排序?”
是的,你提到了第三个问题。将修改后的SQL SELECT语句替换为表单RecordSource
。然后,在Filter
分配后,而不是OrderBy
之后的另一个暂停,而不是在RecordSource
之后的另一个暂停,您将有一个暂停,其持续时间短于另一个2的总和。
至少我希望它会更短。找出来不应该花费太多精力。
更改Requery
会自动触发Requery
,因此请确保不要在此时编码额外的Private Sub Form_Open(Cancel As Integer)
Me.Tag = Me.RecordSource
FilterOpenJobs_Click
End Sub
Private Sub FilterOpenJobs_Click()
If (FilterOpenJobs.Value) Then
Me.RecordSource = Replace(Me.Tag, ";", " WHERE Status='Open' ORDER BY EndDate;")
Else
Me.RecordSource = Replace(Me.Tag, ";", " ORDER BY JOB_NO DESC;")
End If
End Sub
,否则潜在的速度增益将会消失。
假设表单recordsource属性是一个SQL SELECT语句(不是查询名称),没有where子句或order by子句:
{{1}}
答案 1 :(得分:0)
一种解决方案可能是使用Application对象Echo属性。它可以防止ms访问屏幕在此类操作期间重新绘制。但需要注意的一点是,如果出现错误,必须确保重新启用它。否则,应用程序屏幕将无法响应任何内容。
Private Sub FilterOpenJobs_Click()
On Error GoTo handler:
Application.Echo False, "Processing...."
If (FilterOpenJobs.Value) Then
Me.Filter = "Status='Open'"
Me.OrderBy = "EndDate"
Me.FilterOn = True
Me.OrderByOn = True
Else
Me.Filter = ""
Me.OrderBy = "JOB_NO"
Me.FilterOn = False
Me.OrderByOn = False
End If
Application.Echo True, ""
Exit Sub
handler:
Application.Echo True, ""
MsgBox Err.Description
End Sub
或者,您可以像HansUp建议的那样直接修改RecordSource
。