Unter Lookup-Daten verstehen wir beispielsweise die Kategorien, denen ein Artikel zugeordnet werden kann, oder auch Anreden – also Daten, die zur Vermeidung von Redundanzen in eine eigene Tabelle ausgelagert und anschließend wieder verknüpft wurden. Nun enthalten solche Tabellen, gerade wenn sie von anderswo importiert oder unsauber gepflegt wurden, nicht immer saubere Daten. Dieser Beitrag zeigt, wie Sie Lookup-Datensätze, die inhaltlich redundant sind, zusammenführen und dabei auch die damit verknüpften Daten berücksichtigen. Die Lösung kann aber auch genutzt werden, um beliebige Lookup-Datensätze zusammenzuführen.
Es gibt mindestens zwei Gründe, die dazu führen, dass man seine Lookup-Tabellen aufräumen möchte:
- Die in der Lookup-Tabelle enthaltenen Daten sind redundant. Das kann entweder gleich beim Importieren der Daten aus einer bestehenden Datenquelle wie einer Exceltabelle oder auch einer anderen Datenbank geschehen oder auch zur Laufzeit. Gerade wenn Benutzer selbst Datensätze in Lookup-Tabellen anlegen und diesen die Datensätze der Detailtabelle zuweisen können, entsteht eine Reihe von Kategorien, die vermutlich besser zusammengefasst werden könnten.
- Ein weiterer Grund für das Zusammenführen von Lookup-Datensätzen ist, dass einfach eine Umstrukturierung der dort enthaltenen Daten nötig ist. Vielleicht möchte man beispielsweise seine Artikel nicht mehr nach allzu vielen Kategorien aufteilen. Dann überführt man entweder ein oder mehrere Datensätze der Lookup-Tabelle in einen anderen bestehenden Datensatz dieser Tabelle und passt dabei auch gleich die Inhalte der Fremdschlüsselfelder der verknüpften Tabelle an.
Ein Beispiel für eine Lookup-Tabelle ist eine Tabelle mit Kategorien etwa namens tblKategorien, die als Lookup-Tabelle für eine Detailtabelle namens tblArtikel dient. über ein Fremdschlüsselfeld wählt man für jeden Artikel eine Kategorie aus der Tabelle tblKategorien aus und teilt die Artikel so in Kategorien ein.
Wenn dort nun beispielsweise einige Artikel vorliegen, die aktuell einer Kategorie Alkohol. Getränke zugewiesen sind, kann es sein, dass der Benutzer die Kategorie nicht mehr benötigt und die enthaltenen Datensätze lieber der Kategorie Getränke zuweisen möchte. In diesem Fall sind gleich einige Schritte nötig (siehe auch Bild 1):
Bild 1: Lookup-Tabellen anpassen in zwei Schritten
- Zuerst muss man für alle Datensätze der Tabelle tblArtikel den Wert des Fremdschlüsselfeldes KategorieID auf die neue Zielkategorie einstellen, hier also Getränke.
- Erst dann löscht man die Kategorie Alkohol. Getränke, sofern diese definitiv nicht mehr benötigt wird.
Der zweite dieser beiden Schritte sollte durch die entsprechende Definition der Beziehung zwischen den beiden Tabellen abgesichert werden. In diesem Fall definieren Sie die Beziehung mit referenzieller Integrität (s. Bild 2). Dadurch ist sichergestellt, dass der Benutzer nicht versehentlich eine Kategorie löscht, die noch mit einem der Artikel-Datensätze verknüpft ist.
Bild 2: Verknüpfung zwischen Detailtabelle und Lookup-Tabelle
Wenn Sie bei dieser Konstellation versuchen, einen Datensatz aus einer Lookup-Tabelle wie tblKategorien zu löschen, während noch ein Datensatz der Tabelle tblArtikel über das Fremdschlüsselfeld KategorieID auf diesen Datensatz verweist, erscheint eine entsprechende Meldung (s. Bild 3).
Bild 3: Meldung beim Versuch, einen verknüpften Datensatz aus einer Lookup-Tabelle zu löschen
Sie sollten in den Beziehungseigenschaften für die Beziehung zwischen den beiden Tabellen tblArtikel und tblKategorien auf keinen Fall die Option Löschweitergabe an verwandte Datensätze aktivieren. Wenn Sie bei dieser Einstellung einen der Datensätze der Tabelle tblKategorien löschen, werden auch automatisch alle Datensätze der Tabelle tblArtikel gelöscht, die mit diesem Datensatz verknüpft sind – zumindest wenn dies nicht noch durch andere mit referenzieller Integrität definierte Beziehungen verhindert wird. Die nachfolgend vorgestellte Lösung soll jedoch ohnehin nur solche Lookup-Daten löschen, die keinem Datensatz einer Detailtabelle mehr zugeordnet sind.
Lookup-Daten zusammenführen per Mausklick
Das Formular aus Bild 4 enthält alle Steuerelemente, um das Zusammenführen zweier oder mehrerer Lookup-Datensätze mit wenigen Mausklicks durchzuführen.
Bild 4: Formular zum Zusammenführen von Lookup-Werten samt Anpassung verknüpfter Datensätze
Dazu wählen Sie zunächst mit dem oberen Kombinationsfeld die Lookup- oder Mastertabelle aus – in diesem Fall die Tabelle tblKategorien. Dies füllt automatisch die beiden folgenden Kombinationsfelder mit den Namen der Felder dieser Tabelle. Damit wählen Sie dann erst das Primärschlüsselfeld dieser Tabelle aus und dann das Lookup-Feld, also das Feld, dessen Daten etwa in Nachschlagefeldern angezeigt werden.
Die beiden darunter befindlichen Listenfelder liefern dann alle Datensätze der ausgewählten Lookup-Tabelle – und beide Listenfelder zeigen genau die gleichen Daten an.
Das ändert sich allerdings, wenn Sie ein oder mehrere Einträge des linken Listenfeldes auswählen. Dann verschwinden die dort markierten Einträge nämlich aus dem rechten Listenfeld. Der Grund ist einfach: Wir wollen ja kein Lookup-Feld in sich selbst übertragen.
Auf der rechten Seite markieren Sie dann die Kategorie, in welche die auf der linken Seite markierten Kategorien überführt werden sollen.
Nun kommen wir zu den Daten der Detailtabelle: Das erste Kombinationsfeld mit der Beschriftung Detailtabelle ermöglicht die Auswahl der Tabelle, die mit der Lookup-Tabelle verknüpft ist und deren Daten im Fremdschlüsselfeld an die neue Kategorie angepasst werden sollen. Um die Verknüpfung genauer zu spezifizieren, wählen Sie mit dem folgenden Kombinationsfeld mit der Beschriftung Anzeigefeld ein Feld aus, das den jeweiligen Datensatz beschreibt – hier also etwa Artikelname. Diese Auswahl hat nur informativen Charakter, damit Sie in den unteren beiden Listenfeldern erkennen können, welche Datensätze der ausgewählten Tabelle mit den aktuell zum Zusammenführen markierten Kategorien verknüpft sind. Das dritte Kombinationsfeld mit der Beschriftung Fremdschlüsselfeld wird auch tatsächlich zum überführen der Daten der Detailtabelle zum neuen Datensatz der Lookup-Tabelle benötigt. Damit geben Sie nämlich den Namen des Fremdschlüsselfeldes an, über das die Tabelle mit der Lookup-Tabelle verknüpft ist. Die unteren beiden Listenfelder zeigen nun die Datensätze der Detailtabelle, die mit den Datensätzen der Lookup-Tabellen aus den darüber ausgewählten Listenfeldern verknüpft sind.
Nach der Auswahl aller notwendigen Informationen klicken Sie einfach auf die Schaltfläche unten, deren Beschriftung dynamisch an die Einstellungen angepasst wird. Diese Schaltfläche sorgt für folgende Schritte:
- Einstellen der Fremdschlüsselwerte der Datensätze, die mit den im linken Kombinationsfeld ausgewählten Lookup-Datensätzen verknüpft sind, auf den im rechten Listenfeld ausgewählten Lookup-Datensatz.
- Löschen der Einträge der Lookup-Tabelle, die im rechten Listenfeld markiert sind.
Formular erstellen
Schauen wir uns nun an, wie das Formular erstellt wird und wie die enthaltenen Techniken funktionieren.
Alle Tabellen im Kombinationsfeld anzeigen
Für dieses Formular sind keine Einstellungen erforderlich, die etwa beim Laden durch eine Ereignisprozedur vorgenommen werden müssen. Die einzige Vorbereitung ist, dass Sie die Datensatzherkunft des Kombinationsfeldes cboMastertabelle auf eine entsprechende Abfrage einstellen müssen (s. Bild 5).
Bild 5: Ausstatten des Kombinationsfeldes mit einer Datensatzherkunft
Diese sehen Sie in Bild 6. Diese Abfrage verwendet die Systemtabelle MSysObjects als Datenherkunft und soll nur die Daten des Feldes Name zurückliefern. Das Feld Type dient lediglich zur Auswahl der richtigen Objekte aus dieser Tabelle. Die Typen 1, 4 und 6 liefern alle Tabellenarten von Access, daher verwenden wir als Kriterium den Ausdruck IN (1, 4, 6).
Bild 6: Datensatzherkunft für das Kombinationsfeld cboMastertabelle
Lookup-Tabelle auswählen
Wenn der Benutzer einen der Einträge des Kombinationsfeldes cboMastertabelle auswählt, löst dies das Ereignis Nach Aktualisierung aus. Die dafür hinterlegte Ereignisprozedur finden Sie in Listing 1.
Private Sub cboMastertabelle_AfterUpdate() With Me!cboPrimaerschluesselfeld .RowSourceType = "Field List" .RowSource = Me!cboMastertabelle End With With Me!cboLookupfeld .RowSourceType = "Field List" .RowSource = Me!cboMastertabelle End With LookuplisteFuellen LookuplisteErsetzenFuellen End Sub
Listing 1: Füllen der Steuerelemente nach der Auswahl der Mastertabelle
Die Prozedur stellt zunächst zwei Eigenschaften des Kombinationsfeldes zur Auswahl des Primärschlüsselfeldes der zuvor bestimmten Tabelle namens cbo-Pri-maerschluesselfeld ein. Die erste heißt RowSourceType und legt mit dem Wert Field List fest, dass die Felder einer mit der zweiten Eigenschaft RowSource festgelegten Tabelle als Werte des Kombinationsfeldes angezeigt werden sollen. Diese Eigenschaft stellt die Prozedur logischerweise auf den Namen der soeben ausgewählten Tabelle ein. Damit zeigt das erste Kombinationsfeld schon einmal die Felder der ausgewählten Tabelle an (s. Bild 7).
Bild 7: Anzeige der Felder der oben ausgewählten Tabelle per Kombinationsfeld
Die folgenden Anweisungen führen die gleichen Schritte für das zweite Kombinationsfeld cboLookupfeld durch. Dieses Kombinationsfeld soll das Feld aufnehmen, dessen Werte die Lookup-Tabelle ausmachen. Schließlich folgt noch der Aufruf zwei weiterer Prozeduren, nämlich LookuplisteFuellen und LookuplisteErsetzenFuellen. Der Aufruf erfolgt in diesem Fall nur, damit die beiden Listenfelder lstLookupwerte und lstLookupwerteErsetzen geleert werden, wenn der Benutzer eine neue Tabelle auswählt – wir schauen uns die beiden Prozeduren weiter unten in Detail an.
Primärschlüsselfeld und Lookup-Feld auswählen
Die beiden folgenden Kombinationsfelder cboPrimaer-schlues-sel-feld und cboLoo-kup-feld sind nun mit den Feldern der im oberen Kombinationsfeld ausgewählten Tabelle gefüllt. Damit können Sie nun festlegen, welches der Felder die Aufgabe des Primärschlüsselfeldes und welches die des Lookupfeldes mit dem angezeigten Feld übernimmt. Die Auswahl dieses Feldes löst die Prozedur aus Listing 2 aus. Auch diese aktualisiert über die beiden Prozeduren LookuplisteFuellen und LookuplisteErsetzenFuellen die beiden darunter befindlichen Listenfelder.
Private Sub cboPrimaerschluesselfeld_AfterUpdate() LookuplisteFuellen LookuplisteErsetzenFuellen End Sub
Listing 2: Aktualisieren der Listenfelder durch cboPrimaerschluesselfeld
Das Kombinationsfeld cboLookupfeld löst nach der Aktualisierung ebenfalls eine Ereignisprozedur aus, welche die gleichen Anweisungen enthält wie die von cboPrimaerschluesselfeld ausgelöste (s. Listing 3).
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