This is an old revision of the document!
Eine Aggregationsfumktion um Feldinhalte auf einer Spalte zu gruppieren. Entspricht etwa dem LISTAGG() aus Oracle oder GROUP_CONCAT() as MySQL.
Download udf_groupconcat.bas (V-2.0.0)
Ich brauchte die Funktion GROUP_CONCAT(), wie man sie in MySQL kennt. Kurze Suche im Web hat mir gezeigt, dass man so was am besten über DAO macht. Unter Flatting a Table (Using VBA) wurde ich fündig. Doch irgendwie war die Funktion nicht nach meinem Geschmack. Darum habe ich kurzerhand selber eine Funktion geschrieben.
Die Funktion sollte nicht innerhalb eines SQL auf grössere Datenmengen angewendet werden.
Die Performance wird stark darunter leiden
Text = groupConcat(Feld, Quelle [,Kriterium [,Delimiter [,Sortierung [,Eindeutigkeit]]]])
Public Function groupConcat( _ ByVal iExpr As String, _ ByVal iDomain As String, _ Optional ByVal iCriteria As Variant = Null, _ Optional ByVal iDelimiter As String = ", ", _ Optional ByVal iOrderBy As Varian = Null, _ Optional ByVal iDistinct As Boolean = False _ ) As String
Der Rückgabelwert ist entweder eine Stringliste oder ein leerer String falls keine Details gefunden wurden. Sollte ein Fehler auftreten, wird #ERR und der Fehlertext zurückgegeben.
DConcat ist ein Alias zu groupConcat. Den habe ich erstellt, um die Funktion den Access-Funktionen DCount, DLookup etc. enzupasen. Einziger Unterschied nebst dem Funktionsnamen: iDistinct ist Default auf True.
Text = DConcat(Feld, Quelle [,Kriterium [,Delimiter [,Sortierung [,Eindeutigkeit]]]])
Public Function DConcat( _ ByVal iExpr As String, _ ByVal iDomain As String, _ Optional ByVal iCriteria As Variant = Null, _ Optional ByVal iDelimiter As String = ", ", _ Optional ByVal iOrderBy As Variant = Null, _ Optional ByVal iDistinct As Boolean = True _ ) As String
Eine einfache Abfrage auf eine Tabelle
'Enfache Abfrage. Duplikate werden nicht unterdrückt debug.print groupConcat("set_name","my_table"," group_id=12") Montags-Report, TEST, TEST 'oder mit DConcat(). Duplikate werden standartmässig unterdrückt debug.print DConcat("set_name","my_table"," group_id=12") Montags-Report, TEST 'Die Unterdrückung kann auch aufgehoben werden. Zudem der Delimiter und die Sortierung angepasst debug.print DConcat("set_name","my_table"," group_id=12", "-", "mein_datum", false) TEST-Montags-Report-TEST
Die Funktion ist prädestiniert um innerhalb eines SQL-Statements anzuwenden. Damit wird die Funktion auf jede Zeile angewendet.
SELECT t.group_id, DCONCAT("set_name","my_table"," group_id=" & t.group_id, , "mein_datum") FROM my_table AS t GROUP BY t.group_id
Man kann die Funktion auch in einem berechneten Textfeld eines Report-Fusses (oder Kopf) verwenden. Dabei kann man die Quelle und den Filter des Reports automatisch übernhemen
=groupConcat("name";[RecordSource];IIf([FilterOn];[Filter];""))
Ebenfalls in einem Gruppenfuss. Der Filter muss um das Gruppierungsfeld erweitertwerden. In diesem Beispiel das Feld my_group_field.
=groupConcat("name";[RecordSource];IIf([FilterOn];[Filter];"TRUE") & " AND [my_group_field] = " & [my_group_field])
Die meisten Felder sind normale SQL-String. Sprich es gelten die folgenden Regelen:
[]
geschrieben werden#MM/DD/YYYY#
, #HH:NN:SS#
bzw. #MM/DD/YYYY HH:NN:SS#
'Felder mit Leerzeichen und Sonderzeichen groupConcat("[Mein Feld]","[Meine Tabelle]","[Filter Code]='Zürich'", ".", "[Mein Soriterfeld Nr.3]") 'Filterwert als Datum groupConcat("MeinFeld","MeineTabelle","[Von Datum]>=#11/01/2015#") groupConcat("MeinFeld","MeineTabelle","[Von Datum]>=" & Format([meinDatumsFeld], "\#mm\/dd\/yyyy\#") 'Filterwert als String mit ' groupConcat("MeinFeld","MeineTabelle","FilterCode>='abc'") groupConcat("MeinFeld","MeineTabelle","FilterCode>='" & [filerFeld] & "'") 'oder mit "" groupConcat("MeinFeld","MeineTabelle","FilterCode>=""abc""") groupConcat("MeinFeld","MeineTabelle","FilterCode>=""" & [filerFeld] & """") 'Filter ist ein Boolean groupConcat("MeinFeld","MeineTabelle","FilterCode=True") groupConcat("MeinFeld","MeineTabelle","FilterCode=" & [meinBooleanFeld]) 'Filter ist eine Zahl groupConcat("MeinFeld","MeineTabelle","FilterCode>=123") groupConcat("MeinFeld","MeineTabelle","FilterCode>=" & [meinZahlenFeld])
Unable to display file "/vba/access/functions/udf_groupconcat.bas": It may not exist, or permission may be denied.