News & Tipps zu Microsoft Access

Lesen Sie hier einige der besten Beiträge aus SmartTools Access Weekly sowie ausgewählte Inhalte anderer E-Mail-Newsletter von SmartTools Publishing rund um Microsoft Access.

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.