VBA Tipp: Liste per SQL aufbauen

Aus DBWiki
Wechseln zu: Navigation, Suche

Aufgabenstellung

  • Ich möchte in einem Formularfeld mehrere Werte aus einer Tabelle als Liste mit Trennzeichen darstellen.
  • Ich möchte die Datenquelle eines Kombinations- oder Listenfelds als Wertliste flexibel aufbauen.

Lösung

Die folgende Funktion erlaubt, derartige Listen per SQL flexibel zu erstellen:

Public Function SQLListe(ByVal SQL As String, _
                         Optional ByVal SepR As String = ";", _
                         Optional ByVal SepF As String = ";", _
                         Optional ByVal NoNullFields As Boolean = True) _
                         As String
 
' Die Felder, die mit dem SQL-String gewonnen werden,
' werden feldweise mit SepF, datensatzweise mit SepR getrennt.
' Wenn NoNullFields gesetzt ist, werden leere Felder unterdrückt.
' Quelle: www.dbwiki.net oder www.dbwiki.de
 
 Dim rs As DAO.Recordset
 Dim i As Long
 Dim Res As String
 Dim Tmp As String
 
 Set rs = CurrentDb.OpenRecordset(SQL, dbOpenSnapshot)
 
 On Error Resume Next
 
 If Err.Number <> 0 Then
   Res = "#Fehler"
   Err.Clear
 Else
   On Error GoTo 0
   Res = ""
 
   Do While Not rs.EOF
     Tmp = ""
 
     For i = 0 To rs.Fields.Count - 1
       If Not (NoNullFields And IsNull(rs(i))) Then
         Tmp = Tmp & SepF & rs(i)
       End If
     Next
 
     If Tmp <> "" Then
       Res = Res & SepR & Mid(Tmp, Len(SepF) + 1)
     End If
     rs.MoveNext
   Loop
 
   If Res <> "" Then
     Res = Mid(Res, Len(SepR) + 1)
   End If
 End If
 
 If Not rs Is Nothing Then rs.Close: Set rs = Nothing
 
 SQLListe = Res
 
End Function

Aufruf

  • Als Steuerelementinhalt eines berechneten Feldes:
=SQLListe("SELECT Nachname FROM tblPerson WHERE FirmaID = " & FirmaID;",";",")
  • Als Steuerelementinhalt eines berechneten Feldes, wenn der Schlüsselwert aus einem Textfeld "[ProjektNr]" kommt
    (der Lesbarkeit halber in 2 Zeilen wiedergegeben):
=SQLListe("SELECT ProjektNr, Beschreibung FROM tblProjekt
 WHERE ProjektNr ='" & [ProjektNr] & "'";", ";": ")
  • Als Zuweisung der Datensatzherkunft eines zweispaltigen Listenfelds per VBA:
Me!MeinListenFeld.RowSource = _
  SQLListe("SELECT Nachname,Vorname FROM tblPerson WHERE FirmaID = " & FirmaID)

Wiki-Links


Wiki faq.png FAQ: Dieser Artikel gehört zu den "Häufig gestellten Fragen" (FAQ). Die Seite Access-FAQ bietet eine Übersicht aller FAQ-Artikel.