Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 2/2004.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Lookupdaten in der Praxis

André Minhorst, Duisburg

Lookupdaten sind solche Daten, die zur näheren Beschreibung von in Tabellen gespeicherten Objekten dienen. Gute Beispiele sind die Anrede oder das Geschlecht von Personen. Im vorliegenden Beitrag erfahren Sie, warum Lookupdaten verwendet werden, in welchen Formen das möglich ist und wie sie am einfachsten verwaltet werden können.

Grundlagen

Viele Daten haben Eigenschaften, für die es immer wieder die gleichen Werte gibt. Betrachten Sie das Beispiel aus der Einleitung: Eine Tabelle mit den Daten von Personen enthält in der Regel Informationen wie Vorname, Nachname, Anrede, Geschlecht, Adressdaten und so weiter.

Hinweis

Im Folgenden ist von Objekttabellen und Eigenschaftstabellen die Rede. Objekttabellen enthalten je Datensatz ein Objekt wie beispielsweise eine Person, eine Adresse, ein Produkt oder eine Rechnung. Eigenschaftstabellen enthalten lediglich Werte, die zur näheren Beschreibung der jeweiligen Objekte dienen. (

Während Vorname, Nachname und Adressdaten sich meist von Person zu Person unterscheiden, kann das Geschlecht beispielsweise nur zwei Werte annehmen und auch die Werte für die Anrede sind auf Herr, Frau und einige mit diversen Titeln verzierte Varianten beschränkt.

Sie können diese Informationen natürlich mit den anderen Informationen in einer einzigen Tabelle, der Objekttabelle, speichern. Das kann aber erstens zu Inkonsistenzen führen und zweitens ist das Ausklammern von oft wiederkehrenden Daten Platz sparend.

Inkonsistenzen treten vor allem dadurch auf, dass gleichbedeutende Einträge in unterschiedlicher Schreibweise vorkommen, was beispielsweise durch Schreibfehler oder durch die Verwendung von Abkürzungen passieren kann. Das führt zu Fehlern, wenn Abfragen auf diese Daten ausgeführt werden:

Wenn zum Beispiel die Schreibweisen Herr und Hr. als Anrede verwendet werden und eine Abfrage alle Personen mit der Anrede Herr ermitteln soll, fallen die abgekürzten Herren sprichwörtlich unter den Tisch und das Abfrageergebnis wird - bezogen auf die eigentliche Intention - verfälscht.

1:n-Lookupdaten

Wenn Sie diese Daten in eine weitere Tabelle, die Eigenschaftstabelle, ausklammern und nur die Einträge dieser Tabelle als mögliche Werte für die Eigenschaft Anrede verwenden, können keine solchen Inkonsistenzen auftreten (s. Abb. 1).

Abb. 1: Beispiel für Lookupdaten in einer 1:n-Beziehung

Beziehung für 1:n-Lookupdaten festlegen

Um die Beziehung zwischen Objekttabellen und Eigenschaftstabellen wie in Abb. 1 festzulegen, gehen Sie folgendermaßen vor:

  • Öffnen Sie die Objekttabelle in der Entwurfsansicht.
  • Markieren Sie das Feld, das mit der Eigenschaftstabelle verknüpft werden soll.
  • Wählen Sie für die Eigenschaft Steuerelement anzeigen den Wert Kombinationsfeld aus.
  • Wählen Sie unter Datensatzherkunft die gewünschte Eigenschaftstabelle aus.
  • Stellen Sie die Eigenschaften Spaltenanzahl und Spaltenbreiten auf die Werte 2 und 0 ein.
  • Stellen Sie die Eigenschaft Standardwert im Register Allgemein auf einen der in den zu verknüpfenden Tabellen enthaltenen Werte ein. (
  • Abb. 2: Festlegen der Verknüpfung zu einer Eigenschaftstabelle

    Hinweis

    Die Verwendung von Standardwerten bei verknüpften Tabellen, deren Beziehung referentielle Integrität voraussetzt, spart dem Benutzer in vielen Fällen die Zeit zum Auswählen der entsprechenden Werte und dem Entwickler die sonst anzulegende Fehlerbehandlung, falls der Benutzer gar keinen Wert auswählt. (

    Wenn die Eigenschaften mit denen aus Abb. 2 übereinstimmen, müssen Sie nur noch die Verknüpfung festlegen. Das erfolgt im Beziehungsfenster. Dieses öffnen Sie über den Menüeintrag Extras/Beziehungen. Zeigen Sie dort alle Tabellen an und ziehen Sie das Primärindexfeld von der Eigenschaftstabelle auf das Verknüpfungsfeld in der Objekttabelle. Legen Sie für die Beziehung referentielle Integrität fest.

    m:n-Lookupdaten

    Neben den Lookupdaten, die per 1:n-Beziehung verknüpft sind, gibt es auch solche, die eine m:n-Verknüpfung zwischen der Objekttabelle und der Eigenschaftstabelle erfordern.

    Wenn Sie die Personen in unterschiedliche Kategorien einteilen möchten, können Sie das natürlich auch per 1:n-Verknüpfung tun. Dann kann aber jede Person nur einer Kategorie zugeordnet werden. Was aber passiert, wenn eine Person mehreren Kategorien zugeordnet werden soll? Verwenden Sie in dem Fall einfach eine m:n-Beziehung wie in Abb. 3.

    Abb. 3: Lookupdaten per m:n-Beziehung

    Wenn Sie eine solche Verknüpfung verwenden, können Sie jeder Person mehrere Kategorien zuweisen. Damit jede Kategorie jeder Person nur einmal zugewiesen werden kann, erstellen Sie für die Verknüpfungstabelle tblPersonenKategorien einen aus den beiden Feldern der Tabelle bestehenden Primärschlüssel.

    Beziehung für m:n-Lookupdaten festlegen

    Das Anlegen einer Verknüpfung für eine m:n-Beziehung erfolgt im Prinzip genau wie für eine 1:n-Beziehung - nur zweimal. Dabei wird jedes der beiden Primärschlüsselfelder der Verknüpfungstabelle mit dem jeweiligen Primärschlüsselfeld der Objekt- und der Eigenschaftstabelle verknüpft.

    Aktivieren Sie außerdem für beide Beziehungen die Option Löschweitergabe. Das bewirkt, dass beim Löschen sowohl einer Person als auch einer Kategorie alle entsprechenden Einträge der Tabelle tblPersonenKategorien ebenfalls gelöscht werden.

    Anzeigen und Bearbeiten von
    Lookupdaten

    Die Anzeige von Lookupdaten kann im Fall einer 1:n-Beziehung leicht mit Hilfe eines Kombinationsfeldes erfolgen. Bei m:n-Beziehungen wird es komplizierter: Da nicht feststeht, wie viele Datensätze der Eigenschaftstabelle einem Datensatz der Objekttabelle zugeordnet sind, kann schlecht ausreichend Platz eingeräumt werden.

    Normalerweise würden Sie hier ein Unterformular in der Datenblatt- oder Endlosansicht verwenden, um solche Datensätze anzuzeigen. Da dies bei mehreren solcher Eigenschaften die Übersichtlichkeit des Hauptformulars verschlechtern könnte, lernen Sie in den folgenden Abschnitten eine alternative Methode kennen.

    Beispielformular

    Das nachfolgend verwendete Beispielformular hat die Tabelle tblPersonen als Datenherkunft. Ziehen Sie alle Felder aus der Feldliste in den Entwurf des Formulars. Wenn Sie die Verknüpfungen wie in Abschnitt 1.2 angelegt haben, werden die Felder AnredeID und GeschlechtID direkt als Kombinationsfeld angezeigt (s. Abb. 4).

    Abb. 4: Das Beispielformular mit zwei 1:n-Lookupfeldern

    1:n-Lookupdaten anzeigen und bearbeiten

    Die Anzeige von 1:n-Lookupdaten erfolgt eigentlich immer wie in Abb. 4. Alternativen sind kaum denkbar, zumal gegenüber einem herkömmlichen Textfeld lediglich die kleine Schaltfläche zum Ausklappen des Kombinationsfeldes hinzukommt und es damit für den eigentlichen Inhalt nur ein bisschen weniger Platz zur Verfügung stellt.

    Hinweis

    Selbstverständlich können Sie auch ein Listenfeld zur Auswahl von per 1:n-Beziehung verknüpften Daten verwenden. Da sich eine Lookup-Beziehung aber dadurch auszeichnet, dass die verknüpfte Tabelle neben dem Primärindexfeld nur den eigentlichen Eigenschaftswert als Feld hat, reicht ein Kombinationsfeld hier immer
    aus. (

    Kombinationsfelder zur Anzeige von Lookupdaten bieten den Vorteil, dass nicht nur bestehende Datensätze ausgewählt, sondern mit wenigen Handgriffen auch neue Lookupdaten eingegeben werden können.

    Eingabe neuer Lookupdaten per
    Kombinationsfeld

    Dazu stellen Sie lediglich die Ereigniseigenschaft Bei Nicht In Liste des Kombinationsfeldes auf den Wert [Ereignisprozedur] ein und bearbeiten selbige durch einen Mausklick auf die daneben erscheinende Schaltfläche mit den drei Punkten (...).

    Die Ereignisprozedur sollte nach der Bearbeitung wie in Quellcode 1 aussehen. Die Prozedur erhält mit dem Parameter NewData den nicht in der Datensatzherkunft vorhandenen Wert übergeben.

    Dieser wird der Tabelle tblAnreden über die Methode AddNew eines mit dieser Tabelle gefüllten Recordsets hinzugefügt. Die entsprechende Prozedur für das andere Lookupfeld, Geschlecht, können Sie analog anlegen.

    Private Sub AnredeID_NotInList(NewData As String, _
        Response As Integer)

        Response = acDataErrAdded

        Dim cnn As ADODB.Connection

        Dim rst As New ADODB.Recordset

        Set cnn = CurrentProject.Connection

        rst.Open "tblAnreden", cnn, adOpenDynamic, _
            adLockOptimistic

        rst.AddNew

        rst!Anrede = NewData

        rst.Update

        rst.Close

        cnn.Close

        Set rst = Nothing

        Set cnn = Nothing

    End Sub

    Quellcode 1

    Abb. 5: Beispielformular mit m:n-Lookupdatenfeld

    m:n-Lookupdaten anzeigen

    Die Anzeige von m:n-Lookupdaten kann auf mehrere Arten erfolgen. Für welche Methode man sich entscheidet, hängt vom Anwendungsfall und davon, wie die Anzeige in das bestehende Formular integriert werden kann, ab.

    Bekannte und in Access im Unternehmen mehrfach vorgestellte Methoden sind die per Unterformular und jene mit zwei Listenfeldern, zwischen denen die verknüpften Datensätze und die nicht verknüpften Datensätze hin- und hergeschoben werden können.

    In diesem Beitrag soll eine alternative Möglichkeit vorgestellt werden, die auch in der im Beitrag Karteikasten mit Access in Ausgabe 1/2004 vorgestellten Verwaltung von juristischen Leitsätzen verwendet wird.

    Bei dieser Methode werden die verknüpften Daten Platz sparend nebeneinander in einem Textfeld angezeigt. Für die Auswahl der verknüpften Daten ist ein separates Formular vorgesehen, das über eine kleine Schaltfläche rechts von dem Textfeld geöffnet werden kann. Abb. 5 zeigt, wie das bereits beschriebene Beispielformular mit diesen Steuerelementen aussieht. Dabei sollen in dem Textfeld die mit der jeweiligen Person verknüpften Kategorien angezeigt werden.

    Das Feld zur Anzeige der eigentlichen Daten ist ungebunden. Es soll lediglich der Anzeige der Daten dienen. Die Bearbeitung der Daten erfolgt über ein zusätzliches Formular, dass über die rechts von dem Feld befindliche Schaltfläche geöffnet werden kann.

    Formular zur Bearbeitung von
    m:n-Lookupdaten

    Bevor die Lookupdaten des per m:n-Beziehung verknüpften Eigenschaftsfeldes angezeigt werden können, müssen sie zunächst einmal eingegeben werden. Das dazu benötigte Formular besteht aus einem Unterformular zur Anzeige der verknüpften Kategorien sowie aus zwei Schaltflächen zum Entfernen einer Kategorie durch den aktuellen Benutzer sowie zum Schließen des Formulars. Legen Sie zunächst das Unterformular namens sfmLookupKategorien an. Als Datenherkunft des Formulars dient die Verknüpfungstabelle tblPersonenKategorien. Ziehen Sie das Feld KategorieID aus der resultierenden Feldliste in den Abfrageentwurf, entfernen Sie das Beschriftungsfeld und positionieren Sie es links oben (s. Abb. 6).

    Abb. 6: Entwurfsansicht des Unterformulars frmLookupKategorien

    Abb. 7: Entwurfsansicht des Lookupformulars

    Stellen Sie die Eigenschaft Standardansicht auf Endlosformular ein. Damit das Kombinationsfeld nicht die in dem Feld KategorieID enthaltene Zahl, sondern die damit verbundene Kategorie anzeigt, müssen Sie das Feld in ein Kombinationsfeld umwandeln und einige Eigenschaften anpassen:

  • Markieren Sie das Textfeld und öffnen Sie mit der rechten Maustaste das Kontextmenü. Wählen Sie dort den Eintrag Ändern zu/Kombinationsfeld aus.
  • Stellen Sie die Eigenschaft Datensatzherkunft des Kombinationsfeldes auf den Wert tblKategorien ein.
  • Stellen Sie die beiden Eigenschaften Spaltenanzahl und Spaltenbreite auf die Werte 2 beziehungsweise 0 ein. Der Wert 0 für die Spaltenbreite bewirkt, dass die erste Spalte der Datensatzherkunft, KategorieID, nicht angezeigt wird. (
  • Da wie bei den 1:n-Lookupdaten auch hier neue Daten eingegeben werden können, legen Sie die dort verwendete Prozedur, die durch die Ereigniseigenschaft Bei Nicht in Liste ausgelöst wird, auch für dieses Kombinationsfeld an. Natürlich müssen Sie den Tabellen- und den Feldnamen auf tblKategorien beziehungsweise Kategorie anpassen.

    Damit sind die Arbeiten an dem Unterformular abgeschlossen. Legen Sie nun ein neues Formular an. Weisen Sie ihm die Tabelle tblPersonen als Datenherkunft zu. Ziehen Sie das Unterformular sfmLookupKategorien vom Datenbankfenster in den Formularentwurf des Formulars frmLookupKategorien. Unter normalen Umständen erkennt das Unterformular automatisch, dass es jeweils die zur im Hauptformular angezeigten Person gehörenden Kategorien anzeigen soll und drückt dies durch entsprechende Einträge in den beiden Feldern Verknüpfen von und Verknüpfen nach aus (s. Abb. 7).

    Private Sub cmdLoeschen_Click()

        Dim cnn As Connection

        Set cnn = CurrentProject.Connection

        If Not IsNull(Me.sfmLookupKategorien) Then

            cnn.Execute "DELETE FROM tblPersonenKategorien WHERE PersonID = " _
                & Me.PersonID & " AND KategorieID = " _
                & Me.sfmLookupKategorien.Form.KategorieID

            Me.sfmLookupKategorien.Form.Requery

        Else

            MsgBox "Kein Datensatz ausgewählt."

        End If

    End Sub

    Quellcode 2

    Private Sub cmdOK_Click()

        DoCmd.Close acForm, Me.Name

    End Sub

    Quellcode 3

    Private Sub cmdLookupKategorien_Click()

        DoCmd.RunCommand accmdSaveRecord

        DoCmd.OpenForm "frmLookupKategorien", WindowMode:=acDialog, _
            WhereCondition:="PersonID = " & Me.PersonID

    End Sub

    Quellcode 4

    Abb. 8: Formular zur Zuordnung von Kategorien zu Personen

    Fügen Sie dem Hauptformular nun noch einen entsprechenden Hinweistext hinzu und legen Sie zwei Schaltflächen zum Löschen von Datensätzen und Schließen des Formulars an. Die beiden Schaltflächen erhalten die Bezeichnungen cmdOK und cmdLoeschen und die Prozeduren aus Quellcode 2 und Quellcode 3 für die jeweiligen Ereigniseigenschaften Beim Klicken. Nach einigen kosmetischen Eingriffen könnte das Formular beispielsweise wie in Abb. 8 aussehen.

    Sie können in dem Formular frmLookupKategorien nun bestehende Kategorien auswählen, neue Kategorien eingeben und direkt in die Auswahl übernehmen und ausgewählte Kategorien wieder entfernen.

    Aufruf des Lookupformulars vom
    Hauptformular

    Das Formular frmLookupKategorien soll zur Auswahl von Kategorien für einen bestimmten Eintrag der Tabelle tblPersonen dienen. Es enthält allerdings keinerlei Informationen über die jeweilige Person, sodass der Benutzer im Dunkeln tappt, wessen Daten er gerade bearbeitet.

    Das ist aber nur der Fall, wenn das Formular einzeln aufgerufen wird. Geplant ist aber der Aufruf dieses Formulars vom Hauptformular frmPersonen aus.

    Private Sub MetadatenAktualisieren()

        Dim cnn As ADODB.Connection

        Dim rstKategorien As New ADODB.Recordset

        Dim strKategorien As String

        If Not IsNull(Me.PersonID) Then

            Set cnn = CurrentProject.Connection

            With rstKategorien

                .Source = "SELECT Kategorie FROM tblKategorien INNER JOIN " _
                    & "tblPersonenKategorien ON tblKategorien.KategorieID = " _
                    & "tblPersonenKategorien.KategorieID WHERE " _
                    & "tblPersonenKategorien.PersonID = " & Me.PersonID _
                    & " ORDER BY Kategorie"

                .ActiveConnection = cnn

                .CursorType = adOpenForwardOnly

                .LockType = adLockOptimistic

                .Open

                Do While Not .EOF

                strKategorien = strKategorien & !Kategorie & "; "

                .MoveNext

            Loop

            End With

            If Len(strKategorien) > 0 Then

                strKategorien = Mid(strKategorien, 1, Len(strKategorien) - 2)

                Me.txtKategorien = strKategorien

            Else

                Me.txtKategorien = ""

            End If

        Else

            Me.txtKategorien = ""

        End If

    End Sub

    Quellcode 5

    Dort wird das Formular frmLookupKontakte per Mausklick auf die Schaltfläche cmdLookupKontakte geöffnet. Mit dem Parameter WhereCondition wird der Wert PersonID für die aktuell im Formular frmPersonen angezeigte Person übergeben.

    Dafür sorgt die Prozedur aus Quellcode 4, die Sie für die Ereigniseigenschaft Beim Klicken der Schaltfläche cmdLookupKategorien hinterlegen. Der aktuelle Datensatz wird vorsichtshalber gespeichert, da bei einem neuen Datensatz sonst zwar schon ein Eintrag für das Primärschlüsselfeld angezeigt würde, der Datensatz aber noch nicht in der Tabelle gespeichert wäre und es damit beim Hinzufügen verknüpfter Datensätze zu Fehlern käme.

    In der Folge würde im Formular frmLookupKategorien ein Fehler auftreten, wenn ein neuer Datensatz in der Tabelle tblPersonenKategorien angelegt wird, ohne dass die betreffende Person in der Tabelle tblPersonen gespeichert ist.

    Anzeigen der Lookupdaten im Hauptformular

    Im derzeitigen Stand können Sie zwar die Kategorien der einzelnen Personen verwalten, aber diese werden noch nicht im Hauptformular angezeigt. Damit sich das ändert, legen Sie die Prozedur aus Quellcode 5 an. Die Prozedur erzeugt eine Datensatzgruppe namens rstKategorien, die aus den beiden verknüpften Tabellen tblPersonenKategorien und tblKategorien besteht und nach dem Feld PersonID der aktuell im Formular angezeigten Person gefiltert ist.

    Abb. 9: Anzeige von per m:n-Beziehung verknüpften Lookupdaten

    Innerhalb einer Do While-Schleife werden alle Datensätze der Datensatzgruppe durchlaufen und die jeweiligen Einträge des Feldes Kategorie durch Semikola getrennt aneinandergefügt. Nach dem Durchlaufen aller Datensätze wird das letzte, überflüssige Semikolon abgetrennt - vorausgesetzt die Zeichenkette strKategorien ist keine leere Zeichenkette. Das Ergebnis sieht wie in Abb. 9 aus. Sinnvollerweise sollten Sie das Textfeld zur Anzeige der Kategorien für Benutzereingaben sperren, da dort direkt vorgenommene Änderungen nicht gespeichert würden.

    Verwalten von
    m:n-Lookupdaten

    Für 1:n- wie auch für m:n-Lookupdaten gilt, dass sich mit der Zeit vermutlich einige Datensätze ansammeln und die Auswahl in den jeweiligen Kombinationsfeldern unübersichtlich wird. Hinzu kommt, dass auch hier durchaus mehrere Schreibweisen für den gleichen Begriff verwendet werden könnten. Ganz unangenehm sind Karteileichen - für die Verknüpfung vorgehaltene Eigenschaften, die aktuell mit keinem Datensatz verknüpft sind und möglicherweise auch nie mehr benötigt werden.

    Wie schnell ist bei einer 1:n-Lookupbeziehung mal eben ein Eintrag falsch geschrieben, und treibt fortan sein Unwesen in den entsprechenden Kombinationsfeldern. Um die zur Verfügung stehenden Einträge zu verwalten, verwenden Sie ein spezielles Formular mit verschiedenen Funktionen.

    Funktionen des Formulars zur
    Verwaltung von m:n-Lookupdaten

    Die Verwaltung von m:n-Lookupdaten soll drei Funktionen bieten:

  • Anlegen neuer Kategorien
  • Löschen unbenutzter Kategorien
  • Überführen doppelter Kategorien ineinander
  • Das fertige Formular zur Erfüllung dieser Aufgabe sieht wie in Abb. 10 aus.

    Erstellen des
    Formulars zur
    Verwaltung von
    m:n-Lookupdaten

    Zum Erstellen des benötigten Formulars gehen Sie folgendermaßen vor: Legen Sie ein neues Formular an. Stellen Sie die Eigenschaften Bildlaufleisten, Datensatzmarkierer, Navigationsschaltflächen und Trennlinien auf den Wert Nein.

    Speichern Sie das Formular dann unter dem Namen frmKategorienVerwalten.

    Private Sub ogrAnzuzeigendeDatensaetze_AfterUpdate()

        Select Case Me.ogrAnzuzeigendeDatensaetze

            Case 1

                Me!lstKategorien.RowSource = "tblKategorien"

                Me.cmdLoeschen.Enabled = False

            Case 2

                Me!lstKategorien.RowSource = "SELECT DISTINCT " _
                    & "tblPersonenKategorien.KategorieID, tblKategorien.Kategorie " _
                    & "FROM tblPersonenKategorien INNER JOIN tblKategorien ON " _
                    & "tblPersonenKategorien.KategorieID = tblKategorien.KategorieID"

                Me.cmdLoeschen.Enabled = False

            Case 3

                Me!lstKategorien.RowSource = "SELECT * FROM tblKategorien WHERE " _
                    & "KategorieID NOT IN (SELECT tblPersonenKategorien.KategorieID " _
                    & "FROM tblPersonenKategorien INNER JOIN tblKategorien ON " _
                    & "tblPersonenKategorien.KategorieID = tblKategorien.KategorieID)"
                Me.cmdLoeschen.Enabled = True

        End Select

        Me.lstKategorien = Me.lstKategorien.ItemData(0)

        Me!cboKategorien.Requery

        If Me.cboKategorien = Me.lstKategorien Then

            Me.cboKategorien = Me.cboKategorien.ItemData(0)

        End If

    End Sub

    Quellcode 6

    Abb. 10: Formular zur Verwaltung von Lookupdaten

    Nun können Sie mit dem Anlegen der benötigten Steuerelemente beginnen.

    Anzeige der m:n-Lookupdaten

    Beginnen Sie mit dem Listenfeld zur Anzeige aller benötigten Einträge. Das Listenfeld erhält als Datensatzherkunft die Tabelle tblKategorien und soll aus dieser Tabelle lediglich das Feld Kategorie anzeigen. Damit das erste Feld der Datensatzherkunft, das Feld KategorieID, nicht angezeigt wird, stellen Sie die beiden Eigenschaften Spaltenanzahl und Spaltenbreite auf die Werte 2 und 0 ein. Die Eigenschaft Name erhält den Wert lstKategorien.

    Die Datensatzherkunft des Listenfeldes soll neben der Menge aller Datensätze der Tabelle tblKategorien auch nur diejenigen anzeigen, die bereits mit einem Datensatz aus der Tabelle tblPersonen verknüpft sind, und solche, die mit gar keinem Datensatz verknüpft sind.

    Filtern der Lookupdatensätze

    Dazu legen Sie zunächst eine Optionsgruppe mit drei Optionen an, über die der Benutzer die gewünschte Filterung auswählen kann. Die Optionen erhalten Beschriftungen wie in Abb. 11 und von oben nach unten die Optionswerte 1 bis 3.

    Für die Ereigniseigenschaft Nach Aktualisierung der Optionsgruppe legen Sie die Prozedur aus Quellcode 6 an.

    Die Prozedur aktualisiert die Datensatzherkunft des Listenfeldes je nach der ausgewählten Option. Außerdem aktiviert es die Schaltfläche cmdLoeschen nur, wenn die nicht verknüpften Einträge der Tabelle tblKategorien angezeigt werden.

    Abb. 11: Das Formular frmKategorienVerwalten in der Entwurfsansicht

    Überführen von m:n-Lookupdaten

    Schließlich fügen Sie dem Formular einen Bereich hinzu, der ein Kombinationsfeld sowie eine Schaltfläche mit den Namen cboKategorien beziehungsweise cmdUeberfuehren enthält.

    Diese Funktion soll dazu dienen, Kategorien gleicher Bedeutung, aber mit unterschiedlichen Bezeichnungen zu vereinheitlichen. Wenn es beispielsweise zwei Kategorien namens Partner und Geschäftspartner gibt, soll die Kategorie Partner gelöscht werden und alle Zuordnungen in der Tabelle tblPersonenKategorien, die auf die Kategorie Partner verweisen, auf den Eintrag Geschäftspartner umgelenkt werden.

    Der Eintrag Partner soll anschließend direkt aus der Tabelle tblKategorien entfernt werden.

    Damit dies funktioniert, müssen Sie die Steuerelemente folgendermaßen anpassen und mit Prozeduren versehen:

    Das Kombinationsfeld soll immer alle Beiträge anzeigen außer dem, der gerade im Listenfeld aktiviert ist. Dazu geben Sie als Datensatzherkunft die SQL-Anweisung aus Quellcode 7 an.

    Damit die Datensatzherkunft bei Änderungen des Inhalts des Listenfeldes immer direkt angepasst wird, legen Sie für die Ereigniseigenschaft Nach Aktualisierung des Listenfeldes die Prozedur aus Quellcode 8 an.

    Im unteren Teil der Prozedur aus Quellcode 6, die bei Auswahl einer neuen Untermenge der vorhandenen Kategorien ausgelöst wird, befinden sich einige Zeilen, die das Kombinationsfeld aktualisieren und überprüfen, ob durch die Änderung des Inhalts des Listenfeldes beide Steuerelemente, also sowohl Listen- als auch Kombinationsfeld, den gleichen Datensatz anzeigen. In dem Fall wird das Kombinationsfeld automatisch wieder auf den Wert <auswählen> eingestellt.

    Das Überführen von Kategorien in andere Kategorien

    Bleibt noch die Schaltfläche, mit der das Überführen der ausgewählten Kategorie in die gewünschte Zielkategorie durchgeführt wird. Die beim Klicken auf die Schaltfläche ausgelöste Prozedur finden Sie in Quellcode 9.

    SELECT 0 AS KategorieID, '<auswählen>' AS Kategorie FROM
    tblKategorien UNION SELECT tblKategorien.KategorieID, 
    tblKategorien.Kategorie FROM tblKategorien WHERE 
    (((tblKategorien.KategorieID)<>
    [Forms]![frmKategorienVerwalten]![lstKategorien]));

    Quellcode 7

    Private Sub lstKategorien_AfterUpdate()

        Me!cboKategorien.Requery

        If Me.lstKategorien = Me.cboKategorien Then

            Me.cboKategorien = Me.cboKategorien.ItemData(0)

        End If

    End Sub

    Quellcode 8

    Private Sub cmdUeberfuehren_Click()

        Dim cnn As ADODB.Connection

        Set cnn = CurrentProject.Connection

        If Me.cboKategorien = 0 Or Me.lstKategorien = 0 Then

            MsgBox "Bitte wählen Sie die zu überführende " _
                & "und die Zielkategorie aus."

            Exit Sub

        Else

            On Error Resume Next

            cnn.Execute "UPDATE tblPersonenKategorien " _
                & "SET KategorieID = " & Me!cboKategorien _
                & " WHERE KategorieID = " & Me!lstKategorien

            If Err.Number > 0 Then

                cnn.Execute "DELETE FROM " _
                    & "tblPersonenKategorien WHERE " _
                     "KategorieID = " & Me.lstKategorien

            End If

            cnn.Execute "DELETE FROM tblKategorien " _
                & "WHERE KategorieID = " & Me!lstKategorien

        End If

        Me!lstKategorien.Requery

        Me!lstKategorien = Me!lstKategorien.ItemData(0)

        Me!cboKategorien.Requery

    End Sub

    Quellcode 9

    Private Sub cmdOK_Click()

        If IstFormularGeoeffnet("frmLookupdaten") Then

            Forms!frmLookupdaten.Requery

        End If

        DoCmd.Close acForm, Me.Name

    End Sub

    Quellcode 10

    Die Prozedur überprüft zunächst, ob beide Steuerelemente einen Wert ungleich 0 enthalten, ob also je eine Kategorie ausgewählt ist.

    Falls ja, werden zwei Aktualisierungsabfragen durchgeführt.

    Die erste ändert alle Datensätze der Tabelle tblPersonenKategorien mit der zu überführenden Kategorie auf die Zielkategorie ab.

    Dabei kann es vorkommen, dass eine Person bereits der Zielkategorie zugeordnet ist. In dem Fall wird nur die Zuordnung der betroffenen Person zu der zu überführenden Kategorie geändert.

    Die zweite Aktualisierungsabfrage löscht die zu überführende Kategorie, da diese nun nicht mehr benötigt wird. Anschließend werden noch die beiden Listen aktualisiert.

    Notwendige
    Aktualisierung des Hauptformulars

    Da sich durch Überführungen unter Umständen der in dem Hauptformular anzuzeigende Inhalt ändert, muss überprüft werden, ob das Hauptformular geöffnet ist und der Inhalt des Textfeldes txtKategorien gegebenenfalls angepasst werden muss.

    Dazu verwenden Sie die Prozedur aus Quellcode 10, die durch das Ereignis Beim Klicken der Schaltfläche aufgerufen wird.

    Kompletten Artikel lesen?

    Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

    E-Mail:

    Download

    Download

    Die .zip-Datei enthält folgende Dateien:

    Lookupdaten97.mdb

    Lookupdaten00.mdb

    Beispieldateien downloaden

    © 2003-2015 André Minhorst Alle Rechte vorbehalten.