Problemstellung:
Die Dömanenfunktionen wie DLookup, DCount, DSum usw. sind schon eine feine Sache.
Der Haken ist nur das diese Funktionen unendlich langsam sind.
Eine Alternative wären SQL-Funktionen die in einem Recordset aufgerufen werden.
Hier eine Lösung dafür.
Verweis auf die Microsoft DAO 3.X Object Library erforderlich
Public Enum ltDomWert ltDLookup = 0 ltDCount = 1 ltDMax = 2 ltDMin = 3 ltDFirst = 4 ltDLast = 5 ltDSum = 6 ltDAvg = 7 End Enum Function fcDomWert(Expression As String, Domain As String, _ Optional Criteria As String, _ Optional ltDomArt As ltDomWert) As Variant Dim bytWert As Byte Dim strSQL As String Dim rs As DAO.Recordset If IsMissing(ltDomArt) Then bytWert = 0 Else bytWert = ltDomArt End If Select Case bytWert Case 0: strSQL$ = "SELECT " & Expression$ & " FROM " & Domain$ Case 1: strSQL$ = "SELECT COUNT(" & Expression$ & ") FROM " & Domain$ Case 2: strSQL$ = "SELECT MAX(" & Expression$ & ") FROM " & Domain$ Case 3: strSQL$ = "SELECT SUM(" & 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 rs.Close Set rs = Nothing End Function
Mit dieser Funktion können alle Domänenfunktionen abgedeckt werden.
Aufruf:
Um z.B. die Summe von Datensätzen zu erhalten die einem bestimmten Kriterium entsprechen.
Dim i As Integer i = fcDomWert("DeinAutowertfeld", "DeineTabelle", "[DeinKriteriumsfeld] = " _ & DeinKriterium, ltDCount)
Das ist nur ein Bsp.
Ähnliche Artikel
Weiterlesen...