DatenbankManufaktur

Meine DConcat-Funktion

Als ordentliche Datenbankentwickler normalisiere ich meine Datenbanken, um Daten konsistent zu halten und Redundanzen zu vermeiden. Und regelmäßig benötige ich dann doch wieder denormalisierte Daten, um diese zu Informationszwecken anzuzeigen oder in Listen auszugeben.

Um mir dafür nicht jedes Mal eine spezielle Funktion schreiben zu müssen, habe ich mir eine allgemeine Funktion geschrieben, die ich immer wieder verwenden kann. Da es sich auch um eine Domänenfunktion handelt, habe ich sie – in Anlehnung an die schon enthaltenen Access-Funktionen (wie z. B. DLookup oder DSum) – DConcat genannt.

Da die neue Funktion ein bisschen mehr können muss, hat Sie auch ein paar mehr Parameter, die aber optional sind.

Syntax

DConcat( Ausdruck, Domäne [,Kriterien ] [, Reihenfolge ] [, Trennzeichen ] )

Die Syntax der DConcat-Funktion weist die folgenden Argumente auf:

Ausdruck (Expression)
Erforderlich. Ein Ausdruck, der das Feld angibt, dessen Wert zurückgegeben werden soll.

Domäne (Domain)
Erforderlich. Ein Zeichenfolgenausdruck, der die Gruppe von Datensätzen angibt, die die Domäne bilden. Es kann sich um einen Tabellennamen oder um einen Abfragenamen für eine Abfrage handeln, die keinen Parameter erfordert.

Kriterien (Criteria)
Optional. Ein Zeichenfolgenausdruck zur Beschränkung des Datenbereichs, für den die DConcat-Funktion ausgeführt wird. Kriterien entspricht z. B. häufig der WHERE-Klausel in einem SQL-Ausdruck, ohne das Wort »WHERE«.

Reihenfolge (Order)
Optional. Ein Ausdruck, der das Feld angibt, nach dem sortiert die Werte zurückgegeben werden sollen.

Trennzeichen (Seperator)
Optional. Eine Zeichenfolge, mit der die einzelnen zurückgegebenen Werte getrennt werden sollen. Standardwert ist ein Semikolon.

Hinweise

Die DConcat-Funktion gibt immer eindeutige Datensätze zurück. Wird als Reihenfolge nicht das Ausgabefeld, sondern ein anderes Feld gewählt, wird dieses dabei mitberücksichtigt. Die ausgegebene Werteliste kann dadurch Werte mehrfach enthalten.

Beim Reihenfolge-Feld kann für eine absteigende Reihenfolge zusätzlich der Parameter »DESC« mitgegeben werden. Soll nach mehreren Feldern sortiert werden, sind diese durch ein Komma separiert anzugeben.

Als Trennzeichen können auch Steuerzeichenfolgen (z. B. vbCrLf oder Chr(10)) verwendet werden, um die Listenwerte formatiert anzuzeigen.

Beispiele

fConcat("pkwModell", "tblPKW")

gibt eine Werteliste alle Modelle in der Tabelle PKW aus.

fConcat("pkwModell", "tblPKW", "pkwMarke = 'Opel'", "pkwModell", vbCrLf

listet alle Opel untereinander auf.

fConcat("pkwModell", "tblPKW", "pkwMarke = 'VW'", "pkwModell DESC", ", ")

gibt alle VW-Modelle absteigend sortiert, komma-separiert aus.

fConcat("pkwModell", "tblPKW", "pkwMarke = 'BMW'")

liefert NULL, wenn es keine BMW in der Tabelle gibt.

fConcat("pkwModell", "tblPKW", , "pkwBaujahr", " - ")

gibt alle Modelle nach Baujahr sortiert mit Bindestrich getrennt aus. Bei Modellen mit mehreren Baujahren auch Dubletten.

Code-Schnipsel

So sieht die Funktion (etwas vereinfacht) aus:

Public Function fConcat(Expression As String, Domain As String, _
                        Optional Criteria, Optional Order, _
                        Optional Seperator) As Variant
   ...
   strSQL = "SELECT DISTINCT " & Expression
   ' ggf. Sortierfeld hinzufügen (wg. DISTINCT)
   If Not IsMissing(Order) Then strSQL = strSQL & ", " _
                                         & Replace(Order, "DESC", "")
   strSQL = strSQL & " FROM " & Domain
   
   If Not IsMissing(Criteria) Then strSQL = strSQL & " WHERE " & Criteria
   If Not IsMissing(Order) Then strSQL = strSQL & " ORDER BY " & Order
   
   Set rst = CurrentDb.OpenRecordset(strSQL)

   If IsMissing(Seperator) Then Seperator = ";"

   Do While Not (rst.BOF Or rst.EOF)
      fConcat = fConcat & Seperator + rst(Expression)
      rst.MoveNext
   Loop

   ' Wenn mind. ein Wert enthalten ist ...
   If Len(fConcat) > 1 Then
      ' ... dann erstes Trennzeichen weglassen
      fConcat = Mid(fConcat, Len(Seperator) + 1)
   Else
      ' ... sonst auf NULL setzen
      fConcat = Null
   End If
   ...
End Function

Die vollständige Funktion, Beispieldaten und Beispielaufrufe gibt es in der Datei DConcat.accdb im folgenden Download.

Download

Meine DConcat-Funktion für Access 2007 (und neuer)
(Datei: DConcat.zip, ca. 30 KB)