2

以前の質問に対する素晴らしい回答(Hansup と Remou に感謝) のおかげで、実行時にプルする ADODB レコードセットに基づいて Access フォームを作成しました。これにより、メモリ内のみにあるチェックボックスを持つことができます。チェックボックスは問題ありません。

「クライアント」によるドロップダウン フィルターをフォームに追加するように依頼されました。簡単です。ドロップダウン ボックスを作成し、コントロール ソースのクエリを少し作成し、After_Update イベントに次のコードを追加しました。

Private Sub Combo_PickClient_AfterUpdate()
    Me.Filter = "Client='" & Combo_PickClient.Value & "'"
    Me.FilterOn = True
    Me.Refresh
End Sub

テスト目的で、2 つのクライアントを選択しました。フォームを開くと、両方のクライアントのデータが表示されます (良い)。1 つのクライアントを選択すると、データが正常にフィルター処理されます (これも良好です)。2 番目のクライアントを選択すると、何も実行されません (あまり良くありません)。

このフィルターが 1 回しか機能しないのはなぜですか? エラーは発生しません。画面が更新されるだけで、それだけです。

4

1 に答える 1

1

私の推測では、空でない.Filterプロパティを変更または削除しようとすると、Access はデータ プロバイダーからフォームのレコードセットを再読み込みしようとします。切断されたレコードセットにはプロバイダーがないため、その試行は失敗します。私のテストでは、ある時点でエラー #31「データ プロバイダーを初期化できませんでした」が発生しました。

最初の試行 (成功) では、.Filterプロパティは事前に空でした。私は同じ動作.Filterを確認しました.Access は、データ プロバイダーに再度アクセスすることなく、フィルター処理されていないレコードセットに a を適用できると推測しています。

推測ですみません。残念ながら、これが私が説明できる最善の方法です。

.Filterとにかく、フォームのプロパティを使用して目的を達成することをあきらめました。句に.Filter文字列を含むクエリに基づいて、切断されたレコードセットを単純に再読み込みする方が簡単であることがわかりました。WHEREコードの変更はわずかで、実行時のパフォーマンス コストはごくわずかです。コンボ ボックスの選択を変更すると、リロードされたレコードセットが即座に表示されます。

最初に、切断されたレコードセットを構築するコードをForm_Open、シグネチャが ... である別の関数に移動しました。

Private Function GetRecordset(Optional ByVal pFilter As String) _
    As ADODB.Recordset

この関数は、切断されたレコードセットをフィードするクエリの句に空でないpFilter引数を組み込みます。WHERESELECT

それから私はForm_Open一つの声明に変わりました...

Set Me.Recordset = GetRecordset()

したがって、コンボ ボックスと切断されたレコードセットが両方とも同じフォーム上にある場合、コンボの更新後の手順は次のようになります。

Private Sub Combo_PickClient_AfterUpdate()
    Set Me.Recordset = GetRecordset("Client='" & _
        Me.Combo_PickClient & "'")
End Sub

私の場合、切断されたレコードセットはサブフォームに表示され、コンボ ボックスはその親フォームにあります。そこで、サブフォーム コード モジュールでラッパー プロシージャを作成し、それをコンボの After Update から呼び出します。

Call Me.SubFormControlName.Form.ChangeRecordset("Client='" & _
    Me.Combo_PickClient & "'")

ラッパーの手順は非常に単純ですが、便利だと思いました...

Public Sub ChangeRecordset(Optional ByVal pFilter As String)
    Set Me.Recordset = GetRecordset(pFilter)
End Sub
于 2013-01-26T16:22:21.223 に答える