Wenn Sie Daten in einer Tabelle haben, die nach einem bestimmten Kriterium in zwei Kategorien eingeteilt werden, benötigen Sie eine praktische Lösung, um die Einteilung vorzunehmen. In diesem Beitrag zeigen wir, wie Sie die Daten einer Tabelle, die beispielsweise über ein Ja/Nein-Feld in zwei Kategorien landen, nach diesem Feld verwalten können. Dazu nutzen wir einfach zwei Listenfelder, von denen eines die Ja-Einträge und eines die Nein-Einträge anzeigt. Das Ändern des relevanten Ja/Nein-Feldes und somit das Verschieben von der einen in die andere Gruppe und umgekehrt erledigen wir dabei per Doppelklick auf das betroffene Element.
Normalerweise erscheinen zwei Listenfelder, welche die Daten der gleichen Tabelle anzeigen, im Kontext von m:n-Beziehungen. Beispielsweise bei Fahrzeugen und Ausstattungsmerkmalen findet sich dann ein Auswahlfeld, mit dem man das Fahrzeug auswählen kann und zwei Listenfelder, von denen das eine die enthaltenen Ausstattungsmerkmale anzeigt und das andere die nicht enthaltenen Ausstattungsmerkmale.
Per Doppelklick oder auch mit entsprechenden Schaltflächen kann der Benutzer dann die Ausstattungsmerkmale hinzufügen oder entfernen.
Das hier zur Unterscheidung zweier Kategorien verwendete Ja/Nein-Feld macht es noch einfacher – es gibt keine m:n-Beziehung, sondern nur die Daten einer einzigen Tabelle, von denen die einen mit dem Wert Ja und die anderen mit dem Wert Nein gekennzeichnet sind.
In unserem Beispiel wollen wir eine Tabelle namens tblArtikel verwenden, die ein Feld namens Auslaufartikel enthält.
In der Datenblattansicht hat der Benutzer die Gelegenheit, einen Artikel durch das Ändern des Wertes eines Kontrollkästchens als Auslaufartikel zu markieren oder diesen wieder ins Sortiment aufzunehmen.
In der hier vorgestellten Lösung soll es einfacher sein: Wir wollen in einem Listenfeld alle Artikel anzeigen, die nicht auslaufen und in einem zweiten Listenfeld alle Auslaufartikel.
Beispieltabelle tblArtikel
In diesem Beitrag wollen wie die Tabelle tblArtikel der Südsturm-Beispieldatenbank als Beispiel verwenden. Diese stellt mit Auslaufartikel ein passendes Feld bereit (siehe Bild 1). Im Bild wird auch gleich ersichtlich, dass die Darstellung in der Datenblattansicht nicht optimal ist: Hier muss man alle Datensätze durchsehen, um die Auslaufartikel zu erkennen. Man könnte auch nach dem Feld Auslaufartikel sortieren oder nach dem Wert Ja oder Nein filtern, aber die Übersicht könnte doch besser sein. Daher erstellen wir nun ein Formular, dass die Auslaufartikel und die Nicht-Auslaufartikel in zwei Listenfeldern gegenüberstellt.
Bild 1: Tabelle mit Auslaufartikeln
Abfragen zur Auswahl von Auslaufartikel und Nicht-Auslaufartikeln
Bevor wir das Formular programmieren, wollen wir noch die beiden Abfragen erstellen, die als Datensatzherkunft für die beiden Listenfelder dienen. Die erste heißt qry-KeinAuslaufartikel und verwendet die Tabelle tblArtikel als Datenquelle. Sie liefert die drei Felder ArtikelID, Artikelname und Auslaufartikel, wobei das Feld Auslaufartikel als Kriterium verwendet wird – die Abfrage soll nur solche Datensätze liefern, deren Artikel keine Auslaufartikel sind (siehe Bild 2). Außerdem sortiert die Abfrage die Artikel aufsteigend nach dem Feld Artikelname.
Bild 2: Abfrage mit Artikeln, die nicht ausgelaufen sind
Die zweite Abfrage qryAuslaufartikel ist identisch aufgebaut, verwendet aber den Wert Wahr als Vergleichswert für das Kriterium mit dem Feld Auslaufartikel (siehe Bild 3).
Bild 3: Abfrage mit Artikeln, die ausgelaufen sind
Damit können wir in die Programmierung des Formulars mit den Listenfeldern einsteigen.
Listenfelder zum Selektieren von Auslaufartikeln
Das neue Formular frmAuslaufartikelVerwalten statten wir mit den beiden Listenfeldern lstKeineAuslaufartikel und lstAuslaufartikel aus.
Für das Formular selbst stellen wir die Eigenschaften Datensatzmarkierer, Navigationsschaltflächen, Bildlaufleisten und Trennlinien auf den Wert Nein und Automatisch zentrieren auf Ja ein.
Das Listenfeld lstKeineAuslaufartikel verwendet die Abfrage qryKeinAuslaufartikel als Datensatzquelle. Damit nur der Artikelname angezeigt wird, nicht jedoch der Primärschlüsselwert und der Inhalt des Feldes Auslaufartikel, stellen wir die Eigenschaft Spaltenanzahl des Listenfeldes auf 2 und die Eigenschaft Spaltenbreiten auf 0cm ein.
Damit werden nur die ersten beiden Spalten in die Darstellung aufgenommen und die erste Spalte durch die Spaltenbreite 0cm praktisch ausgeblendet.
Für das zweite Listenfeld lstAuslaufartikel stellen wir die gleichen Eigenschaften ein – mit Ausnahme der Eigenschaft Datensatzherkunft, der wir die Abfrage qryAuslaufartikel zuweisen.
Der Entwurf des Formulars erscheint danach wie in Bild 4.
Bild 4: Entwurfsansicht des Formulars frmAuslaufartikelVerwalten
Doppelklick-Ereignisse mit Funktion füllen
Damit der Benutzer die Einträge des linken Listenfeldes in das rechte Listenfeld verschieben kann und umgekehrt, sind folgende Schritte nötig:
- Der Wert des Feldes Auslaufartikel muss beim Doppelklick auf ein Element auf den umgekehrten Wert eingestellt werden, bei Wahr also auf Falsch und bei Falsch auf Wahr.
- Danach müssen die beiden Listenfelder aktualisiert werden, damit der geänderte Eintrag aus dem einen Listenfeld entfernt und zum anderen hinzugefügt wird.
Für das Ereignis Beim Doppelklicken des linken Listenfeldes lstKeineAuslaufartikel legen wir die Ereignisprozedur aus Listing 1 an. Die Prozedur prüft im ersten Schritt, ob der Benutzer einen Eintrag im Listenfeld angeklickt hat oder ob er in den leeren Bereich des Listenfeldes geklickt hat. Nur im ersten Fall werden die innerhalb der If…Then-Bedingung befindlichen Anweisungen ausgeführt.
Private Sub lstKeineAuslaufartikel_DblClick(Cancel As Integer) Dim db As DAO.Database Dim lngIndex As Long Dim lngArtikelID As Long Set db = CurrentDb If Not Me!lstKeinAuslaufartikel.ItemsSelected.Count = 0 Then lngIndex = Me!lstKeineAuslaufartikel.ItemsSelected(0) lngArtikelID = Me!lstKeineAuslaufartikel.ItemData(lngIndex) db.Execute "UPDATE tblArtikel SET Auslaufartikel = True WHERE ArtikelID = " & lngArtikelID, dbFailOnError Me!lstAuslaufartikel.Requery Me!lstKeineAuslaufartikel.Requery End If End Sub
Listing 1: Prozedur, die beim Doppelklick auf das Listenfeld lstKeineAuslaufartikel ausgelöst wird
In diesem Fall liest die Prozedur mit der Eigenschaft ItemsSelected den Index des angeklickten Eintrags in die Variable lngIndex ein. Mit diesem Wert holt sie mit der Eigenschaft ItemData den Wert der gebundenen Spalte des angeklickten Eintrags und schreibt diesen in die Variable lngArtikelID.
Damit können wir nun eine SQL-Anweisung zusammenstellen, die für den Eintrag der Tabelle tblArtikel, dessen Feld ArtikelID den Wert aus lngArtikelID aufweist, den Wert des Feldes Auslaufartikel auf False einstellt.
Danach braucht die Prozedur nur noch die beiden Listenfelder mit der Requery-Methode zu aktualisieren.
Die Prozedur für das rechte Listenfeld lstAuslaufartikel ist ähnlich aufgebaut wie die für das linke Listenfeld (siehe Listing 2). In diesem Fall ermittelt sie den zu bearbeitenden Datensatz allerdings aus dem Listenfeld lstAuslaufartikel und ändert den Wert des Feldes Auslaufartikel nicht in False, sondern in True.
Private Sub lstAuslaufartikel_DblClick(Cancel As Integer) Dim db As DAO.Database Dim lngIndex As Long Dim lngArtikelID As Long Set db = CurrentDb If Not Me!lstAuslaufartikel.ItemsSelected.Count = 0 Then lngIndex = Me!lstAuslaufartikel.ItemsSelected(0) lngArtikelID = Me!lstAuslaufartikel.ItemData(lngIndex) db.Execute "UPDATE tblArtikel SET Auslaufartikel = False WHERE ArtikelID = " & lngArtikelID, dbFailOnError Me!lstAuslaufartikel.Requery Me!lstKeineAuslaufartikel.Requery End If End Sub
Listing 2: Prozedur, die beim Doppelklick auf das Listenfeld lstAuslaufartikel ausgelöst wird
Auslaufartikel verwalten
Damit erhalten wir das Formular aus Bild 5. Wenn Sie auf einen der Einträge im linken Listenfeld klicken, wird dieses in das rechte Listenfeld verschoben und umgekehrt.
Bild 5: Einen Artikel zum Auslaufartikel machen
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