{"id":55000648,"date":"2024-02-01T00:00:00","date_gmt":"2024-02-01T00:00:00","guid":{"rendered":"http:\/\/access-basics.de\/648"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Abfragen_basics_1nDaten_in_Haupt_und_Unterformular","status":"publish","type":"post","link":"https:\/\/access-basics.de\/index.php\/Abfragen_basics_1nDaten_in_Haupt_und_Unterformular.html","title":{"rendered":"Abfragen [basics]: 1:n-Daten in Haupt- und Unterformular"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/b1c49949f1d34f278f9eb33312c60e2c\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p class='introduction'>Fast jede Anwendung mit mindestens einer Beziehung zwischen zwei Tabellen verlangt nach der Darstellung der Daten dieser beiden Tabellen in Haupt- und Unterformular. Diese Darstellung l&auml;sst sich mit kaum einem System einfacher realisieren als mit Microsoft Access. Wie das gelingt, zeigen wir in diesem Artikel. Dabei greifen wir auf eine sehr einfache Konstellation zur&uuml;ck, die sich umgekehrt auch als mit einem einfachen Formular samt Kombinationsfeld abbilden l&auml;sst: Die Verwaltung von Kategorien und den enthaltenen Elementen, in diesem Fall von B&uuml;chern. Damit greifen wir einen Teil des Datenmodells unseres Artikels <b>Formulare [basics]: Beispiel B&uuml;cherverwaltung <\/b>(<b>www.access-basics.de\/624<\/b>) auf.<\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Die Beispiele dieses Artikels findest Du in der Datenbank <b>FormularBasics_1nBeziehungenMitUnterformular.accdb<\/b>.<\/p>\n<h2>Beispieltabellen<\/h2>\n<p>Konkret beziehen wir uns in diesem Artikel auf die beiden Tabellen <b>tblBuecher <\/b>und <b>tblKategorien<\/b>. Diese sind &uuml;ber eine 1:n-Beziehung derart verkn&uuml;pft, dass wir &uuml;ber das Fremdschl&uuml;sselfeld <b>KategorieID <\/b>der Tabelle <b>tblBuecher <\/b>f&uuml;r jedes Buch einen Datensatz der Tabelle <b>tblKategorien <\/b>zuweisen k&ouml;nnen (siehe Bild 1).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_648_001.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_648_001.png\" alt=\"Abzubildende Tabellen\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 1: Abzubildende Tabellen<\/p>\n<p>Da die Beziehung zwischen den beiden Tabellen mit referenzieller Integrit&auml;t definiert wurde, ist sichergestellt, dass wir nur Werte f&uuml;r dieses Fremdschl&uuml;sselfeld ausw&auml;hlen k&ouml;nnen, die im Feld <b>KategorieID <\/b>der Tabelle <b>tblKategorien <\/b>enthalten sind &#8211; oder, im Standardzustand eines solchen Feldes, den Wert <b>Null<\/b>.<\/p>\n<p>Das kann sp&auml;ter einmal zu einem Problem werden &#8211; wie das genau aussieht, schauen wir uns weiter unten an.<\/p>\n<h2>Aufteilung in Hauptformular und Unterformular<\/h2>\n<p>Die Aufteilung in Haupt- und Unterformular ist nicht f&uuml;r jeden Access-Benutzer offensichtlich und notwendig. Immerhin k&ouml;nnte man auch einfach die Kategoriedaten und die Buchdaten in einer Abfrage zusammenstellen und diese in einem einzigen Formular anzeigen. Es gibt nichts, was ich noch nicht gesehen h&auml;tte &#8230; Jedoch hat die Aufteilung in Haupt- und Unterformular entscheidende Vorteile.<\/p>\n<h2>Reihenfolge beim Erstellen der Formulare<\/h2>\n<p>In meiner Praxis hat es sich als g&uuml;nstig erwiesen, zun&auml;chst das Unterformular in der Datenblattansicht zu erstellen, dieses zu speichern und es dann nach der Erstellung des Hauptformulars in seinen Entwurf hineinzuziehen. Wir starten also mit dem Unterformular.<\/p>\n<h2>Erstellen des Unterformulars in der Datenblattansicht<\/h2>\n<p>Wir erstellen das Unterformular wie ein gew&ouml;hnliches Formular. Dieses Formular wird erst durch das Einf&uuml;gen in ein anderes Formular zu einem Unterformular. Zum Erstellen rufen wir den Befehl <b>Formularentwurf <\/b>der Gruppe <b>Formular <\/b>unter dem Ribbontab <b>Erstellen <\/b>auf (siehe Bild 2).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_648_002.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_648_002.png\" alt=\"Erstellen eines Formulars in der Entwurfsansicht\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 2: Erstellen eines Formulars in der Entwurfsansicht<\/p>\n<p>F&uuml;r das nun angezeigte Formular in der Entwurfsansicht blenden wir nun, soweit noch nicht sichtbar, das Eigenschaftenblatt ein (<b>F4<\/b>).<\/p>\n<p>Das Formular soll die Daten der Tabelle <b>tblBuecher <\/b>anzeigen, also w&auml;hlen wir diese Tabelle f&uuml;r die Eigenschaft <b>Datensatzquelle <\/b>aus (siehe Bild 3).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_648_003.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_648_003.png\" alt=\"Ausw&auml;hlen der Datensatzquelle\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 3: Ausw&auml;hlen der Datensatzquelle<\/p>\n<p>Nun wollen wir die Felder dieser Tabelle in Form von Steuerelementen zum zuk&uuml;nftigen Unterformular hinzuf&uuml;gen. Dazu blenden wir mit dem Ribbon-Befehl <b>Formular-ent-wurf|Tools|Vor-handene Felder hinzuf&uuml;gen <\/b>die Feldliste ein. Diese zeigt bereits alle Felder der als Datensatzquelle ausgew&auml;hlten Tabelle an. Wir k&ouml;nnen bei gedr&uuml;ckter <b>Strg<\/b>-Taste alle Felder markieren, die wir zum Formular hinzuf&uuml;gen wollen. Unsere Auswahl umfasst nicht alle Felder (siehe Bild 4).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_648_004.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_648_004.png\" alt=\"Arbeiten mit der Feldliste\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 4: Arbeiten mit der Feldliste<\/p>\n<p>Das Feld <b>BuchID <\/b>ist allein zum Herstellen der Verkn&uuml;pfung und als eindeutiges Merkmal eines jeden Datensatzes n&ouml;tig, wir brauchen es dem Benutzer nicht zu zeigen. Das Feld <b>KategorieID<\/b> ben&ouml;tigen wir nicht, denn das Unterformular soll alle B&uuml;cher zu der im Hauptformular angezeigten Kategorie anzeigen &#8211; daher wissen wir schon, zu welcher Kategorie die Datens&auml;tze im Unterformular geh&ouml;ren. Das Feld <b>Inhaltsangabe <\/b>ist zu umfangreich, um in der Datenblattansicht angezeigt werden zu k&ouml;nnen. Und Bilder aus Anlagefeldern k&ouml;nnen wir in der Datenblattansicht ohnehin nicht anzeigen.<\/p>\n<p>Wenn wir alle Felder ausgew&auml;hlt haben, k&ouml;nnen wir diese auf einmal per Drag and Drop in den Detailbereich des Formularentwurfs hineinziehen. Das Ergebnis sehen wir in Bild 5. Hier sehen wir, dass Access gleich die Steuerelementtypen entsprechend dem Entwurf der Tabelle verwendet. Einfache Textfelder werden durch das Steuerelement <b>Textfeld <\/b>abgebildet, Nachschlagefelder durch Kombinationsfelder und <b>Ja\/Nein<\/b>-Felder durch Kontrollk&auml;stchen.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_648_005.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_648_005.png\" alt=\"Hineinziehen der Felder in den Entwurf des Formulars\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 5: Hineinziehen der Felder in den Entwurf des Formulars<\/p>\n<p>Das Formular haben wir zwischenzeitlich unter dem Namen <b>sfmKategorienBuecher<\/b> gespeichert. Dies hat sich f&uuml;r uns als gute Praxis erwiesen: Als Unterformulare zu verwendende Formulare erhalten das Pr&auml;fix <b>sfm <\/b>und der Rest des Namens besteht aus den Bezeichnungen der Elemente im Haupt- und im Unterformular in der Mehrzahl.<\/p>\n<h2>Aktivieren der Datenblattansicht<\/h2>\n<p>Damit das Unterformular seine Daten in der Datenblattansicht anzeigt, m&uuml;ssen wir die Eigenschaft <b>Standardansicht <\/b>auf <b>Datenblatt <\/b>einstellen. Dazu m&uuml;ssen wir diese erst einmal im Eigenschaftenblatt vorfinden. Es handelt sich bei dieser Eigenschaft um eine Eigenschaft des Formulars selbst und nicht etwa eines der Formularbereiche oder Steuerelemente. Deshalb m&uuml;ssen wir zuerst das Formular markieren. Das erledigen wir auf eine der folgenden Methoden:<\/p>\n<ul>\n<li>Wenn das Lineal angezeigt wird: Klick auf den Schnittpunkt der Lineale oder<\/li>\n<li>Klick auf den grauen Bereich rechts neben oder unter dem wei&szlig;en Formularhintergrund oder<\/li>\n<li>Auswahl des Eintrags <b>Formular <\/b>aus dem Kombinationsfeld oben im Eigenschaftenblatt.<\/li>\n<\/ul>\n<p>Alle drei M&ouml;glichkeiten sind in Bild 6 markiert. Nun k&ouml;nnen wir im Eigenschaftenblatt wie in der Abbildung im Bereich <b>Format <\/b>die Eigenschaft <b>Standardansicht <\/b>auf <b>Datenblatt <\/b>einstellen.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_648_006.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_648_006.png\" alt=\"Einstellen der Ansicht auf die Datenblattansicht\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 6: Einstellen der Ansicht auf die Datenblattansicht<\/p>\n<h2>Test des Unterformulars<\/h2>\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\/55000648\/\">\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\/55000648?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\/55000648\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"9f18b59416\"\/>\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>Fast jede Anwendung mit mindestens einer Beziehung zwischen zwei Tabellen verlangt nach der Darstellung der Daten dieser beiden Tabellen in Haupt- und Unterformular. Diese Darstellung l&auml;sst sich mit kaum einem System einfacher realisieren als mit Microsoft Access. Wie das gelingt, zeigen wir in diesem Artikel. Dabei greifen wir auf eine sehr einfache Konstellation zur&uuml;ck, die sich umgekehrt auch als mit einem einfachen Formular samt Kombinationsfeld abbilden l&auml;sst: Die Verwaltung von Kategorien und den enthaltenen Elementen, in diesem Fall von B&uuml;chern. Damit greifen wir einen Teil des Datenmodells unseres Artikels <b>Formulare [basics]: Beispiel B&uuml;cherverwaltung <\/b>(<b>www.access-basics.de\/624<\/b>) auf.<\/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":[66012024,662024,44000004],"tags":[],"class_list":["post-55000648","post","type-post","status-publish","format-standard","hentry","category-66012024","category-662024","category-Formulare_fuer_die_Dateneingabe"],"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>Abfragen [basics]: 1:n-Daten in Haupt- und Unterformular - Access [basics]<\/title>\n<link rel=\"canonical\" href=\"https:\/\/access-basics.de\/index.php\/Abfragen_basics_1nDaten_in_Haupt_und_Unterformular.html\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Abfragen [basics]: 1:n-Daten in Haupt- und Unterformular - Access [basics]\" \/>\n<meta property=\"og:description\" content=\"Fast jede Anwendung mit mindestens einer Beziehung zwischen zwei Tabellen verlangt nach der Darstellung der Daten dieser beiden Tabellen in Haupt- und Unterformular. Diese Darstellung l&auml;sst sich mit kaum einem System einfacher realisieren als mit Microsoft Access. Wie das gelingt, zeigen wir in diesem Artikel. Dabei greifen wir auf eine sehr einfache Konstellation zur&uuml;ck, die sich umgekehrt auch als mit einem einfachen Formular samt Kombinationsfeld abbilden l&auml;sst: Die Verwaltung von Kategorien und den enthaltenen Elementen, in diesem Fall von B&uuml;chern. Damit greifen wir einen Teil des Datenmodells unseres Artikels Formulare [basics]: Beispiel B&uuml;cherverwaltung (www.access-basics.de\/624) auf.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-basics.de\/index.php\/Abfragen_basics_1nDaten_in_Haupt_und_Unterformular.html\" \/>\n<meta property=\"og:site_name\" content=\"Access [basics]\" \/>\n<meta property=\"article:published_time\" content=\"2024-02-01T00:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"-0001-11-30T00:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/b1c49949f1d34f278f9eb33312c60e2c\" \/>\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\/Abfragen_basics_1nDaten_in_Haupt_und_Unterformular.html#primaryimage\",\"inLanguage\":\"de\",\"url\":\"http:\/\/vg07.met.vgwort.de\/na\/b1c49949f1d34f278f9eb33312c60e2c\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Abfragen_basics_1nDaten_in_Haupt_und_Unterformular.html#webpage\",\"url\":\"https:\/\/access-basics.de\/index.php\/Abfragen_basics_1nDaten_in_Haupt_und_Unterformular.html\",\"name\":\"Abfragen [basics]: 1:n-Daten in Haupt- und Unterformular - Access [basics]\",\"isPartOf\":{\"@id\":\"https:\/\/access-basics.de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Abfragen_basics_1nDaten_in_Haupt_und_Unterformular.html#primaryimage\"},\"datePublished\":\"2024-02-01T00:00:00+00:00\",\"dateModified\":\"-0001-11-30T00:00:00+00:00\",\"author\":{\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\"},\"breadcrumb\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Abfragen_basics_1nDaten_in_Haupt_und_Unterformular.html#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/access-basics.de\/index.php\/Abfragen_basics_1nDaten_in_Haupt_und_Unterformular.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Abfragen_basics_1nDaten_in_Haupt_und_Unterformular.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\/Abfragen_basics_1nDaten_in_Haupt_und_Unterformular.html\",\"url\":\"https:\/\/access-basics.de\/index.php\/Abfragen_basics_1nDaten_in_Haupt_und_Unterformular.html\",\"name\":\"Abfragen [basics]: 1:n-Daten in Haupt- und Unterformular\"}}]},{\"@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\/55000648","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=55000648"}],"version-history":[{"count":0,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000648\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/media?parent=55000648"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/categories?post=55000648"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/tags?post=55000648"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}