In Foren und Newsgroups wird immer wieder nach Möglichkeiten gefragt, einen oder mehrere Datensätze individuell auszuwählen, um anschließend irgendetwas mit diesen Datensätzen zu erledigen – beispielsweise um einen Bericht auf Basis der ausgewählten Daten zu füllen oder die Empfänger eines Serienbriefs zu bestimmen. Dieser Beitrag stellt verschiedene Möglichkeiten vor, um dies zu realisieren.
Datensätze auswählen
Manchmal streckt selbst der ausgeklügeltste Filter-Mechanismus die Flügel – nämlich dann, wenn die Auswahl von Daten auf Informationen basiert, welche die Datenherkunft nicht hergibt.
Der simpelste Fall: Sie möchten allen Kunden, die letztes Jahr besonders nett zu Ihnen waren, einen lieben Brief zu Weihnachten schicken. Und solange Ihre Kundentabelle kein Feld namens “Nettigkeit” enthält, müssen Sie die Auswahl wohl von Hand treffen.
Zum Auswählen bestimmter Datensätze nach individuellen Kriterien gibt es verschiedene Ansätze, deren Einsatz davon abhängt, wie die Ergebnismenge weiterverarbeitet werden soll und wie Sie die Daten anzeigen möchten.
Letzteres ist einfach, zumindest wenn Sie sich auf die Bordmittel von Access beschränken: Sie können die auszuwählenden Daten dann entweder in einem Unterformular in der Datenblattansicht anzeigen oder in einem Listenfeld. Das Listenfeld bietet dank Mehrfachauswahl eigentlich die schickere Variante, da die ausgewählten Datensätze automatisch farbig hinterlegt werden.
Das Unterformular in der Datenblattansicht können Sie eigentlich nur für die Mehrfachauswahl einsetzen, wenn Sie der Datenherkunft ein Ja/Nein-Feld zum Festlegen des Zustands hinzufügen. Auch dort gibt es eine Möglichkeit, ausgewählte Datensätze farbig hervorzuheben.
Ziel der Mehrfachauswahl
Unter Ziel verstehen wir die Art des Dokuments oder der Aktion, für welche die Datensätze ausgewählt werden. Davon hängt maßgeblich ab, welche der nachfolgend vorgestellten Techniken zum Auswählen mehrerer Datensätze Sie einsetzen können.
Für einen Word-Serienbrief, den Sie auf klassische Weise von Word aus mit den Daten einer Access-Tabelle oder -Abfrage füllen möchten, brauchen Sie beispielsweise eine entsprechende Tabelle oder Abfrage als Datenquelle. Dies bedeutet, dass Sie die Informationen über die Auswahl in einer Tabelle speichern müssen.
Wenn Sie den Serienbrief anders erstellen, etwa indem Sie von der Access-Anwendung aus jeweils eine Dokumentvorlage öffnen, diese per VBA automatisiert mit den ausgewählten Daten füllen und dann speichern und/oder drucken, brauchen Sie die Information über die ausgewählten Datensätze nicht in einer Tabelle zu speichern: Sie können diese dann direkt aus dem für die Auswahl verwendeten Element der Benutzeroberfläche, also dem Unterformular in der Datenblattansicht oder dem Listenfeld, entnehmen.
Beispieldaten und Beispiele
Der Einfachheit halber verwenden wir zu Testzwecken eine Tabelle namens tblPersonen mit den drei Feldern ID, Vorname und Nachname, die wir mit einigen Datensätzen gefüllt haben.
In den nachstehenden Abschnitten schauen wir uns die folgenden Beispiele für die individuelle Auswahl von Daten an:
- Mehrfachauswahl im Listenfeld
- Mehrfachauswahl im Datenblatt mit Ja/Nein-Feld in der Datenherkunft
- Mehrfachauswahl im Datenblatt mit 1:1-Beziehung
- Mehrfachauswahl im Datenblatt mit Markierung
- Mehrfachauswahl im Datenblatt mit temporärem Recordset
Ziel aller Beispiele ist es, über eine Schaltfläche namens cmdStart eine Liste der Primärschlüsselfelder der ausgewählten Datensätze im Direktfenster auszugeben. Wenn dies möglich ist, können Sie auch alle weiteren geplanten Aktionen mit den ausgewählten Daten durchführen.
Mehrfachauswahl im Listenfeld
Die Mehrfachauswahl im Listenfeld bietet sich eher für solche Fälle an, in denen Sie die Daten ad hoc verarbeiten und nicht speichern wollen. Dazu füllen Sie das Listenfeld namens lstMehrfachauswahl mit der gewünschten Datenherkunft tblPersonen.
Stellen Sie die beiden Eigenschaften Spaltenanzahl und Spaltenbreiten auf 3 und 1cm;4cm;4cm ein, damit alle drei Spalten angezeigt werden. Außerdem legen Sie für die Eigenschaft Mehrfachauswahl den Wert Erweitert fest.
Dies bedeutet, dass der Benutzer bei gedrückter Strg-Taste einzelne Einträge aus- und abwählen und durch zweimaliges Betätigen der Maustaste bei gedrückter Umschalttaste alle Elemente vom ersten bis zum zweiten angeklickten Element auswählen kann. Ein einfacher Klick ohne Umschalt- oder Strg-Taste hebt die Auswahl wieder auf.
Die Start-Schaltfläche des Formulars aus Bild 1 löst die folgende Ereignisprozedur aus Listing 1 aus.
Listing 1: Ausgewählte Einträge des Listenfelds auslesen
Private Sub cmdStart_Click() Dim varIndex As Variant Dim lngPersonID As Long For Each varIndex In Me!lstMehrfachauswahl.ItemsSelected lngPersonID = _ Me!lstMehrfachauswahl.ItemData(varIndex) ''Hier etwas mit lngPersonID erledigen Debug.Print lngPersonID Next varIndex End Sub
Bild 1: Individuelle Mehrfachauswahl im Listenfeld
Die For Each-Schleife durchläuft alle markierten Datensätze, auf die sie über die Auflistungs-Eigenschaft ItemsSelected des Listenfelds zugreift. Die Laufvariable varIndex liefert jeweils den Index der aktuell durchlaufenen Zeile zurück.
Um darüber auf den Wert der gebundenen Spalte, in diesem Falle mit dem Feld ID der Datenherkunft ausgestattet, zuzugreifen, verwenden Sie die ItemData-Eigenschaft unter Angabe von varIndex.
Einfache Mehrfachauswahl
Für weniger gewandte Benutzer mag die Einstellung Einfach für die Eigenschaft Mehrfachauswahl eine sinnvolle Alternative sein. Mit dieser Einstellung braucht man einen Eintrag einfach nur anzuklicken, um ihn auszuwählen, und wenn man ihn nicht mehr will, klickt man einfach erneut darauf.
Die Funktion zur Ermittlung der markierten Einträge funktioniert genau so wie bei der Einstellung Erweitert.
Mehrfachauswahl im Datenblatt mit Ja/Nein-Feld in der Datenherkunft
Die einfachste Möglichkeit, die Datensätze unserer Tabelle tblPersonen in der Datenblattansicht eines Unterformulars zu markieren, ist ein Ja/Nein-Feld in der betroffenen Tabelle (siehe Bild 2).
Bild 2: Kopie der Beispieltabelle mit einem Ja/Nein-Feld zum Speichern des Markiert-Status
Erstellen Sie ein Formular namens sfmPersonenJaNein und weisen Sie die Tabelle tblMehrfachauswahlJaNein der Eigenschaft Datenherkunft zu.
Ziehen Sie alle Felder aus der Feldliste in den Detailbereich der Entwurfsansicht und stellen Sie die Eigenschaft Standardansicht auf Datenblatt ein. Schließen Sie das Formular.
Erstellen Sie ein weiteres Formular, ziehen Sie das Unterformular aus dem Datenbankfenster beziehungsweise dem Navigationsbereich in den Detailbereich des Formularentwurfs und fügen Sie eine Schaltfläche namens cmdStart hinzu.
Speichern Sie das Formular, das in der Formularansicht nun wie in Bild 3 aussehen sollte, unter dem Namen frmMehrfachauswahlJaNein.
Bild 3: Mehrfachauswahl per Ja/Nein-Feld im Datenblatt
Die Ereignisprozedur, die durch die Schaltfläche ausgelöst wird, hat leichtes Spiel:
Sie braucht einfach nur ein Recordset auf Basis der Tabelle tblPersonen zu erzeugen, wobei eine WHERE-Bedingung die Datensätze auf diejenigen beschränkt, deren Feld Markiert den Wert True aufweist.
Diese durchläuft man einfach über die gängige Do While-Schleife und stellt mit dem Datensatz an, was auch immer man möchte (s. Listing 2).
Listing 2: Durchlaufen der Datensätze der Datenherkunft eines Unterformulars
Private Sub cmdStart_Click() Dim db As DAO.Database Dim rst As DAO.Recordset Dim lngPersonID As Long Set db = CurrentDb Set rst = db.OpenRecordset("SELECT * FROM tblPersonenJaNein WHERE Markiert = True", _ dbOpenDynaset) Do While Not rst.EOF lngPersonID = rst!ID ''Etwas mit lngPerson erledigen Debug.Print lngPersonID rst.MoveNext Loop Set db = Nothing End Sub
Der Vorteil dieser Variante ist, dass Sie damit auch leicht die Serienbrieferstellung aus Word heraus mit einer Datenherkunft versehen können. Sie brauchen einfach nur eine Abfrage zu erstellen, die alle markierten Datensätze zurückliefert und wie in Bild 4 aussieht.
Bild 4: Diese Abfrage liefert alle markierten Datensätze der Tabelle tblPersonenJaNein.
Wenn Sie die Markierung der Datensätze aufheben möchten, können Sie dies leicht durch eine kleine Ereignisprozedur erledigen, die beispielsweise durch eine Schaltfläche namens cmdAuswahlLoeschen im gleichen Hauptformular ausgelöst wird (s. Listing 3).
Listing 3: Aufheben der Markierung von Datensätzen
Private Sub cmdAuswahlLoeschen_Click() Dim db As DAO.Database Set db = CurrentDb db.Execute "UPDATE tblPersonenJaNein SET Markiert = FALSE", dbFailOnError Me!sfmMehrfachauswahlJaNein.Form.Requery Set db = Nothing End Sub
Mehrfachauswahl im Datenblatt mit 1:1-Beziehung
Möglicherweise können oder dürfen Sie die Tabelle mit den auszuwählenden Daten nicht ändern, um beispielsweise ein Ja/Nein-Feld zum Speichern des Markiert-Status hinzuzufügen. Auch dies ist kein Problem: Wir legen einfach eine zusätzliche Tabelle an, die per 1:1-Beziehung mit der ursprünglichen Tabelle verknüpft ist.
Diese Tabelle heißt tblPersonenMarkiert und sieht im Entwurf wie in Bild 5 aus. Das Feld PositionID ist ein Fremdschlüsselfeld zum Eintragen der ID des Datensatzes der Tabelle tblPersonen, auf den sich der Inhalt des Ja/Nein-Feldes Markiert bezieht.
Bild 5: Diese Tabelle speichert, ob ein Datensatz der Tabelle tblPersonen markiert ist oder nicht.
Damit das Feld PersonID der Tabelle tblPersonenMarkiert nur Werte enthält, die auch im Feld ID der Tabelle tblPersonen vorliegen, erstellen Sie eine Beziehung wie in Bild 6. Legen Sie die Beziehung an, indem Sie das Feld ID der Tabelle tblPersonen auf das Feld PersonID der Tabelle tblPersonenMarkiert ziehen – andersherum funktioniert es nicht, weil Access dann davon ausginge, dass das Feld ID der Tabelle tblPersonen das Fremdschlüsselfeld der Beziehung ist und nicht umgekehrt.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo