{"id":55000946,"date":"2014-08-01T00:00:00","date_gmt":"2020-05-22T21:12:05","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=946"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"LookupDaten_Aus_zwei_mach_eins","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/LookupDaten_Aus_zwei_mach_eins\/","title":{"rendered":"Lookup-Daten: Aus zwei mach eins"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/8530dc6123804bf09c914bfb71063666\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Unter Lookup-Daten verstehen wir beispielsweise die Kategorien, denen ein Artikel zugeordnet werden kann, oder auch Anreden &#8211; also Daten, die zur Vermeidung von Redundanzen in eine eigene Tabelle ausgelagert und anschlie&szlig;end wieder verkn&uuml;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&auml;tze, die inhaltlich redundant sind, zusammenf&uuml;hren und dabei auch die damit verkn&uuml;pften Daten ber&uuml;cksichtigen. Die L&ouml;sung kann aber auch genutzt werden, um beliebige Lookup-Datens&auml;tze zusammenzuf&uuml;hren.<\/b><\/p>\n<p>Es gibt mindestens zwei Gr&uuml;nde, die dazu f&uuml;hren, dass man seine Lookup-Tabellen aufr&auml;umen m&ouml;chte:<\/p>\n<ul>\n<li>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&auml;tze in Lookup-Tabellen anlegen und diesen die Datens&auml;tze der Detailtabelle zuweisen k&ouml;nnen, entsteht eine Reihe von Kategorien, die vermutlich besser zusammengefasst werden k&ouml;nnten.<\/li>\n<li>Ein weiterer Grund f&uuml;r das Zusammenf&uuml;hren von Lookup-Datens&auml;tzen ist, dass einfach eine Umstrukturierung der dort enthaltenen Daten n&ouml;tig ist. Vielleicht m&ouml;chte man beispielsweise seine Artikel nicht mehr nach allzu vielen Kategorien aufteilen. Dann &uuml;berf&uuml;hrt man entweder ein oder mehrere Datens&auml;tze der Lookup-Tabelle in einen anderen bestehenden Datensatz dieser Tabelle und passt dabei auch gleich die Inhalte der Fremdschl&uuml;sselfelder der verkn&uuml;pften Tabelle an.<\/li>\n<\/ul>\n<p>Ein Beispiel f&uuml;r eine Lookup-Tabelle ist eine Tabelle mit Kategorien etwa namens <b>tblKategorien<\/b>, die als Lookup-Tabelle f&uuml;r eine Detailtabelle namens <b>tblArtikel <\/b>dient. &uuml;ber ein Fremdschl&uuml;sselfeld w&auml;hlt man f&uuml;r jeden Artikel eine Kategorie aus der Tabelle <b>tblKategorien <\/b>aus und teilt die Artikel so in Kategorien ein.<\/p>\n<p>Wenn dort nun beispielsweise einige Artikel vorliegen, die aktuell einer Kategorie <b>Alkohol. Getr&auml;nke <\/b>zugewiesen sind, kann es sein, dass der Benutzer die Kategorie nicht mehr ben&ouml;tigt und die enthaltenen Datens&auml;tze lieber der Kategorie <b>Getr&auml;nke <\/b>zuweisen m&ouml;chte. In diesem Fall sind gleich einige Schritte n&ouml;tig (siehe auch Bild 1):<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_946_001.png\" alt=\"Lookup-Tabellen anpassen in zwei Schritten\" width=\"700\" height=\"391,202\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Lookup-Tabellen anpassen in zwei Schritten<\/span><\/b><\/p>\n<ul>\n<li>Zuerst muss man f&uuml;r alle Datens&auml;tze der Tabelle <b>tblArtikel <\/b>den Wert des Fremdschl&uuml;sselfeldes <b>KategorieID <\/b>auf die neue Zielkategorie einstellen, hier also <b>Getr&auml;nke<\/b>.<\/li>\n<li>Erst dann l&ouml;scht man die Kategorie <b>Alkohol. Getr&auml;nke<\/b>, sofern diese definitiv nicht mehr ben&ouml;tigt wird.<\/li>\n<\/ul>\n<p>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&auml;t (s. Bild 2). Dadurch ist sichergestellt, dass der Benutzer nicht versehentlich eine Kategorie l&ouml;scht, die noch mit einem der Artikel-Datens&auml;tze verkn&uuml;pft ist.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_946_002.png\" alt=\"Verkn&uuml;pfung zwischen Detailtabelle und Lookup-Tabelle\" width=\"575\" height=\"374,377\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Verkn&uuml;pfung zwischen Detailtabelle und Lookup-Tabelle<\/span><\/b><\/p>\n<p>Wenn Sie bei dieser Konstellation versuchen, einen Datensatz aus einer Lookup-Tabelle wie <b>tblKategorien <\/b>zu l&ouml;schen, w&auml;hrend noch ein Datensatz der Tabelle <b>tblArtikel <\/b>&uuml;ber das Fremdschl&uuml;sselfeld <b>KategorieID <\/b>auf diesen Datensatz verweist, erscheint eine entsprechende Meldung (s. Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_946_003.png\" alt=\"Meldung beim Versuch, einen verkn&uuml;pften Datensatz aus einer Lookup-Tabelle zu l&ouml;schen\" width=\"575\" height=\"311,7566\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Meldung beim Versuch, einen verkn&uuml;pften Datensatz aus einer Lookup-Tabelle zu l&ouml;schen<\/span><\/b><\/p>\n<p>Sie sollten in den Beziehungseigenschaften f&uuml;r die Beziehung zwischen den beiden Tabellen <b>tblArtikel <\/b>und <b>tblKategorien <\/b>auf keinen Fall die Option <b>L&ouml;schweitergabe an verwandte Datens&auml;tze <\/b>aktivieren. Wenn Sie bei dieser Einstellung einen der Datens&auml;tze der Tabelle <b>tblKategorien <\/b>l&ouml;schen, werden auch automatisch alle Datens&auml;tze der Tabelle <b>tblArtikel <\/b>gel&ouml;scht, die mit diesem Datensatz verkn&uuml;pft sind &#8211; zumindest wenn dies nicht noch durch andere mit referenzieller Integrit&auml;t definierte Beziehungen verhindert wird. Die nachfolgend vorgestellte L&ouml;sung soll jedoch ohnehin nur solche Lookup-Daten l&ouml;schen, die keinem Datensatz einer Detailtabelle mehr zugeordnet sind.<\/p>\n<p><b>Lookup-Daten zusammenf&uuml;hren per Mausklick<\/b><\/p>\n<p>Das Formular aus Bild 4 enth&auml;lt alle Steuerelemente, um das Zusammenf&uuml;hren zweier oder mehrerer Lookup-Datens&auml;tze mit wenigen Mausklicks durchzuf&uuml;hren.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_946_004.png\" alt=\"Formular zum Zusammenf&uuml;hren von Lookup-Werten samt Anpassung verkn&uuml;pfter Datens&auml;tze\" width=\"450\" height=\"688,4395\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Formular zum Zusammenf&uuml;hren von Lookup-Werten samt Anpassung verkn&uuml;pfter Datens&auml;tze<\/span><\/b><\/p>\n<p>Dazu w&auml;hlen Sie zun&auml;chst mit dem oberen Kombinationsfeld die Lookup- oder Mastertabelle aus &#8211; in diesem Fall die Tabelle <b>tblKategorien<\/b>. Dies f&uuml;llt automatisch die beiden folgenden Kombinationsfelder mit den Namen der Felder dieser Tabelle. Damit w&auml;hlen Sie dann erst das Prim&auml;rschl&uuml;sselfeld dieser Tabelle aus und dann das Lookup-Feld, also das Feld, dessen Daten etwa in Nachschlagefeldern angezeigt werden.<\/p>\n<p>Die beiden darunter befindlichen Listenfelder liefern dann alle Datens&auml;tze der ausgew&auml;hlten Lookup-Tabelle &#8211; und beide Listenfelder zeigen genau die gleichen Daten an.<\/p>\n<p>Das &auml;ndert sich allerdings, wenn Sie ein oder mehrere Eintr&auml;ge des linken Listenfeldes ausw&auml;hlen. Dann verschwinden die dort markierten Eintr&auml;ge n&auml;mlich aus dem rechten Listenfeld. Der Grund ist einfach: Wir wollen ja kein Lookup-Feld in sich selbst &uuml;bertragen.<\/p>\n<p>Auf der rechten Seite markieren Sie dann die Kategorie, in welche die auf der linken Seite markierten Kategorien &uuml;berf&uuml;hrt werden sollen.<\/p>\n<p>Nun kommen wir zu den Daten der Detailtabelle: Das erste Kombinationsfeld mit der Beschriftung <b>Detailtabelle <\/b>erm&ouml;glicht die Auswahl der Tabelle, die mit der Lookup-Tabelle verkn&uuml;pft ist und deren Daten im Fremdschl&uuml;sselfeld an die neue Kategorie angepasst werden sollen. Um die Verkn&uuml;pfung genauer zu spezifizieren, w&auml;hlen Sie mit dem folgenden Kombinationsfeld mit der Beschriftung <b>Anzeigefeld<\/b> ein Feld aus, das den jeweiligen Datensatz beschreibt &#8211; hier also etwa <b>Artikelname<\/b>. Diese Auswahl hat nur informativen Charakter, damit Sie in den unteren beiden Listenfeldern erkennen k&ouml;nnen, welche Datens&auml;tze der ausgew&auml;hlten Tabelle mit den aktuell zum Zusammenf&uuml;hren markierten Kategorien verkn&uuml;pft sind. Das dritte Kombinationsfeld mit der Beschriftung <b>Fremdschl&uuml;sselfeld<\/b> wird auch tats&auml;chlich zum &uuml;berf&uuml;hren der Daten der Detailtabelle zum neuen Datensatz der Lookup-Tabelle ben&ouml;tigt. Damit geben Sie n&auml;mlich den Namen des Fremdschl&uuml;sselfeldes an, &uuml;ber das die Tabelle mit der Lookup-Tabelle verkn&uuml;pft ist. Die unteren beiden Listenfelder zeigen nun die Datens&auml;tze der Detailtabelle, die mit den Datens&auml;tzen der Lookup-Tabellen aus den dar&uuml;ber ausgew&auml;hlten Listenfeldern verkn&uuml;pft sind.<\/p>\n<p>Nach der Auswahl aller notwendigen Informationen klicken Sie einfach auf die Schaltfl&auml;che unten, deren Beschriftung dynamisch an die Einstellungen angepasst wird. Diese Schaltfl&auml;che sorgt f&uuml;r folgende Schritte:<\/p>\n<ul>\n<li>Einstellen der Fremdschl&uuml;sselwerte der Datens&auml;tze, die mit den im linken Kombinationsfeld ausgew&auml;hlten Lookup-Datens&auml;tzen verkn&uuml;pft sind, auf den im rechten Listenfeld ausgew&auml;hlten Lookup-Datensatz.<\/li>\n<li>L&ouml;schen der Eintr&auml;ge der Lookup-Tabelle, die im rechten Listenfeld markiert sind.<\/li>\n<\/ul>\n<p><b>Formular erstellen<\/b><\/p>\n<p>Schauen wir uns nun an, wie das Formular erstellt wird und wie die enthaltenen Techniken funktionieren.<\/p>\n<p><b>Alle Tabellen im Kombinationsfeld anzeigen<\/b><\/p>\n<p>F&uuml;r dieses Formular sind keine Einstellungen erforderlich, die etwa beim Laden durch eine Ereignisprozedur vorgenommen werden m&uuml;ssen. Die einzige Vorbereitung ist, dass Sie die Datensatzherkunft des Kombinationsfeldes <b>cboMastertabelle <\/b>auf eine entsprechende Abfrage einstellen m&uuml;ssen (s. Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_946_005.png\" alt=\"Ausstatten des Kombinationsfeldes mit einer Datensatzherkunft\" width=\"500\" height=\"363,3388\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Ausstatten des Kombinationsfeldes mit einer Datensatzherkunft<\/span><\/b><\/p>\n<p>Diese sehen Sie in Bild 6. Diese Abfrage verwendet die Systemtabelle <b>MSysObjects <\/b>als Datenherkunft und soll nur die Daten des Feldes <b>Name <\/b>zur&uuml;ckliefern. Das Feld <b>Type <\/b>dient lediglich zur Auswahl der richtigen Objekte aus dieser Tabelle. Die Typen <b>1<\/b>, <b>4 <\/b>und <b>6 <\/b>liefern alle Tabellenarten von Access, daher verwenden wir als Kriterium den Ausdruck <b>IN (1, 4, 6)<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_946_006.png\" alt=\"Datensatzherkunft f&uuml;r das Kombinationsfeld cboMastertabelle\" width=\"500\" height=\"331,7215\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Datensatzherkunft f&uuml;r das Kombinationsfeld cboMastertabelle<\/span><\/b><\/p>\n<p><b>Lookup-Tabelle ausw&auml;hlen<\/b><\/p>\n<p>Wenn der Benutzer einen der Eintr&auml;ge des Kombinationsfeldes <b>cboMastertabelle <\/b>ausw&auml;hlt, l&ouml;st dies das Ereignis <b>Nach Aktualisierung <\/b>aus. Die daf&uuml;r hinterlegte Ereignisprozedur finden Sie in Listing 1.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboMastertabelle_AfterUpdate()\r\n     <span style=\"color:blue;\">With<\/span> Me!cboPrimaerschluesselfeld\r\n         .RowSourceType = \"Field List\"\r\n         .RowSource = Me!cboMastertabelle\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">With<\/span> Me!cboLookupfeld\r\n         .RowSourceType = \"Field List\"\r\n         .RowSource = Me!cboMastertabelle\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     LookuplisteFuellen\r\n     LookuplisteErsetzenFuellen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: F&uuml;llen der Steuerelemente nach der Auswahl der Mastertabelle<\/span><\/b><\/p>\n<p>Die Prozedur stellt zun&auml;chst zwei Eigenschaften des Kombinationsfeldes zur Auswahl des Prim&auml;rschl&uuml;sselfeldes der zuvor bestimmten Tabelle namens <b>cbo-Pri-maerschluesselfeld<\/b> ein. Die erste hei&szlig;t <b>RowSourceType <\/b>und legt mit dem Wert <b>Field List <\/b>fest, dass die Felder einer mit der zweiten Eigenschaft <b>RowSource <\/b>festgelegten Tabelle als Werte des Kombinationsfeldes angezeigt werden sollen. Diese Eigenschaft stellt die Prozedur logischerweise auf den Namen der soeben ausgew&auml;hlten Tabelle ein. Damit zeigt das erste Kombinationsfeld schon einmal die Felder der ausgew&auml;hlten Tabelle an (s. Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_946_007.png\" alt=\"Anzeige der Felder der oben ausgew&auml;hlten Tabelle per Kombinationsfeld\" width=\"450\" height=\"145,9223\" \/><\/p>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Anzeige der Felder der oben ausgew&auml;hlten Tabelle per Kombinationsfeld<\/span><\/b><\/p>\n<p>Die folgenden Anweisungen f&uuml;hren die gleichen Schritte f&uuml;r das zweite Kombinationsfeld <b>cboLookupfeld<\/b> durch. Dieses Kombinationsfeld soll das Feld aufnehmen, dessen Werte die Lookup-Tabelle ausmachen. Schlie&szlig;lich folgt noch der Aufruf zwei weiterer Prozeduren, n&auml;mlich <b>LookuplisteFuellen <\/b>und <b>LookuplisteErsetzenFuellen<\/b>. Der Aufruf erfolgt in diesem Fall nur, damit die beiden Listenfelder <b>lstLookupwerte<\/b> und <b>lstLookupwerteErsetzen <\/b>geleert werden, wenn der Benutzer eine neue Tabelle ausw&auml;hlt &#8211; wir schauen uns die beiden Prozeduren weiter unten in Detail an.<\/p>\n<p><b>Prim&auml;rschl&uuml;sselfeld und Lookup-Feld ausw&auml;hlen<\/b><\/p>\n<p>Die beiden folgenden Kombinationsfelder <b>cboPrimaer-schlues-sel-feld<\/b> und <b>cboLoo-kup-feld <\/b>sind nun mit den Feldern der im oberen Kombinationsfeld ausgew&auml;hlten Tabelle gef&uuml;llt. Damit k&ouml;nnen Sie nun festlegen, welches der Felder die Aufgabe des Prim&auml;rschl&uuml;sselfeldes und welches die des Lookupfeldes mit dem angezeigten Feld &uuml;bernimmt. Die Auswahl dieses Feldes l&ouml;st die Prozedur aus Listing 2 aus. Auch diese aktualisiert &uuml;ber die beiden Prozeduren <b>LookuplisteFuellen <\/b>und <b>LookuplisteErsetzenFuellen <\/b>die beiden darunter befindlichen Listenfelder. <\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboPrimaerschluesselfeld_AfterUpdate()\r\n     LookuplisteFuellen\r\n     LookuplisteErsetzenFuellen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Aktualisieren der Listenfelder durch cboPrimaerschluesselfeld<\/span><\/b><\/p>\n<p>Das Kombinationsfeld <b>cboLookupfeld<\/b> l&ouml;st nach der Aktualisierung ebenfalls eine Ereignisprozedur aus, welche die gleichen Anweisungen enth&auml;lt wie die von <b>cboPrimaerschluesselfeld<\/b> ausgel&ouml;ste (s. Listing 3).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboLookupfeld_AfterUpdate()\r\n     LookuplisteFuellen\r\n     LookuplisteErsetzenFuellen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Aktualisieren der Listenfelder durch cboLookupfeld<\/span><\/b><\/p>\n<p><b>F&uuml;llen der Lookup-Liste<\/b><\/p>\n<p>Damit wird es nun endg&uuml;ltig Zeit, einen Blick auf die Prozedur <b>LookuplisteFuellen <\/b>zu werfen. Diese ist f&uuml;r das F&uuml;llen des linken Listenfeldes zur Anzeige des zu &uuml;berf&uuml;hrendenLookupdatensatzes verantwortlich. Die Prozedur finden Sie in Listing 4.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>LookuplisteFuellen()\r\n     <span style=\"color:blue;\">Dim <\/span>strSQL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Nz(Me!cboMastertabelle) = 0 And <span style=\"color:blue;\">Not<\/span> Nz(Me!cboLookupfeld) = 0 _\r\n             And <span style=\"color:blue;\">Not<\/span> Nz(Me!cboPrimaerschluesselfeld) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strSQL = \"SELECT \" & Me!cboPrimaerschluesselfeld & \", \" _\r\n             & Me!cboLookupfeld & \" FROM \" & Me!cboMastertabelle\r\n         Me!lstLookupwerte.RowSource = strSQL\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me!lstLookupwerte.RowSource = \"\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: F&uuml;llen der Lookupliste<\/span><\/b><\/p>\n<p>Sie pr&uuml;ft zun&auml;chst, ob f&uuml;r jedes der drei oberen Kombinationsfelder ein Eintrag ausgew&auml;hlt wurde. Falls ja, stellt die Prozedur eine <b>SELECT<\/b>-Abfrage zusammen, welche die beiden in den Kombinationsfeldern <b>cboPrimaerschluesselfeld <\/b>und <b>cboLookupfeld <\/b>angegebenen Felder der Tabelle aus <b>cboMastertabelle <\/b>liefert. F&uuml;r unser Beispiel sieht der so in der Variablen <b>strSQL <\/b>gespeicherte Ausdruck nun wie folgt aus:<\/p>\n<pre>SELECT KategorieID, Kategoriename \r\nFROM tblKategorien<\/pre>\n<p>Dieser Abfrage wird nun &uuml;ber die Eigenschaft <b>RowSource <\/b>als Datensatzherkunft des Listenfeldes <b>lstLookupwerte <\/b>eingestellt. Sollte eines der drei Kombinationsfelder noch leer sein, leert die Prozedur auch das Listenfeld <b>lstLookupwerte<\/b>, in dem sie die Eigenschaft <b>RowSource <\/b>dieses Steuerelements auf eine leere Zeichenkette (<b>&#8222;&#8220;<\/b>) einstellt.<\/p>\n<p><b>Ermitteln der zu &uuml;berf&uuml;hrenden Lookup-Datens&auml;tze<\/b><\/p>\n<p>Nun wird es interessant: Die Prozedur <b>LookuplisteErsetzenFuellen <\/b>soll die Eintr&auml;ge des Listenfeldes <b>lstLookupwerteErsetzen <\/b>zusammenstellen (s. Listing 5). Normalerweise sollte man denken, dass man dort auch einfach alle Datens&auml;tze der Lookup-Tabelle eintr&auml;gt. Allerdings sollen ja genau diejenigen Datens&auml;tze, die bereits als zu &uuml;berf&uuml;hrende Datens&auml;tze im linken Listenfeld markiert wurden, nicht als Ziel-Lookup-Datens&auml;tze angeboten werden. <\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>LookuplisteErsetzenFuellen()\r\n     <span style=\"color:blue;\">Dim <\/span>strSQL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>var<span style=\"color:blue;\"> As Variant<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strLookupwerte<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Nz(Me!cboMastertabelle) = 0 And <span style=\"color:blue;\">Not<\/span> Nz(Me!cboLookupfeld) = 0 _\r\n             And <span style=\"color:blue;\">Not<\/span> Nz(Me!cboPrimaerschluesselfeld) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strSQL = \"SELECT \" & Me!cboPrimaerschluesselfeld & \", \" & Me!cboLookupfeld & \" FROM \" _\r\n             & Me!cboMastertabelle\r\n         For Each var In Me!lstLookupwerte.ItemsSelected\r\n             strLookupwerte = strLookupwerte & \", \" & Me!lstLookupwerte.ItemData(var)\r\n         <span style=\"color:blue;\">Next<\/span> var\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strLookupwerte) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             strLookupwerte = <span style=\"color:blue;\">Mid<\/span>(strLookupwerte, 3)\r\n             strSQL = strSQL & \" WHERE \" & Me!cboPrimaerschluesselfeld & \" NOT IN (\" _\r\n                 & strLookupwerte & \")\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         Me!lstLookupwerteErsetzen.RowSource = strSQL\r\n         Me!lstLookupwerteErsetzen = Null\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me!lstLookupwerteErsetzen.RowSource = \"\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: F&uuml;llen der Listenfelder <\/span><\/b><\/p>\n<p>Also m&uuml;ssen wir die dortigen Datens&auml;tze noch etwas weiter einschr&auml;nken. Die Prozedur pr&uuml;ft wiederum, ob &uuml;berhaupt alle drei der obigen Kombinationsfelder einen Wert enthalten. Falls ja, beginnt die Prozedur mit der Zusammenstellung des SQL-Ausdrucks, der als Datensatzherkunft f&uuml;r das Listenfeld dient. Die Basisabfrage sieht wieder genauso aus wie die f&uuml;r das linke Listenfeld. Dann folgt allerdings eine <b>For Each<\/b>-Schleife, welche alle markierten Datens&auml;tze des linken Listenfeldes durchl&auml;uft. Diese werden &uuml;ber die Auflistung <b>ItemsSelected <\/b>des Steuerelements bereitgestellt, welche jeweils den Index der markierten Eintr&auml;ge liefert. Diesen speichern wir mit jedem Schleifendurchlauf in der Variablen <b>var<\/b>.<\/p>\n<p>Wenn wir der <b>ItemData<\/b>-Eigenschaft des Listenfeldes den Wert von <b>var<\/b>, also den Index eines der markierten Eintr&auml;ge &uuml;bergeben, erhalten wir den Wert der gebundenen Spalte zur&uuml;ck. Diesen speichern wir zusammen mit einem f&uuml;hrenden Komma in einer <b>String<\/b>-Variablen namens <b>strLookupwerte<\/b>. Wenn der Benutzer mehrere Eintr&auml;ge markiert hat, also mehrere Kategorien zu der im rechten Listenfeld markierten Kategorie &uuml;berf&uuml;hren m&ouml;chte, entsteht auf diese Weise in <b>strLookupwerte <\/b>ein Ausdruck wie der folgende:<\/p>\n<pre>, 1, 4, 8<\/pre>\n<p>Nach dem Durchlaufen aller markierten Eintr&auml;ge in der <b>For Each<\/b>-Schleife pr&uuml;ft die Prozedur dann, ob die in <b>strLookupwerte <\/b>gespeicherte Zeichenfolge l&auml;nger als <b>0 <\/b>Zeichen ist. Falls ja, schneidet die folgende Anweisung mit der <b>Mid<\/b>-Funktion die vorderen beiden Zeichen, also das Komma und das Leerzeichen ab, sodass diese Zeichenkette &uuml;brig bleibt:<\/p>\n<pre>1, 4, 8<\/pre>\n<p>Damit stellt die Prozedur dann den Rest der SQL-Abfrage zusammen und f&uuml;gt diesen zu dem bereits in <b>strSQL <\/b>gespeicherten Basisausdruck hinzu. Das Ergebnis sieht dann etwa wie folgt aus:<\/p>\n<pre>SELECT KategorieID, Kategoriename \r\nFROM tblKategorien \r\nWHERE KategorieID NOT IN (1, 4, 8)<\/pre>\n<p>Diese Abfrage weist die Prozedur dann dem Listenfeld <b>lstLookupwerteErsetzen <\/b>&uuml;ber die Eigenschaft <b>RowSource <\/b>als Datensatzherkunft zu. Enthalten die zu Beginn der Prozedur gepr&uuml;ften drei Kombinationsfelder nicht alle einen Wert, stellt diese die Datensatzherkunft des Listenfeldes auf eine leere Zeichenkette ein.<\/p>\n<p><b>Zu &uuml;berf&uuml;hrende Lookupwerte markieren<\/b><\/p>\n<p>Damit Sie &uuml;berhaupt mehrere Look-up-werte im linken Listenfeld namens lstLookupwerte markieren k&ouml;nnen, haben wir die Eigenschaft <b>Mehrfachauswahl <\/b>dieses Steuerelements auf den Wert <b>Einzeln <\/b>eingestellt (s. Bild 8). Je nach Ihren W&uuml;nschen k&ouml;nnen Sie hier auch die Einstellung <b>Erweitert <\/b>vornehmen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_946_008.png\" alt=\"Vorbereitung des Listenfeldes auf die Mehrfachauswahl von Eintr&auml;gen\" width=\"450\" height=\"316,7221\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Vorbereitung des Listenfeldes auf die Mehrfachauswahl von Eintr&auml;gen<\/span><\/b><\/p>\n<p>Unabh&auml;ngig davon, ob der Benutzer nun einen oder mehrere Listenfeldeintr&auml;ge markiert, wird bei jeder &auml;nderung der markierten Eintr&auml;ge das Ereignis <b>Nach Aktualisierung <\/b>des Listenfeldes ausgel&ouml;st und somit auch die Ereignisprozedur <b>lstLook-up-werte_AfterUpdate<\/b> (s. Listing 6).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>lstLookupwerte_AfterUpdate()\r\n     LookuplisteErsetzenFuellen\r\n     DetaildatensaetzeFuellen\r\n     Me!cmdErsetzen.Caption = \"Linken Lookupwert durch rechten Lookupwert ersetzen\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Aktualisieren der Auswahl im linken Listenfeld<\/span><\/b><\/p>\n<p>Diese Prozedur ruft zun&auml;chst die weiter oben bereits beschriebene Prozedur <b>LookuplisteErsetzenFuellen <\/b>auf, um im rechten Listenfeld die Eintr&auml;ge auszublenden, die im linken Listenfeld ausgew&auml;hlt wurden.<\/p>\n<p>Dann ruft sie eine weitere Prozedur namens <b>DetaildateisaetzeFuellen <\/b>auf, um das linke Listenfeld im unteren Bereich des Formulars mit Daten zu f&uuml;llen.<\/p>\n<p>Dieses soll alle Datens&auml;tze der Detailtabelle liefern, welche &uuml;ber das angegebene Fremdschl&uuml;sselfeld mit den im Listenfeld ausgew&auml;hlten Lookup-Werten verkn&uuml;pft sind. Dies geschieht jedoch nur, wenn die Kombinationsfelder im unteren Bereich bereits einen Wert aufweisen &#8211; diese legen ja fest, in welcher Weise die verkn&uuml;pften Detaildatens&auml;tze in den Listenfeldern dargestellt werden sollen.<\/p>\n<p>Also schauen wir uns die Prozedur weiter unten an, nach dem wir die Kombinationfselder <b>cboDetailtabelle<\/b>, <b>cboAnzeigeFeld <\/b>und <b>cboFremd-schlues-sel-feld <\/b>betrachtet haben.<\/p>\n<p>Wenn der Benutzer nun einen Eintrag im rechten Listenfeld ausw&auml;hlt und damit festlegt, in welche Kategorie die Eintr&auml;ge des linken Listenfeldes &uuml;berf&uuml;hrt werden sollen, l&ouml;st dies die folgende Prozedur aus. Diese ruft wiederum die Prozedur <b>DetaildatensaetzeFuellen <\/b>auf, die wir sp&auml;ter beschreiben.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>lstLookupwerteErsetzen_ AfterUpdate()\r\n     DetaildatensaetzeFuellen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Detailtabelle ausw&auml;hlen<\/b><\/p>\n<p>Wenn der Benutzer festgelegt hat, welche die Lookup-Tabelle ist und welche Datens&auml;tze der Lookup-Tabelle in andere Lookup-Datens&auml;tze &uuml;berf&uuml;hrt werden sollen, geht es an die Konfiguration der Tabelle, die mit der Lookup-Tabelle verkn&uuml;pft ist. In unserem Beispiel handelt es sich dabei um die Tabelle <b>tblArtikel<\/b>, die &uuml;ber das Fremdschl&uuml;sselfeld <b>KategorieID <\/b>mit dieser Tabelle verkn&uuml;pft ist. Wenn der Benutzer die Detailtabelle mit dem Kombinationsfeld <b>cboDetailtabelle <\/b>ausgew&auml;hlt hat, l&ouml;st er damit die folgende Ereignisprozedur aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboDetailtabelle_Click()\r\n     <span style=\"color:blue;\">With<\/span> Me!cboFremdschluesselfeld\r\n         .RowSourceType = \"Field List\"\r\n         .RowSource = Me!cboDetailtabelle\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">With<\/span> Me!cboAnzeigefeld\r\n         .RowSourceType = \"Field List\"\r\n         .RowSource = Me!cboDetailtabelle\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     DetaildatensaetzeFuellen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese legt die Datensatzherkunft f&uuml;r die beiden folgenden Kombinationsfelder fest, die beide &#8211; wie bereits die beiden Kombinationsfelder im oberen Bereich &#8211; mit der Liste der verf&uuml;gbaren Felder der mit <b>cboDetailtabelle <\/b>ausgew&auml;hlten Tabelle gef&uuml;llt werden. Danach ruft auch diese Routine wieder die Prozedur <b>DetaildatensaetzeFuellen <\/b>auf.<\/p>\n<p>Bevor wir diese beschreiben, schauen wir uns noch zwei weitere Prozeduren an, die diese Routine aufrufen &#8211; n&auml;mlich jene, die durch das Ausw&auml;hlen der Felder mit den Kombinationsfeldern <b>cboAnzeigefeld <\/b>und <b>cboFremdschluesselfeld <\/b>ausgel&ouml;st werden:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboAnzeigefeld_Click()\r\n     DetaildatensaetzeFuellen\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>cboFremdschluesselfeld_Click()\r\n     DetaildatensaetzeFuellen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Detaildatens&auml;tze f&uuml;llen<\/b><\/p>\n<p>Die Prozedur <b>DetaildatensaetzeFuellen <\/b>aus Listing 7 analysiert die Inhalte der beiden Listenfelder mit den zu &uuml;berf&uuml;hrenden Lookup-Werten sowie die betroffene Detailtabelle und zeigt dann in den zwei unteren Listenfeldern links die Daten an, die den zu &uuml;berf&uuml;hrenden Lookup-Eintr&auml;gen zugeordnet sind und rechts die Daten, die zu dem Ziel-Look-up-Eintrag geh&ouml;ren.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>DetaildatensaetzeFuellen()\r\n     <span style=\"color:blue;\">Dim <\/span>strSQL<span style=\"color:blue;\"> As String<\/span>, var<span style=\"color:blue;\"> As Variant<\/span>, strLookupwerte<span style=\"color:blue;\"> As String<\/span>, strSQLZuErsetzen<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Nz(Me!cboDetailtabelle) = 0 And <span style=\"color:blue;\">Not<\/span> Nz(Me!cboFremdschluesselfeld) = 0 _\r\n             And <span style=\"color:blue;\">Not<\/span> Nz(Me!cboAnzeigefeld) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strSQL = \"SELECT \" & Me!cboAnzeigefeld & \" FROM \" & Me!cboDetailtabelle\r\n         For Each var In Me!lstLookupwerte.ItemsSelected\r\n             strLookupwerte = strLookupwerte & \", \" & lstLookupwerte.ItemData(var)\r\n         <span style=\"color:blue;\">Next<\/span> var\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strLookupwerte) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             strLookupwerte = <span style=\"color:blue;\">Mid<\/span>(strLookupwerte, 3)\r\n             strSQL = strSQL & \" WHERE \" & Me!cboFremdschluesselfeld & \" IN(\" & strLookupwerte & \")\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         Me!lstDetaildaten.RowSource = strSQL\r\n         strSQLZuErsetzen = \"SELECT \" & Me!cboAnzeigefeld & \" FROM \" & Me!cboDetailtabelle\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(Me!lstLookupwerteErsetzen)<span style=\"color:blue;\"> Then<\/span>\r\n             strSQLZuErsetzen = strSQLZuErsetzen & \" WHERE \" & Me!cboFremdschluesselfeld _\r\n                 & \" = \" & Me!lstLookupwerteErsetzen\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         Me!lstDetaildatenZuErsetzen.RowSource = strSQLZuErsetzen\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me!lstDetaildaten.RowSource = \"\"\r\n         Me!lstDetaildatenZuErsetzen.RowSource = \"\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Me!cmdErsetzen.Caption = \"Kategorie ''\" & Me!lstLookupwerte.Column(1) & \"'' durch Kategorie ''\" _\r\n         & Me!lstLookupwerteErsetzen.Column(1) & \"'' ersetzen\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: F&uuml;llen der Listenfelder mit den Detaildatens&auml;tzen nach der Aktualisierung diverser Steuerelemente<\/span><\/b><\/p>\n<p>Dabei durchl&auml;uft sie &auml;hnlich wie die Prozedur <b>LookuplisteErsetzenFuellen <\/b>die markierten Listenfeldeintr&auml;ge und setzt daraus ein Kriterium zusammen, mit dem die mit den Kategorien verkn&uuml;pften Datens&auml;tze der Detailtabelle ermittelt werden k&ouml;nnen. Das Gleiche geschieht parallel f&uuml;r die Eintr&auml;ge der Detailtabelle (hier die Artikel), die mit der Zielkategorie verkn&uuml;pft sind. Dadurch sieht man schlie&szlig;lich in den unteren beiden Listenfeldern, welche Detail-Datens&auml;tze in der Zielkategorie zusammengef&uuml;hrt werden.<\/p>\n<p><b>Lookup-Eintr&auml;ge zusammenf&uuml;hren<\/b><\/p>\n<p>Fehlt nur noch die Ereignisprozedur, die durch das Anklicken der Schaltfl&auml;che <b>cmdErsetzen <\/b>ausgel&ouml;st wird. Diese sieht wie in Listing 8 aus und durchl&auml;uft zun&auml;chst eine <b>For Each<\/b>-Schleife &uuml;ber die zu &uuml;berf&uuml;hrenden Lookup-Eintr&auml;ge. Dabei setzt sie eine Liste der Prim&auml;rschl&uuml;sselwerte der enthaltenen Eintr&auml;ge wie bereits weiter oben beschrieben zusammen. Damit formuliert sie eine <b>UPDATE<\/b>-Abfrage, welche f&uuml;r alle Datens&auml;tze der Detailtabelle, die mit den zu &uuml;berf&uuml;hrenden Lookup-Werten verkn&uuml;pft sind, den Wert des Fremdschl&uuml;sselfeldes auf den Prim&auml;rschl&uuml;sselwert des Zieleintrags der Lookup-Tabelle einstellt. Diese sieht etwa so aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdErsetzen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>var<span style=\"color:blue;\"> As Variant<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strDetailtabelle<span style=\"color:blue;\"> As String<\/span>, strFremdschluesselfeld<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngAlterFremdschluesselwert<span style=\"color:blue;\"> As Long<\/span>, strAlteFremdschluesselwerte<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngNeuerFremdschluesselwert<span style=\"color:blue;\"> As Long<\/span>, strPrimaerschluesselfeld<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strMastertabelle<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     strDetailtabelle = Me!cboDetailtabelle\r\n     strFremdschluesselfeld = Me!cboFremdschluesselfeld\r\n     strPrimaerschluesselfeld = Me!cboPrimaerschluesselfeld\r\n     For Each var In Me!lstLookupwerte.ItemsSelected\r\n         lngAlterFremdschluesselwert = Me!lstLookupwerte.ItemData(var)\r\n         strAlteFremdschluesselwerte = strAlteFremdschluesselwerte & \", \" _\r\n             & lngAlterFremdschluesselwert\r\n     <span style=\"color:blue;\">Next<\/span> var\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strAlteFremdschluesselwerte) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strAlteFremdschluesselwerte = <span style=\"color:blue;\">Mid<\/span>(strAlteFremdschluesselwerte, 3)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     lngNeuerFremdschluesselwert = Me!lstLookupwerteErsetzen\r\n     strMastertabelle = Me!cboMastertabelle\r\n     db.Execute \"UPDATE \" & strDetailtabelle & \" SET \" & strFremdschluesselfeld & \" = \" _\r\n         & lngNeuerFremdschluesselwert & \" WHERE \" & strFremdschluesselfeld & \" IN(\" _\r\n         & strAlteFremdschluesselwerte & \")\", dbFailOnError\r\n     db.Execute \"DELETE FROM \" & strMastertabelle & \" WHERE \" & strPrimaerschluesselfeld _\r\n         & \" IN(\" & strAlteFremdschluesselwerte & \")\", dbFailOnError\r\n     LookuplisteFuellen\r\n     DetaildatensaetzeFuellen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Ersetzen der Eintr&auml;ge der Lookup-Tabelle im Fremdschl&uuml;sselfeld und L&ouml;schen der nun &uuml;berfl&uuml;ssigen Lookup-Eintr&auml;ge<\/span><\/b><\/p>\n<pre>UPDATE tblArtikel SET KategorieID = 2 \r\nWHERE KategorieID IN(1, 4, 8)<\/pre>\n<p>Dann stellt die Prozedur eine weitere SQL-Anweisung zusammen, die diesmal die Lookup-Eintr&auml;ge l&ouml;schen soll, die soeben von verkn&uuml;pften Datens&auml;tzen befreit wurden. Diese Abfrage sieht beispielsweise so aus:<\/p>\n<pre>DELETE FROM tblKategorien WHERE KategorieID IN(1, 4, 8)<\/pre>\n<p>Damit sind die Lookup-Eintr&auml;ge samt verkn&uuml;pfter Detaildatens&auml;tze &uuml;berf&uuml;hrt. Die Prozedur aktualisiert nun noch durch den Aufruf der beiden Routinen <b>Lookup-listeFuellen <\/b>und <b>DetaildatensaetzeFuellen <\/b>die &uuml;brigen Steuerelemente des Formulars.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Diese L&ouml;sung setzen Sie ein, indem Sie das Formular in die Zieldatenbank kopieren und es aufrufen. Die &uuml;brigen Schritte wurden bereits weiter oben erl&auml;utert. Gegebenenfalls k&ouml;nnte man aus dieser L&ouml;sung noch ein Add-In erstellen, das sich dann bequem &uuml;ber die Liste der Men&uuml;-Add-Ins aufrufen lie&szlig;e.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>LookupdatenAusZweiMachEins.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{B56AF04D-509A-4C57-9487-0CD7F54A8E6C}\/aiu_946.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Unter Lookup-Daten verstehen wir beispielsweise die Kategorien, denen ein Artikel zugeordnet werden kann, oder auch Anreden &#8211; also Daten, die zur Vermeidung von Redundanzen in eine eigene Tabelle ausgelagert und anschlie&szlig;end wieder verkn&uuml;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&auml;tze, die inhaltlich redundant sind, zusammenf&uuml;hren und dabei auch die damit verkn&uuml;pften Daten ber&uuml;cksichtigen. Die L&ouml;sung kann aber auch genutzt werden, um beliebige Lookup-Datens&auml;tze zusammenzuf&uuml;hren.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662014,66042014,44000027],"tags":[],"class_list":["post-55000946","post","type-post","status-publish","format-standard","hentry","category-662014","category-66042014","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Lookup-Daten: Aus zwei mach eins - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/LookupDaten_Aus_zwei_mach_eins\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Lookup-Daten: Aus zwei mach eins\" \/>\n<meta property=\"og:description\" content=\"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&szlig;end wieder verkn&uuml;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&auml;tze, die inhaltlich redundant sind, zusammenf&uuml;hren und dabei auch die damit verkn&uuml;pften Daten ber&uuml;cksichtigen. Die L&ouml;sung kann aber auch genutzt werden, um beliebige Lookup-Datens&auml;tze zusammenzuf&uuml;hren.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/LookupDaten_Aus_zwei_mach_eins\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:12:05+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/8530dc6123804bf09c914bfb71063666\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"18\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/LookupDaten_Aus_zwei_mach_eins\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/LookupDaten_Aus_zwei_mach_eins\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Lookup-Daten: Aus zwei mach eins\",\"datePublished\":\"2020-05-22T21:12:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/LookupDaten_Aus_zwei_mach_eins\\\/\"},\"wordCount\":3198,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/LookupDaten_Aus_zwei_mach_eins\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/8530dc6123804bf09c914bfb71063666\",\"articleSection\":[\"2014\",\"4\\\/2014\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/LookupDaten_Aus_zwei_mach_eins\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/LookupDaten_Aus_zwei_mach_eins\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/LookupDaten_Aus_zwei_mach_eins\\\/\",\"name\":\"Lookup-Daten: Aus zwei mach eins - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/LookupDaten_Aus_zwei_mach_eins\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/LookupDaten_Aus_zwei_mach_eins\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/8530dc6123804bf09c914bfb71063666\",\"datePublished\":\"2020-05-22T21:12:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/LookupDaten_Aus_zwei_mach_eins\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/LookupDaten_Aus_zwei_mach_eins\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/LookupDaten_Aus_zwei_mach_eins\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/8530dc6123804bf09c914bfb71063666\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/8530dc6123804bf09c914bfb71063666\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/LookupDaten_Aus_zwei_mach_eins\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Lookup-Daten: Aus zwei mach eins\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Lookup-Daten: Aus zwei mach eins - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/LookupDaten_Aus_zwei_mach_eins\/","og_locale":"de_DE","og_type":"article","og_title":"Lookup-Daten: Aus zwei mach eins","og_description":"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&szlig;end wieder verkn&uuml;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&auml;tze, die inhaltlich redundant sind, zusammenf&uuml;hren und dabei auch die damit verkn&uuml;pften Daten ber&uuml;cksichtigen. Die L&ouml;sung kann aber auch genutzt werden, um beliebige Lookup-Datens&auml;tze zusammenzuf&uuml;hren.","og_url":"https:\/\/access-im-unternehmen.de\/LookupDaten_Aus_zwei_mach_eins\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:12:05+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/8530dc6123804bf09c914bfb71063666","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"18\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/LookupDaten_Aus_zwei_mach_eins\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/LookupDaten_Aus_zwei_mach_eins\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Lookup-Daten: Aus zwei mach eins","datePublished":"2020-05-22T21:12:05+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/LookupDaten_Aus_zwei_mach_eins\/"},"wordCount":3198,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/LookupDaten_Aus_zwei_mach_eins\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/8530dc6123804bf09c914bfb71063666","articleSection":["2014","4\/2014","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/LookupDaten_Aus_zwei_mach_eins\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/LookupDaten_Aus_zwei_mach_eins\/","url":"https:\/\/access-im-unternehmen.de\/LookupDaten_Aus_zwei_mach_eins\/","name":"Lookup-Daten: Aus zwei mach eins - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/LookupDaten_Aus_zwei_mach_eins\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/LookupDaten_Aus_zwei_mach_eins\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/8530dc6123804bf09c914bfb71063666","datePublished":"2020-05-22T21:12:05+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/LookupDaten_Aus_zwei_mach_eins\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/LookupDaten_Aus_zwei_mach_eins\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/LookupDaten_Aus_zwei_mach_eins\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/8530dc6123804bf09c914bfb71063666","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/8530dc6123804bf09c914bfb71063666"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/LookupDaten_Aus_zwei_mach_eins\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Lookup-Daten: Aus zwei mach eins"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000946","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000946"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000946\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000946"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000946"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000946"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}