我有一个Access 2003前端数据库,其表单允许用户查看某些数据的已排序和/或过滤视图。数据以子表格形式显示。
基础数据(在打开表单时加载)将被检索到断开连接的ADODB.Recordset对象(静态客户端游标)。子表单的Recordset属性设置为断开连接的记录集,并显示所有记录。
仅对记录集对象应用排序(在代码中),然后将子表单设置为使用已排序的记录集,即可显示应用了正确排序的数据。 filter属性设置为adFilterNone,以使其正常工作。显示所有记录(正确)。
仅将一个过滤器(代码中)应用于记录集对象,然后设置子表单以使用过滤后的记录集,即可显示应用了正确过滤器的数据。 sort属性设置为空字符串,以使其起作用。显示与过滤器匹配的所有记录(正确)。
当在记录集上设置sort属性和filter属性,然后将该记录集设置为子表单的Recordset属性时,仅显示前100个匹配记录(不正确)。它们按排序顺序显示。基础记录集对象显示已过滤记录的正确记录计数,它们不会全部显示在表单上。
有没有人知道为什么会这样,除了每次使用新的SQL字符串创建记录集之外还有办法解决这个问题吗?
提前致谢。
答案 0 :(得分:1)
您在过滤和排序方面看到的是ADO记录集的已知限制。
查看此页面上列出的ADO Cons列表。注意底部的那个: http://www.utteraccess.com/wiki/index.php/Choosing_between_DAO_and_ADO
我在MS的支持网站上找不到关于此的任何文档,因此我不知道这是一个错误还是仅仅是一个限制。我假设它是后者。
仅供参考,我认为MS基本上已经忘记了ADO(经典)。 MDAC的最后一个版本(这是你如何获得ADO)是5/10/2005。
对于此问题的解决方法,您可以尝试使用此功能。它返回一个新的,已过滤和排序的记录集。只需保留一个大的,完整的记录集,并在每次进行排序/过滤时使用此功能来获取新的记录集。这确实会增加您的整体资源使用量,尤其是内存。
我已经使用过这个功能,但它还没有经过全面测试,以确保它在各方面都是防弹。您可能很快就会发现一些错误或限制。我实际上有一个说明,它需要某种工作,但我的说明不清楚,我现在没有时间测试它,我确实发现我在我的生产代码中使用此功能,所以我认为它正在工作。
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记录集的另一个奇怪限制是您的OR关键字必须始终位于顶层。这也记录在我上面发布的链接中,虽然我不确定给出的例子是否准确。