{"id":55000296,"date":"2016-10-01T00:00:00","date_gmt":"2020-01-24T15:59:29","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=296"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Navigation_in_und_zwischen_Formularen","status":"publish","type":"post","link":"https:\/\/access-basics.de\/index.php\/Navigation_in_und_zwischen_Formularen.html","title":{"rendered":"Navigation in und zwischen Formularen"},"content":{"rendered":"<p class='introduction'>Wie gelangt man in einem Formular intuitiv zu einem bestimmten Datensatz Wie kann man zum zuletzt angezeigten Datensatz zur&uuml;ckspringen Auf welche Weise l&auml;sst sich zu einem Detaildatensatz ohne Umwege ein Hauptformular &ouml;ffnen Antworten auf diese Fragen versucht dieser Beitrag mit einigen trickreichen Routinen zu geben, die teilweise die Navigation auf Webseiten nachbilden.<\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Die Beispiele dieses Artikels finden Sie in der Datenbank <b>1511_FormNavigation.accdb<\/b><\/p>\n<h2>Datenmodell<\/h2>\n<p>Die Beispielanwendung verwendet ein Datenmodell (Bild 1), welches sich um Adressen, Kunden, Bestellungen und Artikel rankt. Dabei handelt es sich nicht um eine ausgefeilte Vertriebsl&ouml;sung, sondern um ein Demonstrationsobjekt, das auf die wesentlichen Teile reduziert ist. Zwei Hauptformulare speisen sich dann aus den Tabellen des Modells &#8211; so viel sei schon an dieser Stelle verraten. Das eine verwendet nur die Tabelle <b>tblAdressen<\/b> und deren Nachschlagetabellen <b>tblAnreden<\/b>, <b>tblOrte<\/b> und <b>tblLaender<\/b>.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/RelLayout.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/RelLayout.png\" alt=\"Datenmodell der Beispieldatenbank mit den Beziehungen zwischen Adressen, Bestellungen und Artikeln\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 1: Datenmodell der Beispieldatenbank mit den Beziehungen zwischen Adressen, Bestellungen und Artikeln<\/p>\n<p>Das andere simuliert eine Kunden- und Bestellverwaltung, wobei hier die Adresstabelle als Kundenbasis zweckentfremdet wird. An ihr h&auml;ngen die Bestellungen, Bestelldetails und Bestellartikel.<\/p>\n<p>Die Verkn&uuml;pfung zwischen Kundenadresse und Bestellung geschieht &uuml;ber die <b>ID<\/b> der Prim&auml;rtabelle und <b>KundeID<\/b> der Fremdschl&uuml;sseltabelle. &auml;hnlich sieht die Beziehung zwischen Bestellung und Bestelldetail aus. Die Tabelle <b>tblArtikel<\/b> ist hingegen eher wieder eine Nachschlagetabelle. Zu einer Kundenadresse kann es also mehrere Bestellungen geben und zu jeder Bestellung wiederum mehrere Bestellartikel in den Bestelldetails. Damit die Artikeltabelle etwas aufgepeppt wird, verweist ein Feld <b>Herkunftsland<\/b> zus&auml;tzlich auf die Tabelle <b>tblLaender<\/b>.<\/p>\n<h2>Adressen verwalten<\/h2>\n<p>&uuml;ber das Formular frmAdressen in Bild 2 werden nun die Adressen angezeigt und bearbeitet. Es enth&auml;lt Steuerelemente f&uuml;r alle Felder der Tabelle, wobei die drei Nachschlagefelder <b>IDAnrede<\/b>, <b>IDOrt<\/b> und <b>IDLand<\/b> als Kombinationsfelder daher kommen und sich in ihrer Datenherkunft direkt aus den jeweiligen Tabellen speisen. Gebunden sind diese Felder an die erste unsichtbare Spalte <b>ID<\/b> der Detailtabellen. Die Datenquelle des Formulars selbst ist ebenfalls direkt die Tabelle <b>tblAdressen<\/b>. Soweit weist das Formular keinerlei Besonderheiten auf.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/frmAdressen.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/frmAdressen.png\" alt=\"Das Adressformular frmAdressen der Beispieldatenbank\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 2: Das Adressformular frmAdressen der Beispieldatenbank<\/p>\n<p>Zus&auml;tzlich sind ist aber ein Unterformular <b>sfrmKinder<\/b> integriert, welches ebenfalls auf der Adresstabelle basiert, jedoch deren Felder &uuml;ber eine Abfrage auf <b>Nachname<\/b> und <b>Vorname<\/b> beschr&auml;nkt. Das sollen Kinder des angezeigten Hauptdatensatzes sein. Die Verbindung kommt &uuml;ber das unscheinbare Feld <b>ParentID<\/b> der Tabelle zustande. Ein Datensatz, der einen Wert in diesem Feld enth&auml;lt, verweist damit auf den Elterndatensatz mit der verwiesenen <b>ID<\/b>. In der letzten Ausgabe von Access Basics lernten Sie diese Methode bereits im Beitrag zu <b>Rekursiven Tabellen<\/b> kennen. Beim Navigieren durch die Hauptdatens&auml;tze des Formulars werden also im Unterformular die zugeh&ouml;rigen Kinder angezeigt.<\/p>\n<p>Es gibt nun drei Spezialelemente im Formular. Zum einen listet eine <b>Combobox<\/b> rechts oben im Kopfbereich alle Adressen namentlich auf. Durch Auswahl eines Eintrags gelangen Sie zum entsprechenden Adressdatensatz, wie Bild 3 demonstriert. Deshalb ist die Navigationsleiste des Formulars auch ausgeblendet. Denn diese ist in den meisten F&auml;llen ohnehin &uuml;berfl&uuml;ssig. Wer sucht Datens&auml;tze schon &uuml;ber Vor- und Zur&uuml;cksteppen oder &uuml;ber die Eingabe eines Zahlenwerts heraus<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/frmAdressen1.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/frmAdressen1.png\" alt=\"Sprung zu anderen Datens&auml;tzen im Adressformular &uuml;ber Kombinationsfeld\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 3: Sprung zu anderen Datens&auml;tzen im Adressformular &uuml;ber Kombinationsfeld<\/p>\n<p>Ebenfalls im Kopfbereich untergebracht ist die Schaltfl&auml;che <b>Zur&uuml;ck<\/b>. Sie ist zun&auml;chst deaktiviert. Sobald Sie aber &uuml;ber die Navigations-Combo zu einem anderen Datensatz springen, wird sie aktiv und zeigt die eben verlassene Adresse an, etwa den <b>Karol Wagner (Bild 4)<\/b>. Mit Klick auf diesen Button gelangen Sie wieder zur&uuml;ck zum aufrufenden Datensatz.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/frmAdressen2.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/frmAdressen2.png\" alt=\"Die Zur&uuml;ck-Schaltfl&auml;che oben zeigt die zuletzt verlassene Adresse an\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 4: Die Zur&uuml;ck-Schaltfl&auml;che oben zeigt die zuletzt verlassene Adresse an<\/p>\n<p>Wie der Text unter dem Unterformular bereits erl&auml;utert, reagieren die Datenzeilen der Kinder auf einen Doppelklick. Der l&ouml;st n&auml;mlich aus, dass zum Adressdatensatzes dieses Kindes gesprungen wird. Auch in diesem Fall wird die <b>Zur&uuml;ck<\/b>-Schaltfl&auml;che aktiv, damit Sie schnell zum Elterndatensatz zur&uuml;ckgelangen k&ouml;nnen.<\/p>\n<p>Eingebaut ist hier also eine <b>History<\/b> &auml;hnlich der des Webbrowsers. Dass all diese Navigationsfunktionen mit nur sehr wenig Aufwand zu realisieren sind, zeigt ein Blick in das Code-Modul des Formulars. Listing 1 gibt den Kopf und die Initialisierung wieder.<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>arrUndo()<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Private <\/span>lUndo<span style=\"color:blue;\"> As Long<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     ReDim arrUndo(1, 30)\r\n     lUndo = -1\r\n     Me.Recordset.FindFirst \"ID=19\"\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>Form_Current()\r\n     Me!cbFind = Null\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p class='imagetext'>Listing 1: Erster Teil des Formularmoduls von frmAdressen<\/p>\n<p>Dort ist ein Array <b>arrUndo<\/b> deklariert, welches der <b>History<\/b>-Funktion dient. In diesem Array werden zuletzt verlassene Datens&auml;tze anhand ihrer <b>ID<\/b> und des Adressnamens gespeichert. In der Ereignisprozedur <b>Beim Laden<\/b> (<b>Form_Load<\/b>) wird das Array auf zwei Ebenen mit 30 Elementen dimensioniert. <b>30 <\/b>ist ein willk&uuml;rlich gew&auml;hlter Wert, der die maximale Zahl der R&uuml;ckspr&uuml;nge darstellt. Er sollte ausreichen. Die erste Ebene des Arrays enth&auml;lt die <b>IDs<\/b> der Datens&auml;tze, die zweite die Adressnamen. Wir kommen noch darauf zu sprechen, wie und wo es bef&uuml;llt wird. Jedenfalls k&ouml;nnte ein Array-Datensatz so aussehen:<\/p>\n<pre>arrUndo(0,12) = 78\r\narrUndo(1,12) =\"Karol, Wagner\"<\/pre>\n<p>Die Variable <b>lUndo<\/b> ist ein Positionszeiger f&uuml;r das Array. W&auml;re die aufgef&uuml;hrten Elemente eben erst gespeichert worden, so enthielte <b>lUndo<\/b> den Wert <b>12<\/b>. Im <b>Load<\/b>-Ereignis jedoch wird <b>lUndo<\/b> zun&auml;chst auf <b>-1<\/b> gesetzt, weil es ja noch keinen Array-Eintrag gibt. Nur zur Demonstration wird in diesem Ereignis auch noch der Datensatz mit der <b>ID<\/b> <b>19<\/b> angesprungen. Diese Zeile ist elementar f&uuml;r das Navigieren zu bestimmten Datens&auml;tzen. Statt sich etwa der <b>DoCmd<\/b>-Methode <b>GotoRecord<\/b> zu bedienen, ist die Navigation &uuml;ber das Formular-<b>Recordset<\/b> erheblich einfacher. Dessen Methode <b>FindFirst<\/b> findet automatisch den Datensatz mit der <b>ID<\/b> <b>19<\/b> und, das ist der Clou, zeigt ihn auch gleich an.<\/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\/55000296\/\">\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\/55000296?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\/55000296\/\"\/>\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>Wie gelangt man in einem Formular intuitiv zu einem bestimmten Datensatz Wie kann man zum zuletzt angezeigten Datensatz zur&uuml;ckspringen Auf welche Weise l&auml;sst sich zu einem Detaildatensatz ohne Umwege ein Hauptformular &ouml;ffnen Antworten auf diese Fragen versucht dieser Beitrag mit einigen trickreichen Routinen zu geben, die teilweise die Navigation auf Webseiten nachbilden.<\/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":[66112015,662015,44000004],"tags":[],"class_list":["post-55000296","post","type-post","status-publish","format-standard","hentry","category-66112015","category-662015","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>Navigation in und zwischen Formularen - Access [basics]<\/title>\n<meta name=\"description\" content=\"Wie gelangt man in einem Formular intuitiv zu einem bestimmten Datensatz? Wie kann man zum zuletzt angezeigten Datensatz zur\u00fcckspringen? Auf welche Weise l\u00e4sst sich zu einem Detaildatensatz ohne Umwege ein Hauptformular \u00f6ffnen? Antworten auf diese Fragen versucht dieser Beitrag mit einigen trickreichen Routinen zu geben, die teilweise die Navigation auf Webseiten nachbilden.\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-basics.de\/index.php\/Navigation_in_und_zwischen_Formularen.html\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Navigation in und zwischen Formularen - Access [basics]\" \/>\n<meta property=\"og:description\" content=\"Wie gelangt man in einem Formular intuitiv zu einem bestimmten Datensatz? Wie kann man zum zuletzt angezeigten Datensatz zur\u00fcckspringen? Auf welche Weise l\u00e4sst sich zu einem Detaildatensatz ohne Umwege ein Hauptformular \u00f6ffnen? Antworten auf diese Fragen versucht dieser Beitrag mit einigen trickreichen Routinen zu geben, die teilweise die Navigation auf Webseiten nachbilden.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-basics.de\/index.php\/Navigation_in_und_zwischen_Formularen.html\" \/>\n<meta property=\"og:site_name\" content=\"Access [basics]\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-24T15:59:29+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\/RelLayout.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=\"14\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\/Navigation_in_und_zwischen_Formularen.html#primaryimage\",\"inLanguage\":\"de\",\"url\":\"..\/tl_files\/images\/RelLayout.png\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Navigation_in_und_zwischen_Formularen.html#webpage\",\"url\":\"https:\/\/access-basics.de\/index.php\/Navigation_in_und_zwischen_Formularen.html\",\"name\":\"Navigation in und zwischen Formularen - Access [basics]\",\"isPartOf\":{\"@id\":\"https:\/\/access-basics.de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Navigation_in_und_zwischen_Formularen.html#primaryimage\"},\"datePublished\":\"2020-01-24T15:59:29+00:00\",\"dateModified\":\"-0001-11-30T00:00:00+00:00\",\"author\":{\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\"},\"description\":\"Wie gelangt man in einem Formular intuitiv zu einem bestimmten Datensatz? Wie kann man zum zuletzt angezeigten Datensatz zur\\u00fcckspringen? Auf welche Weise l\\u00e4sst sich zu einem Detaildatensatz ohne Umwege ein Hauptformular \\u00f6ffnen? Antworten auf diese Fragen versucht dieser Beitrag mit einigen trickreichen Routinen zu geben, die teilweise die Navigation auf Webseiten nachbilden.\",\"breadcrumb\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Navigation_in_und_zwischen_Formularen.html#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/access-basics.de\/index.php\/Navigation_in_und_zwischen_Formularen.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Navigation_in_und_zwischen_Formularen.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\/Navigation_in_und_zwischen_Formularen.html\",\"url\":\"https:\/\/access-basics.de\/index.php\/Navigation_in_und_zwischen_Formularen.html\",\"name\":\"Navigation in und zwischen Formularen\"}}]},{\"@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\/55000296","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=55000296"}],"version-history":[{"count":0,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000296\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/media?parent=55000296"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/categories?post=55000296"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/tags?post=55000296"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}