Beitrag aus SmartTools Access Weekly
Abfrageergebnisse zusammenfassen und als Zeichenkette bereitstellen
Access 365 2021 2019 2016 2013 2010
Abfrageergebnisse benötigen Sie häufig nicht in der Datenblattansicht, sondern als Zeichenkette oder Array zur Weiterverarbeitung. In der Regel initialisieren Sie dazu ein Recordset, durchlaufen es und fassen die benötigten Feldinhalte in einer Zeichenkette zusammen. Wenig bekannt ist die Tatsache, dass ein ADO-Recordset eine Methode bereitstellt, die Ihnen diese Arbeit abnimmt und das Ergebnis blitzschnell zur Verfügung stellt.
Dim strResults As String
'Access/VBA
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT Firma FROM Kunden;", _
dbOpenSnapshot)
While Not rs.EOF
strResults = strResults & rs("Firma") & vbCrLf
rs.MoveNext
Wend
rs.Close
Set rs = Nothing
Set db = Nothing
Auf dieser Basis haben wir eine Funktion "QueryAsString()" entwickelt, die den oben gezeigten Aufwand auf eine Zeile reduziert:
strResults = _
QueryAsString("Firma", _
"Kunden", _
"", _
"|", _
vbCr)
Als Parameter übergeben Sie einen SELECT-Ausdruck ("*", "Firma, Ansprechpartner, Telefon"), eine FROM-Domäne (Tabelle oder Abfrage) , optional eine WHERE-Klausel (Default= alles selektieren) und ebenfalls optional Trennzeichen (Default= Semikolon und Zeilenschaltung) für Feldinhalte und Datensätze. Mit diesen Parametern geht die Funktion dann folgendermaßen um:
Function QueryAsString(Expr, _
Domain, _
Optional Criteria = "", _
Optional ColDelim = ";", _
Optional RowDelim = vbCrLf) _
As String
Dim strSQL As String
Dim rs As ADODB.Recordset
strSQL = "SELECT " & Expr & " " & _
"FROM " & Domain & " " & _
IIf(Criteria = "", _
"", _
"WHERE " & Criteria)
Im ersten Schritt setzen wir hier eine SQL-Abfrage zusammen, die die gewünschten Daten selektiert.
Set rs = New ADODB.Recordset
rs.Open strSQL, _
CurrentProject.Connection, _
adOpenKeyset
Damit wird dann ein neues ADO-Recordset "rs" angelegt und initialisiert.
If Not rs.EOF Then
QueryAsString = _
rs.GetString(adClipString, _
-1, _
ColDelim, _
RowDelim)
Wenn das Recordset Daten enthält, weisen wir das Ergebnis des Aufrufs der Methode "GetString()" als Funktionsergebnis zu. "adClipString" definiert, dass die Daten als Zeichenkette geliefert werden sollen. "-1" legt fest, dass alle Datensätze berücksichtigt werden sollen. Benötigen Sie zum Beispiel nur die ersten 10 oder wollen maximal 1.000 Datensätze, geben Sie entsprechend "10" oder "1000" an. Die nächsten beiden Parameter definieren Trennzeichen für Feldinhalte und Datensätze.
If QueryAsString <> "" Then
QueryAsString = Left(QueryAsString, _
Len(QueryAsString) - Len(RowDelim))
End If
End If
Hat "GetString()" ein Ergebnis geliefert, wird das letzte Trennzeichen für Datensätze abgeschnitten.
rs.Close
Set rs = Nothing
End Function
Am Ende wird das Recordset wieder geschlossen und die Objektvariable dereferenziert. Das Ergebnis ist eine Zeichenkette, in der die Felder und Datensätze mit Trennzeichen wie angegeben zusammengefasst sind. Zum Beispiel bei einem Feld:
Alfreds Futterkiste
Ana Trujillo Emparedados y helados
Antonio Moreno Taquería
Around the Horn
Oder bei mehreren Feldern:
Alfreds Futterkiste;Maria Sanders;030-0074321|Ana Trujillo Emparedados y helados;Ana Trujillo; (5) 555-4729|Antonio Moreno Taquería;Antonio Moreno;(5) 555-3932|Around the Horn;Thomas Hardy;(71) 555-7788
Im ersten Beispiel wurde nur das Feld "Firma" mit dem Trennzeichen "vbCrLf" für Datensätze angefordert, das zweite Beispiel selektiert Firma, Ansprechpartner und Telefon mit dem Semikolon ";" als Trennzeichen für Felder und dem Pipe-Zeichen "|" als Trennzeichen für Datensätze. Eine Verarbeitung der Ergebnisse als Array könnte dann so aussehen:
arrRecords = Split(strResults, vbCrLf)
arrRecords = Split(strResults, "|")
.....
For I = 0 To UBound(arrRecords)
arrFields = Split(arrRecords(I), ";")
.....
Next I
Um die Funktion "QueryAsString()" in Ihren eigenen Datenbanken zu nutzen richten in der VBA-Entwicklungsumgebung über Extras-Verweise eine Referenz auf "Microsoft ActiveX Data Objects 2.x Library" ein.