1

バックグラウンド

Access 2007 フォームの速度/パフォーマンスを改善する方法を探しています。ユーザーには、データの 2 つの異なるビューがあり、それぞれに異なるフィルターと並べ替えの基準があります。このオプションを切り替えるチェックボックスがあり、トグル イベントを処理するコードがあります。

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

私が抱えている問題は、フォーム レコードソースがかなり大きく、フィルターと並べ替えの適用に時間がかかることです。FilterOn(また、レコードは混合ソースからのものであることに注意してください: いくつかの Access テーブル、いくつかの dBase テーブル。)呼び出しと呼び出しの間の中間結果を確認できるほどゆっくりと実行されOrderByOnます。

質問

フィルターと並べ替えを同時に適用する方法はありますか? 両方が同時に発生するように、フォームの更新をロックする方法はありますか? フォームRecordSourceプロパティに新しい値を割り当てたほうがよいでしょうか? 行ソース SQL でフィルター処理と順序付けを行った場合、フォームの実行速度は速くなりますか?

4

2 に答える 2

1

フィルタと並べ替えを同時に適用する方法はありますか?

はい、3 番目の質問で触れました。改訂された SQL SELECT ステートメントをフォームの .xml として置き換えますRecordSource。次に、Filter割り当ての後にOrderBy1 回の一時停止と .

少なくとも私はそれが短くなることを願っています。見つけるのに多くの努力は必要ありません。

RecordSourceを自動的に変更するとがトリガーされるため、その時点で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

解決策の 1 つは、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

RecordSourceまたは、 HansUp が提案したように直接変更することもできます。

于 2012-07-12T16:49:02.017 に答える