1

背景

我正在寻找一种方法来提高 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

我遇到的问题是表单记录源相当大,应用过滤器和排序需要一些时间。(另请注意,记录来自混合来源:一些 Access 表,一些 dBase 表。)它运行得足够慢,以至于我能够看到FilterOn调用和OrderByOn调用之间的中间结果。

问题

反正有没有同时应用过滤器和排序?是否有某种方法可以锁定表单以防止更新,以便两者都可以同时发生?我最好为表单RecordSource属性分配一个新值吗?如果在行源 SQL 中完成过滤和排序,表单会运行得更快吗?

4

2 回答 2

1

反正有没有同时应用过滤器和排序?

是的,你在第三个问题中提到了它。将修改后的 SQL SELECT 语句替换为表单的RecordSource. 然后,不是在Filter分配之后有一个停顿,而在 之后是OrderBy另一个停顿,您将有一个停顿,其持续时间比其他 2 个的总和短。

至少我希望它会更短。不应该花费太多精力来找出答案。

更改RecordSource自动触发 a Requery,因此请确保此时不要编写附加代码Requery,否则潜在的速度增益将消失。

代码(由提问者添加)

假设表单记录源属性是一个没有任何 where 子句或 order by 子句的 SQL SELECT 语句(不是查询名称):

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
于 2012-07-12T16:41:53.670 回答
0

一种解决方案可能是使用 Application objects 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

或者,您可以RecordSource按照 HansUp 的建议直接修改。

于 2012-07-12T16:49:02.017 回答