Ms access 在Access窗体上同时应用筛选器和OrderBy 背景

Ms access 在Access窗体上同时应用筛选器和OrderBy 背景,ms-access,ms-access-2007,Ms Access,Ms Access 2007,我正在寻找提高Access 2007表单速度/性能的方法。用户有两个不同的数据视图,每个视图都有不同的筛选和排序标准。我有一个切换此选项的复选框,并有处理切换事件的代码: Private Sub FilterOpenJobs_Click() If (FilterOpenJobs.Value) Then Me.Filter = "Status='Open'" Me.OrderBy = "EndDate"

我正在寻找提高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
我的问题是表单recordsource相当大,应用过滤器和排序需要一些时间。(还请注意,这些记录来自混合源:一些访问表,一些数据库表。)它运行得足够慢,以至于我能够看到
FilterOn
调用和
OrderByOn
调用之间的中间结果

问题 是否要同时应用筛选器和排序?是否有某种方法可以锁定表单,使其不被更新,以便两种情况同时发生?是否最好为表单
RecordSource
属性指定一个新值?如果在源SQL行中完成筛选和排序,表单是否会运行得更快?

“是否同时应用筛选和排序?”

是的,你的第三个问题提到了这一点。将修改后的SQL SELECT语句替换为表单的
RecordSource
。然后,您将有一次暂停,而不是在
过滤器
赋值后暂停,在
OrderBy
赋值后暂停,这一次暂停的持续时间比其他两次暂停的总和要短

至少我希望它会短一些。不需要太多的努力就能找到答案

更改
记录源
会自动触发
重新查询
,因此请确保不要在该点编写额外的
重新查询
,否则潜在的速度增益将消失

代码(由asker添加) 假设form recordsource属性是一个SQL SELECT语句(不是查询名称),没有任何where子句或order by子句:

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
“是否要同时应用筛选器和排序?”

是的,你的第三个问题提到了这一点。将修改后的SQL SELECT语句替换为表单的
RecordSource
。然后,您将有一次暂停,而不是在
过滤器
赋值后暂停,在
OrderBy
赋值后暂停,这一次暂停的持续时间比其他两次暂停的总和要短

至少我希望它会短一些。不需要太多的努力就能找到答案

更改
记录源
会自动触发
重新查询
,因此请确保不要在该点编写额外的
重新查询
,否则潜在的速度增益将消失

代码(由asker添加) 假设form recordsource属性是一个SQL SELECT语句(不是查询名称),没有任何where子句或order by子句:

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

一种解决方案可能是使用Application objects属性。它可防止在此类操作期间重新绘制ms access屏幕。不过有一点需要注意,那就是您必须确保在出现错误时重新启用它。否则,应用程序屏幕将不会响应任何内容

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的建议直接修改
记录源。

一种解决方案可能是使用Application objects属性。它可防止在此类操作期间重新绘制ms access屏幕。不过有一点需要注意,那就是您必须确保在出现错误时重新启用它。否则,应用程序屏幕将不会响应任何内容

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

我一直在寻找一种在表单本身上使用Filter和OrderBy的方法,但这种方法确实更快。如果您同意的话,我将编辑您的答案,添加我用来以“平滑”方式修改RecordSource属性的代码。我一直在寻找一种在表单本身上使用Filter和OrderBy的方法,但这种方法确实更快。如果您同意,我将编辑您的答案,添加我用于以“平滑”方式修改RecordSource属性的代码。