同时在Access窗体上应用Filter和OrderBy

时间:2012-07-12 16:33:15

标签: ms-access ms-access-2007

背景

我正在寻找一种提高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中完成过滤和排序,表单会运行得更快吗?

2 个答案:

答案 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