Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Tip: Domänenfunktion Ersatz

Begonnen von Hondo, Januar 02, 2020, 13:34:52

⏪ vorheriges - nächstes ⏩

Hondo

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