{"id":55000291,"date":"2016-06-01T00:00:00","date_gmt":"2020-01-24T15:59:27","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=291"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Rekursive_Tabellen","status":"publish","type":"post","link":"https:\/\/access-basics.de\/index.php\/Rekursive_Tabellen.html","title":{"rendered":"Rekursive Tabellen"},"content":{"rendered":"<p class='introduction'>Ihr Kumpel, der Gemeinderat, kommt auf die geniale Idee, f&uuml;r alle Bewohner des Dorfes einen Stammbaum anzulegen, und betreut Sie als Programmierer mit der Aufgabe, diese in einer Datenbank anzulegen, um das anschlie&szlig;end zu Papier bringen zu k&ouml;nnen. Das kann kein so kompliziertes Unterfangen sein, denken Sie, und machen sich frohgemut an die Arbeit. Das Datenmodell ist der erste Schritt, der zu bew&auml;ltigen ist&#8230;<\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Die Beispiele dieses Artikels finden Sie in der Datenbank <b>1509_RekursiveTabellen.accdb<\/b><\/p>\n<h2>Eltern, Kinder, Enkel im Datenmodell<\/h2>\n<p>Es scheint gar nicht schwer zu sein. Es muss einfach eine Tabelle f&uuml;r die Eltern her, die einen Prim&auml;rschl&uuml;ssel aufweist. Dann eine f&uuml;r die Kinder, in der die Datens&auml;tze &uuml;ber einen Fremdschl&uuml;ssel <b>ElterID<\/b> auf die Datens&auml;tze der Eltern verweisen. Und schlie&szlig;lich gibt es noch Enkel, deren Tabelle &auml;hnlich aufgebaut ist, wie die der Kinder. Im Ergebnis erhalten Sie das Beziehungslayout aus Bild 1. Die Tabellen sind &uuml;ber <b>Referenzielle Integrit&auml;t<\/b> eindeutig miteinander verkn&uuml;pft, jeweils Indizes auf das Feld <b>ElterID<\/b> gelegt, und die eigentlichen Eintr&auml;ge der Daten bestehen aus dem Feld <b>Person<\/b> f&uuml;r den Namen der B&uuml;rgers und dem Feld <b>mw<\/b>, welches sein Geschlecht wiedergeben soll. Flux die Daten aus der Excel-Grundlage in die Tabellen eingepflegt, und schon l&auml;sst sich dank der automatischen Unterdatenbl&auml;tter von Access &#8211; ein Feature, welches hier wirklich einmal sinnvoll zum Einsatz kommt &#8211; ein Baum ausklappen, wie in Bild 2. Sp&auml;testens hier kommen Ihnen Bedenken wegen der etwaigen Urenkel oder gar noch weiterer Abk&ouml;mmlinge. Sollten noch weitere Tabellen f&uuml;r diese angelegt werden Und wie sieht es sp&auml;ter mit der Auswertung dieser Struktur aus Werden die daf&uuml;r ben&ouml;tigten Abfragen da nicht recht umfangreich und un&uuml;bersichtlich<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/Relations.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/Relations.png\" alt=\"Der erste Enwurf des Datenmodells f&uuml;r die Stammbaumdatenbank mit allen Tabellen und deren Beziehungen\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 1: Der erste Enwurf des Datenmodells f&uuml;r die Stammbaumdatenbank mit allen Tabellen und deren Beziehungen<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/tblEltern.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/tblEltern.png\" alt=\"Nach dem &ouml;ffnen der Tabelle tblEltern lassen sich die automatisch generierten Unterdatenbl&auml;tter mit den Kindern und Enkeln ausklappen\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 2: Nach dem &ouml;ffnen der Tabelle tblEltern lassen sich die automatisch generierten Unterdatenbl&auml;tter mit den Kindern und Enkeln ausklappen<\/p>\n<p>Es geht nat&uuml;rlich auch anders! Sie kommen tats&auml;chlich mit nur einer einzigen Tabelle aus, in der rekursiv eine Beziehung zwischen den Datens&auml;tzen f&uuml;r Eltern und Kinder hergestellt wird<\/p>\n<h2>Rekursive Tabellen<\/h2>\n<p>Das Grundprinzip ist ganz einfach. Eine rekursive Tabelle muss einen Prim&auml;rschl&uuml;ssel aufweisen, der jeden Datensatz eindeutig identifiziert. Und zus&auml;tzlich ein weiteres indiziertes Feld, welches als Fremdschl&uuml;sselverweis f&uuml;r den Prim&auml;rschl&uuml;ssel dient. Dazu kommen dann die eigentlichen Inhalte der Tabelle. In Bild 3 ist das f&uuml;r die Tabelle <b>tblElternKind<\/b> realisiert. Die <b>ID<\/b> ist als Prim&auml;rschl&uuml;ssel vom Typ <b>Autowert<\/b>. <b>ParentID<\/b> vom Typ <b>Long<\/b> enth&auml;lt dann jeweils einen Wert, der auf einen anderen Datensatz mit dieser <b>ID<\/b> verweist. <b>Person<\/b> und <b>mw<\/b> sind die eigentlichen Inhalte der Tabelle. <b>Ingbert<\/b> in Datensatz 7 hat die <b>ParentID<\/b> 60, was besagt, dass sein Elter weiter unten im Datensatz mit eben dieser <b>ID<\/b> 60 zu finden ist. Das w&auml;re dann, au&szlig;erhalb des in Bild 3 sichtbaren Bereichs, <b>G&uuml;nter<\/b>. Scrollen Sie zu <b>G&uuml;nter<\/b>, so kann es sein, dass dieser ebenfalls eine <b>ParentID<\/b> enth&auml;lt, mithin also etwa ein Kind von <b>Klara<\/b> w&auml;re, und somit <b>Ingbert<\/b> ein Enkel von <b>Klara<\/b>. Tats&auml;chlich ist aber das Feld <b>ParentID<\/b> von G&uuml;nter leer, was besagt, dass in der Datenbank kein Elter von ihm verzeichnet ist. <b>G&uuml;nter<\/b> w&auml;re ein <b>Root-Datensatz<\/b> der rekursiven Tabelle.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/qryElternKindFlat.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/qryElternKindFlat.png\" alt=\"Die Eltern-Kind-Tabelle in Datenblattansicht mit dem Verweisfeld ParentID\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 3: Die Eltern-Kind-Tabelle in Datenblattansicht mit dem Verweisfeld ParentID<\/p>\n<p>Mehr gibt es dazu eigentlich nicht zu sagen. Immer dann, wenn Datens&auml;tze hierarchisch voneinander abh&auml;ngen und die Zahl der Kindelemente, also der Unterebenen, nicht bekannt ist, kommt so eine rekursive Struktur infrage.<\/p>\n<p>Sie finden in jeder Access-Datenbank daf&uuml;r ein Beispiel. Die Systemtabelle <b>MSysObjects<\/b> enth&auml;lt rekursive Eintr&auml;ge. Auch sie hat den Prim&auml;rschl&uuml;ssel <b>ID<\/b> und das Verweisfeld <b>ParentID<\/b>. &ouml;ffnen Sie sie einmal in der Beispieldatenbank, was voraussetzt, dass in den Optionen des Navigationsbereichs der Eintrag <b>Systemobjekte anzeigen<\/b> aktiviert ist. Unter der Name Spalte <b>Name<\/b> suchen Sie die Tabelle <b>tblElternKind<\/b>. Im Datensatz finden Sie unter <b>ParentID<\/b> den Wert <b>251658241<\/b>.<\/p>\n<p>Nun navigieren Sie zum Datensatz mit dieser <b>ID<\/b>. Dort steht unter <b>Name<\/b> <b>Tables<\/b>. Das ist der Container f&uuml;r alle Tabellen der Datenbank. Er selbst hat die <b>ParentID<\/b> <b>251658240<\/b>, was allerdings zu keinem g&uuml;ltigen Datensatz in der Tabelle f&uuml;hrt&#8230;<\/p>\n<p>Ein anderes Beispiel w&auml;re die Systemtabelle <b>MSysAccessStorage<\/b>, welche alle Objekte der Datenbank enth&auml;lt, au&szlig;er den Tabellen und Abfragen. Sie ist noch st&auml;rker verschachtelt und hat als <b>Root-Datensatz<\/b> die <b>ID<\/b> 1 f&uuml;r den bezeichnenden Eintrag <b>MSysAccessStorage_ROOT<\/b>.<\/p>\n<p>Sie sparen sich mit dieser rekursiven Tabelle also eine Menge Arbeit f&uuml;r die Stammbaumdatenbank ein. Doch wie sieht es nun mit der Darstellung des Baums aus Gab es im ersten Entwurf noch voneinander abh&auml;ngige Tabellen, die als Unterdatenbl&auml;tter der Elterntabelle eingeblendet werden konnten, so scheint diese M&ouml;glichkeit bei nur einer Tabelle nunmehr auszuscheiden.<\/p>\n<h2>Anzeige rekursiver Tabellen<\/h2>\n<p>Tats&auml;chlich kommt aber nur Access von sich aus nicht auf die Idee, in einer Tabelle als Unterdatenblatt eben die gleiche Tabelle einzutragen. Doch genau dies ist machbar. Nehmen Sie den Entwurf der Tabelle <b>tblElternKind<\/b> in Bild 4. Dort ist ein Ausschnitt des Eigenschaftenblatts der Tabelle eingeblendet. Als Unterdatenblatt ist die  <b>tblElternKind<\/b> selbst eingetragen und die Verkn&uuml;pfung &uuml;ber <b>ParentID<\/b> und <b>ID<\/b> gew&auml;hrleistet. Nachdem Sie diese &auml;nderung abgespeichert haben, zeigt das Datenblatt die bekannten <b>Plus-Symbole<\/b> und klappt zu Eltern tats&auml;chlich die Kinder aus, diese wiederum die Enkel, diese die Urenkel, und so fort. Access erzeugt hier also f&uuml;r jede Unterebene eine neue Instanz der Tabelle und verkn&uuml;pft diese im Hintergrund mit dem Datensatz der &uuml;bergeordneten Instanz.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/tblElternKindDesign.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/tblElternKindDesign.png\" alt=\"Die Eltern-Kind-Tabelle im Entwurf mit einem Teil des Eigenschaftenblatts\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 4: Die Eltern-Kind-Tabelle im Entwurf mit einem Teil des Eigenschaftenblatts<\/p>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Access &#091;basics&#093;<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/282\/access-basics?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 400 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000291\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/index.php\/data\/wp\/v2\/posts\/55000291?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000291\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"8d63f6cbe9\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ihr Kumpel, der Gemeinderat, kommt auf die geniale Idee, f&uuml;r alle Bewohner des Dorfes einen Stammbaum anzulegen, und betreut Sie als Programmierer mit der Aufgabe, diese in einer Datenbank anzulegen, um das anschlie&szlig;end zu Papier bringen zu k&ouml;nnen. Das kann kein so kompliziertes Unterfangen sein, denken Sie, und machen sich frohgemut an die Arbeit. Das Datenmodell ist der erste Schritt, der zu bew&auml;ltigen ist&#8230;<\/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":[662015,66092015,44000006,44000017],"tags":[],"class_list":["post-55000291","post","type-post","status-publish","format-standard","hentry","category-662015","category-66092015","category-Abfragen_fuer_die_Datenauswahl","category-Tipps_und_Tricks"],"aioseo_notices":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v15.9.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Rekursive Tabellen - Access [basics]<\/title>\n<meta name=\"description\" content=\"Ihr Kumpel, der Gemeinderat, kommt auf die geniale Idee, f\u00fcr alle Bewohner des Dorfes einen Stammbaum anzulegen, und betreut Sie als Programmierer mit der Aufgabe, diese in einer Datenbank anzulegen, um das anschlie\u00dfend zu Papier bringen zu k\u00f6nnen. Das kann kein so kompliziertes Unterfangen sein, denken Sie, und machen sich frohgemut an die Arbeit. Das Datenmodell ist der erste Schritt, der zu bew\u00e4ltigen ist...\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-basics.de\/index.php\/Rekursive_Tabellen.html\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Rekursive Tabellen - Access [basics]\" \/>\n<meta property=\"og:description\" content=\"Ihr Kumpel, der Gemeinderat, kommt auf die geniale Idee, f\u00fcr alle Bewohner des Dorfes einen Stammbaum anzulegen, und betreut Sie als Programmierer mit der Aufgabe, diese in einer Datenbank anzulegen, um das anschlie\u00dfend zu Papier bringen zu k\u00f6nnen. Das kann kein so kompliziertes Unterfangen sein, denken Sie, und machen sich frohgemut an die Arbeit. Das Datenmodell ist der erste Schritt, der zu bew\u00e4ltigen ist...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-basics.de\/index.php\/Rekursive_Tabellen.html\" \/>\n<meta property=\"og:site_name\" content=\"Access [basics]\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-24T15:59:27+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"-0001-11-30T00:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/..\/tl_files\/images\/Relations.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\">\n\t<meta name=\"twitter:data1\" content=\"13\u00a0Minuten\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/access-basics.de\/#website\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Access [basics]\",\"description\":\"DAS ACCESS-MAGAZIN F\\u00dcR ALLE, DIE VON 0 AUF 100 WOLLEN\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/access-basics.de\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Rekursive_Tabellen.html#primaryimage\",\"inLanguage\":\"de\",\"url\":\"..\/tl_files\/images\/Relations.png\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Rekursive_Tabellen.html#webpage\",\"url\":\"https:\/\/access-basics.de\/index.php\/Rekursive_Tabellen.html\",\"name\":\"Rekursive Tabellen - Access [basics]\",\"isPartOf\":{\"@id\":\"https:\/\/access-basics.de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Rekursive_Tabellen.html#primaryimage\"},\"datePublished\":\"2020-01-24T15:59:27+00:00\",\"dateModified\":\"-0001-11-30T00:00:00+00:00\",\"author\":{\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\"},\"description\":\"Ihr Kumpel, der Gemeinderat, kommt auf die geniale Idee, f\\u00fcr alle Bewohner des Dorfes einen Stammbaum anzulegen, und betreut Sie als Programmierer mit der Aufgabe, diese in einer Datenbank anzulegen, um das anschlie\\u00dfend zu Papier bringen zu k\\u00f6nnen. Das kann kein so kompliziertes Unterfangen sein, denken Sie, und machen sich frohgemut an die Arbeit. Das Datenmodell ist der erste Schritt, der zu bew\\u00e4ltigen ist...\",\"breadcrumb\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Rekursive_Tabellen.html#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/access-basics.de\/index.php\/Rekursive_Tabellen.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Rekursive_Tabellen.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Rekursive_Tabellen.html\",\"url\":\"https:\/\/access-basics.de\/index.php\/Rekursive_Tabellen.html\",\"name\":\"Rekursive Tabellen\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/#personlogo\",\"inLanguage\":\"de\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","_links":{"self":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000291","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/comments?post=55000291"}],"version-history":[{"count":0,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000291\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/media?parent=55000291"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/categories?post=55000291"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/tags?post=55000291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}