Rubrik: Datenbanken · DAO | VB-Versionen: VB5, VB6 | 14.06.05 |
Anzahl Datensätze korrekt ermitteln (DAO) Die RecordCount-Eigenschaft des Recordset-Objekts arbeitet nicht immer zuverlässig :-( | ||
Autor: Dieter Otter | Bewertung: | Views: 24.645 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Haben Sie sich auch schon einmal gewundert, dass hin und wieder die beim Abfragen der Anzahl der Datensätze eines Recordsets eine falscher Wert zurückgegeben wird? Dies ist immer dann der Fall, wenn man hierzu die RecordCount-Eigenschaft des Recordset-Objekts oder des TableDefs-Objekts verwendet, nachdem man viele Datensätze hinzugefügt oder gelöscht hat. In diesem Fall hilft nur das "Komprimieren" der Datenbank über die "CompactDatabase"-Methode. Danach gibt "RecordCount" wieder die korrekte Anzahl der Datensätze zurück.
Da man aber meist nicht weiß, ob die von der RecordCount-Eigenschaft zurückgegebene Anzahl Datensätze korrekt oder nicht korrekt ist, möchten wir Ihnen mit diesem Tipp eine Alternative zur Ermittlung der Datensatz-Anzahl zeigen. Hierzu erstellen wir ein Recordset, wobei wir einfach die Summe aller Felder als SQL-Aggregatfunktion SUM(*) nehmen. Das Eregbnis ist dann die korrekte Anzahl der vorhandenen Datensätze. Das Ganze packen wir natürlich in eine universelle Funktion mit einem optionalen Parameter für eine evtl. benötigte WHERE-Bedingung, falls die Summe der Datensätze für bestimmte Kriterien ermittelt werden soll.
' korrekte Anzahl der Datensätze ermitteln Public Function dbRecCount(oDB As Database, ByVal sTable As String, _ Optional ByVal sWHERE As String = "") As Long Dim oRs As DAO.Recordset Dim sSQL As String ' Recordset erstellen sSQL = "SELECT Count(*) FROM " & sTable & IIf(Len(sWHERE) > 0, " WHERE " & sWHERE, "") Set oRs = oDB.OpenRecordset(sSQL, dbOpenSnapshot, dbOpenForwardOnly) If oRs.RecordCount > 0 Then dbRecCount = oRs(0) End If oRs.Close Set oRs = Nothing End Function
Beispiel für den Aufruf:
' Anzahl Datensätze der Tabelle "Kunden" ermitteln Dim nRecCount As Long nRecCount = dbRecCount(oDB, "Kunden") ' Anzahl Datensätze der Tabelle "Kunden" ermitteln, deren ' Namen mit A beginnen nRecCount = dbRecCount(oDB "Kunden", "Name LIKE 'A*')
Autom. Komprimieren der Datenbank
Da die Funktion "dbRecCount" immer die korrekte Anzahl der Datensätze ermittelt könnte man jetzt bspw. die Datenbank autom. komprimieren, sobald die RecordCount-Eigenschaft des TableDefs-Objekts von der ermittelten Anzahl durch "dbRecoCount" abweicht. Das ganze bietet sich dann beim Starten oder beim Beenden der Anwendung an:
Private Sub Main() ' Start-Prozedur ... ' Prüfen, ob Datenbank komprimiert werden muss Dim oDB As DAO.Database Set oDB = DBEngine.OpenDatabase(App.Path & "\KUNDEN.MDB") If dbRecCount(oDB, "Kunden") <> oDB.TableDefs("Kunden").RecordCount Then ' Datenbank muss komprimiert werden! oDB.Close Set oDB = Nothing dbCompact App.Path & "\KUNDEN.MDB" Else oDB.Close Set oDB = Nothing End If ... End Sub
Den Code der Funktion "dbCompact" finden Sie hier:
Datenbanken komprimieren mit DAO