0

Access 2003 フロント エンド データベースを使用して、ユーザーが一部のデータの並べ替えおよび/またはフィルター処理されたビューを表示できるフォームを使用しています。データはサブフォームに表示されます。

ベース データ (フォームが開かれたときに読み込まれる) は、切断された ADODB.Recordset オブジェクト (静的クライアント側カーソル) に取得されます。サブフォームの Recordset プロパティが切断されたレコードセットに設定され、すべてのレコードが表示されます。

レコードセット オブジェクトに (コードで) 並べ替えを適用し、並べ替えられたレコードセットを使用するようにサブフォームを設定すると、正しい並べ替えが適用されたデータが表示されます。これを機能させるには、フィルター プロパティを adFilterNone に設定します。すべてのレコードが表示されます (正しい)。

レコードセット オブジェクトに (コードで) フィルターのみを適用し、フィルター処理されたレコードセットを使用するようにサブフォームを設定すると、正しいフィルターが適用されたデータが表示されます。これを機能させるには、sort プロパティを空の文字列に設定します。フィルターに一致するすべてのレコードが表示されます (正解)。

sort プロパティと filter プロパティの両方がレコードセットに設定され、そのレコードセットがサブフォームの Recordset プロパティに設定されている場合、最初の 100 件の一致するレコードのみが表示されます (正しくありません)。それらはソート順に表示されます。基になるレコードセット オブジェクトには、フィルター処理されたレコードの正しいレコード数が表示されますが、すべてがフォームに表示されるわけではありません。

なぜこれが起こっているのか、そして毎回新しい SQL 文字列を使用してレコードセットを作成する以外にこれを回避する方法があるかどうかを知っている人はいますか?

前もって感謝します。

4

1 に答える 1

1

フィルタリングと並べ替えで表示されるのは、ADO レコードセットの既知の制限です。

このページにリストされている ADO Cons のリストを見てください。一番下にあるものに注目してください: http://www.utteraccess.com/wiki/index.php/Choosing_between_DAO_and_ADO

MS のサポート サイトでこれに関するドキュメントを見つけることができなかったので、これがバグなのか、単に制限なのかはわかりません。私は後者だと推測しています。

参考までに、MS は基本的に ADO (クラシック) を忘れていると思います。MDAC (ADO の入手方法) の最後のリリースは 2005 年 5 月 10 日でした。

この問題の回避策として、この機能を試すことができます。フィルター処理され、並べ替えられた新しいレコードセットを返します。大きな完全なレコードセットを手元に置いておき、ソート/フィルターを実行するたびにこの関数を使用して新しいレコードセットを取得してください。これにより、全体的なリソース使用量、特にメモリが増加します。

私はこの機能を使用しましたが、あらゆる点で防弾であることを確認するために十分にテストされていません. バグや制限をすぐに見つけることができます。私は実際に何らかの作業が必要であるというメモを持っていましたが、私のメモは不明確でした。今はテストする時間がありませんでした.本番コードでこの関数を使用していることがわかったので、機能していると思います.

Public Function GetFilteredRecordset(ByRef rsSource As ADODb.Recordset, _
                                        ByVal sWhere As String, _
                                        Optional ByVal sOrderBy As String, _
                                        Optional ByVal LockType As ADODb.LockTypeEnum = adLockUnspecified) As ADODb.Recordset

    Dim sOriginalOrderBy As String
    sOriginalOrderBy = rsSource.Sort
    Dim F As ADODb.Field
    For Each F In rsSource.Fields
        'Debug.Print F.Name
    Next F

    rsSource.Filter = sWhere
    If sOrderBy <> "" Then
        If Left(LCase(sOrderBy), 8) = "order by" Then sOrderBy = Trim(Right(sOrderBy, Len(sOrderBy) - 8))
        rsSource.Sort = sOrderBy
    End If
    Dim rsF As ADODb.Recordset

    Dim objStream As ADODb.Stream
    'Create a New ADO 2.5 Stream object
    Set objStream = New ADODb.Stream
    'Save the Recordset to the Stream object in XML format
    rsSource.Save objStream, adPersistXML
    'Create an exact copy of the saved Recordset from the Stream Object
    Set rsF = New ADODb.Recordset
    rsF.Open objStream, , , LockType

    rsSource.Filter = ""
    rsSource.Sort = sOriginalOrderBy
    'Close and de-reference the Stream object
    objStream.Close
    Set objStream = Nothing
    Set GetFilteredRecordset = rsF
End Function

ADO レコードセットのフィルタリングに関するもう 1 つの奇妙な制限は、OR キーワードが常に最上位にある必要があることです。上記のリンクにも記載されていますが、例が正確かどうかはわかりません。

于 2012-08-17T20:03:14.700 に答える