vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Datenbanken · DAO   |   VB-Versionen: VB5, VB614.06.05
Anzahl Datensätze korrekt ermitteln (DAO)

Die RecordCount-Eigenschaft des Recordset-Objekts arbeitet nicht immer zuverlässig :-(

Autor:   Dieter OtterBewertung:  Views:  24.645 
www.tools4vb.deSystem:  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
 



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.