Hallo zusammen,
Ersatzfunktionen für Domänenfunktionen (Dlookup, DCount, etc) gibts ja gefühlt seit Jahrzehnten. Ich setzte diese auch ein - eine Version von Sascha Trowitzsch.
Gerade der Ersatz von Dlookup setzte ich häufig ein, und habe daher die Funktion etwas geändert - um nicht nur genau einen Feldwert zurückzubekommen, sondern um den Inhalt mehrere Tabellenfelder zu erhalten.
Dazu fügt man folgende Funktion in einem Modul ein:
Public Function DomFkt(ByVal Expression As String, ByVal Domain As String, Optional ByVal Criteria As String = "", Optional ByVal Fkt As DomType = 0) As Variant
Dim strSQL As String
Dim ExpressionCounter As Long
Dim retArr As Variant
Dim i As Long
ExpressionCounter = UBound(Split(Expression, ","))
ReDim retArr(ExpressionCounter)
Select Case Fkt
Case 0
strSQL = "SELECT " & Expression & " FROM " & Domain
Case 1
strSQL = "SELECT COUNT(" & Expression & ") FROM " & Domain
Case 2
strSQL = "SELECT Min(" & Expression & ") FROM " & Domain
Case 3
strSQL = "SELECT MAX(" & 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 Not IsMissing(Criteria) Then strSQL = strSQL & " WHERE " & Criteria
If ExpressionCounter = 0 Then
DomFkt = DBEngine(0)(0).OpenRecordset(strSQL, dbOpenForwardOnly)(0)
Else
'Rückgabe als Array
With DBEngine(0)(0).OpenRecordset(strSQL, dbOpenForwardOnly)
For i = 0 To ExpressionCounter
retArr(i) = .Fields(i)
Next i
End With
DomFkt = retArr
End If
End Function
Im Deklarationsteil des Modules fehlt dann noch der entsprechende Enum-Typ:
Public Enum DomType
DLookup = 0
DCount = 1
DMin = 2
DMax = 3
DFirst = 4
DLast = 5
DSum = 6
DAvg = 7
End Enum
Jetzt kann man überall in seinem Projekt die Funktion anstelle von DCount oder DLookup etc. einsetzen ohne Performanceeinbuße befürchten zu müssen. Der Sinn des Enums ist dass man sich nicht merken muss wie die Option genau heißt, durch den Enum wird diese als Intellisense angezeigt.
Beispiel Vorname, Nachname von User 24:
Dim Userdata As Variant
Userdata = DomFkt("Vorname, Nachname", "TabelleUser", "UserID=24", DLookup)
Msgbox Userdata(0) & " " & Userdata(1)
Oder Alter von User 24:
Msgbox DomFkt("Alter", "TabelleUser", "UserID=24", DLookup)
Oder Anzahl User über 18 Jahre:
Msgbox DomFkt("UserID", "TabeleUser", "Alter>=18", DCount)
Die Option Fkt ist Optional und der Standardwert ist Dlookup. Man kann also auf die Angabe DLookup verzichten beim Aufruf.
Viel Spaß beim ausprobieren
Gruß Andreas