2012-08-15 38 views
0

時做一個數據表視圖只顯示100條記錄我有一個訪問一個表單,允許用戶看到一些數據的分類和/或過濾視圖2003前端數據庫。數據以子窗體顯示。爲什麼基於排序和篩選ADODB記錄

基本數據(形式打開時加載)檢索到斷開ADODB.Recordset對象(靜止客戶端遊標)。子窗體的Recordset屬性設置爲斷開的記錄集,並顯示所有記錄。

應用只是一個排序(在代碼)到記錄對象,然後設置子形式使用排序的記錄顯示與應用了正確的分類的數據。篩選器屬性設置爲adFilterNone以使其起作用。所有記錄都顯示(正確)。

應用只是一個過濾器(在代碼)到記錄對象,然後設置子形式使用過濾的記錄顯示與應用了正確的過濾器的數據。 sort屬性被設置爲一個空字符串以便工作。顯示所有匹配過濾器的記錄(正確)。

如果在記錄集上設置了排序屬性和篩選屬性,並且該記錄集隨後設置爲子窗體的Recordset屬性,則只顯示前100個匹配記錄(不正確)。它們按排序順序顯示。基礎記錄集對象顯示篩選記錄的正確記錄計數,它們並不全部顯示在表單上。

有沒有人知道爲什麼會發生這種情況,如果有辦法解決這個問題,除了每次使用新的SQL字符串創建一個記錄集?

在此先感謝。

回答

1

你所看到的過濾和排序是ADO記錄集的已知限制。

查看此頁面列出的ADO缺陷列表。注意底部的那個: http://www.utteraccess.com/wiki/index.php/Choosing_between_DAO_and_ADO

我在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必須始終在頂層。這也記錄在我上面發佈的鏈接中,但我不確定給出的示例是否準確。

+0

謝謝HK1,這有很大的幫助。有趣的是,ADODB似乎做的是正確的事情,它只是與它的交互,其中事情走得很快。我真的很感謝你回答我的問題,再次感謝。 – HanSolo 2012-08-20 04:40:14