Problemstellung:
Für 32Bit und 64Bit Office Versionen
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 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 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...