Guten Morgen!
Ich arbeite momentan mit einer Tabelle die mehr als 800.000 Datensätze besitzt.
Ich muss die Anzahl der Datensätze mit einer bestimmten Belegnummer zählen.
Anfangs tat ich das ganz einfach mit DLookup("[Feld]", "Tabelle", "Kriterium").
Habe im Internet jedoch eine clevere Variante gefunden, die das ganze etwas zu beschleunigt:
Function fcDomWert(Expression As String, Domain As String, _
Optional Criteria As String, _
Optional ltDomArt As ltDomWert = ltDLookup) As Variant
Dim strSQL As String
Dim rs As DAO.Recordset
Select Case ltDomArt
Case 0: strSQL$ = "SELECT " & Expression$ & " FROM " & Domain$
Case 1: strSQL$ = "SELECT COUNT(*) FROM " & Domain$
Case 2: strSQL$ = "SELECT MAX(" & Expression$ & ") FROM " & Domain$
Case 3: strSQL$ = "SELECT MIN(" & Expression$ & ") FROM " & Domain$
Case 4: strSQL$ = "SELECT FIRST(" & Expression$ & ") FROM " & Domain$
Case 5: strSQL$ = "SELECT LAST(" & Expression$ & ") FROM " & Domain$
Case 6: strSQL$ = "SELECT SUM(" & Expression$ & ") FROM " & Domain$
Case 7: strSQL$ = "SELECT AVG(" & Expression$ & ") FROM " & Domain$
End Select
If Nz(Criteria$, "") <> "" Then strSQL$ = strSQL$ & " WHERE " & Criteria$
Set rs = CurrentDb.OpenRecordset(strSQL$, dbOpenForwardOnly)
If rs.EOF Then
fcDomWert = Null
Else
fcDomWert = rs.Fields(0)
End If
' Debug.Print fcDomWert 'Nur zum Testen
rs.Close
Set rs = Nothing
End Function
Ist mir dennoch etwas zu langsam.
Das Feld Belegnummer ist indiziert.
Hat jemand von euch eine Idee, was sich da noch machen lässt?
Eine weitere Sache die sich in die Länge zieht ist das Finden des ersten Datensatzes, auf den bestimmte Kriterien zutreffen.
Die eigentlichen Daten die ich benötige liegen in den letzten 20.000 Datensätzen der Tabelle, da vorherige Daten bereits verarbeitet und verändert wurden und für meine Funktion nicht relevant sind.
D.h. er durchsucht die ersten 700.000+ Datensätze obwohl ich weis, dass er kein Ergebnis finden wird.
Kann man ihm nicht eine exakte Position (bspw. Datensatz #700.000) mitgeben, an die er sich begibt bevor ich ihn mit FindFirst auf die Suche nach bestimmten Datensätzen schicke? MoveLast & FindPrevious sind hier leider keine Option; ist nicht umsetzbar.
Grüße Bexlight
|