{"id":55001488,"date":"2024-04-01T00:00:00","date_gmt":"2024-02-29T18:39:25","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1488"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Tabellendaten_mit_Uebersicht_und_Details_anzeigen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\/","title":{"rendered":"Tabellendaten mit &Uuml;bersicht und Details anzeigen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/79ab84f4efda47dabab1b1c839ff40be\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1488_001.png\" alt=\"Die gew&uuml;nschten Formulare\" width=\"700\" height=\"311,9129\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Die gew&uuml;nschten Formulare<\/span><\/b><\/p>\n<p><b>Eine gute Basis f&uuml;r das Anzeigen und Bearbeiten von Daten ist die folgende Konstellation: Wir verwenden ein Haupt- und Unterformular, um die Daten einer Tabelle in einer &Uuml;bersichtsansicht anzuzeigen. Dabei k&ouml;nnen wir die Daten, die im Unterformular angezeigt werden, filtern und sortieren. Au&szlig;erdem stellen wir Schaltfl&auml;chen bereit, mit denen wir die Datens&auml;tze anlegen, bearbeiten und l&ouml;schen k&ouml;nnen. Zum Bearbeiten verwenden wir ein weiteres Formular, das die Daten in einer &uuml;bersichtlichen Ansicht darstellt. Zus&auml;tzlich f&uuml;gen wir noch ein den Code hinzu, der f&uuml;r das Interagieren der Formulare untereinander notwendig ist. Diese Konstellation von Formularen k&ouml;nnen wir f&uuml;r alle m&ouml;glichen Tabellen verwenden und schaffen so die Basis einer professionellen Anwendung. Anpassungen k&ouml;nnen schlie&szlig;lich dort vorgenommen werden, wo m:n- oder 1:n-Beziehungen dargestellt werden sollen.<\/b><\/p>\n<p>Eine oft verwendete Konstellation aus Formularen zur Darstellung der Daten einer Tabelle sehen wir in Bild 1. Links finden wir ein aus Haupt- und Unterformular bestehendes Formular, das im Unterformular die Daten in der Datenblattansicht anzeigt und im Hauptformular Steuerelemente, um mit den Daten zu arbeiten. Hier k&ouml;nnen wir nach den Daten im Unterformular suchen, einen neuen Datensatz hinzuf&uuml;gen, einen Datensatz zur Bearbeitung &ouml;ffnen oder den markierten Datensatz l&ouml;schen. Ein Doppelklick auf einen der Eintr&auml;ge im Unterformular soll ebenfalls das Bearbeitungsformular &ouml;ffnen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1488_001.png\" alt=\"Die gew&uuml;nschten Formulare\" width=\"700\" height=\"311,9129\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Die gew&uuml;nschten Formulare<\/span><\/b><\/p>\n<p>Dieses sieht wie das Formular rechts in der Abbildung aus. Es liefert einfach die Felder der zugrunde liegenden Tabelle und bietet zwei Schaltfl&auml;chen, mit denen &Auml;nderungen &uuml;bernommen oder verworfen werden k&ouml;nnen.<\/p>\n<h2>&Uuml;bersichtsformular programmieren<\/h2>\n<p>Die Erstellung dieser Formulare beginnen wir immer mit dem Unterformular des &Uuml;bersichtsformulars. Warum das? Weil wir dieses, wenn wir es fertiggestellt haben, direkt in das im Anschluss erstellte Hauptformular einbauen k&ouml;nnen.<\/p>\n<p>Das Unterformular erstellen wir als neues, leeres Formular. Diesem weisen wir f&uuml;r die Eigenschaft <b>Datensatzquelle <\/b>die Tabelle mit den anzuzeigenden Daten zu, in diesem Fall <b>tblMitglieder<\/b>.<\/p>\n<p>Dann ziehen wir aus dem Bereich <b>Feldliste <\/b>alle Felder in den Detailbereich, die das Unterformular anzeigen soll (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1488_002.png\" alt=\"Erstellen des Unterformulars der &Uuml;bersicht\" width=\"649,559\" height=\"414,552\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Erstellen des Unterformulars der &Uuml;bersicht<\/span><\/b><\/p>\n<p>Damit das Unterformular seine Daten in der Datenblattansicht pr&auml;sentiert, stellen wir die Eigenschaft <b>Standardansicht <\/b>auf den Wert <b>Datenblatt <\/b>ein.<\/p>\n<h2>Details anzeigen per Doppelklick<\/h2>\n<p>Au&szlig;erdem wollen wir, dass der Benutzer mit einem Doppelklick auf einen der Eintr&auml;ge im Unterformular das Formular mit der Detailansicht &ouml;ffnen kann. Dazu hinterlegen wir f&uuml;r die Ereigniseigenschaft <b>Beim Doppelklicken <\/b>eines jeden Steuerelements den Wert <b>[Ereignisprozedur] <\/b>und legen durch einen Klick auf die Schaltfl&auml;che mit den drei Punkten die entsprechende Ereignisprozedur an (siehe Bild 3). Die hier hinzugef&uuml;gte Ereignisprozedur f&uuml;llen wir wie folgt mit einer einzigen Anweisung:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1488_003.png\" alt=\"Ereignis Beim Doppelklicken implementieren\" width=\"649,559\" height=\"390,1086\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Ereignis Beim Doppelklicken implementieren<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>MitgliedID_DblClick(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Call<\/span> EditDetails\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Auf die gleiche Weise hinterlegen wir eine solche Ereignisprozedur f&uuml;r die &uuml;brigen Steuerelemente. Die hier aufgerufene Prozedur <b>EditDetails <\/b>finden wir in Listing 1. Sie &ouml;ffnet das Detailformular namens <b>frmMitgliederDetails <\/b>mit der <b>DoCmd.OpenForm<\/b>-Methode. Dabei stellt sie den &Ouml;ffnungsmodus auf einen modalen Dialog ein. Als Datenmodus verwenden wir den Bearbeitungsmodus. Au&szlig;erdem &uuml;bergibt die Prozedur eine Bedingung an das Formular, die daf&uuml;r sorgt, dass es genau den Datensatz anzeigt, der soeben doppelt angeklickt wurde.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>EditDetails()\r\n     <span style=\"color:blue;\">Dim <\/span>strForm<span style=\"color:blue;\"> As String<\/span>\r\n     strForm = \"frmMitgliederDetails\"\r\n     DoCmd.OpenForm strForm, WindowMode:=acDialog, WhereCondition:=\"MitgliedID = \" & Me!MitgliedID, DataMode:=acFormEdit\r\n     <span style=\"color:blue;\">If <\/span>IstFormularGeoeffnet(strForm)<span style=\"color:blue;\"> Then<\/span>\r\n         Me.Requery\r\n         DoCmd.Close acForm, Me.Name\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 1: &Ouml;ffnen der Detailansicht eines Datensatzes<\/span><\/b><\/p>\n<p>Wenn der Benutzer das Formular geschlossen hat, l&auml;uft die aufrufende Prozedur weiter und pr&uuml;ft, ob das Formular geschlossen ist. Falls nicht, und das ist der Fall, wenn der Benutzer im Detailformular die <b>OK<\/b>-Schaltfl&auml;che gedr&uuml;ckt hat, aktualisiert die Prozedur seine eigene Datenquelle und schlie&szlig;t das Detailformular mit <b>DoCmd.Close <\/b>endg&uuml;ltig.<\/p>\n<p>Hat der Benutzer hingegen die <b>Abbrechen<\/b>-Schaltfl&auml;che gedr&uuml;ckt, was bedeutet, das &Auml;nderungen verworfen und das Formular geschlossen werden soll, wird das Formular direkt richtig geschlossen. In diesem Fall m&uuml;ssen im aufrufenden Formular keine Daten aktualisiert werden.<\/p>\n<p>Danach k&ouml;nnen wir das Unterformular schlie&szlig;en und es unter dem Namen <b>sfmMitgliederUebersicht <\/b>speichern.<\/p>\n<h2>Hauptformular programmieren<\/h2>\n<p>Das Hauptformular &ouml;ffnen wir ebenfalls als neues, leeres Formular. Dieses ben&ouml;tigte keine Datensatzquelle, da die Daten ja bereits im Unterformular angezeigt werden. Stattdessen f&uuml;gen wir vier Schaltfl&auml;chen namens <b>cmdAdd<\/b>, <b>cmdEdit<\/b>, <b>cmdDelete <\/b>und <b>cmdOK <\/b>hinzu. Au&szlig;erdem legen wir ein Textfeld namens <b>txtSearch <\/b>an.<\/p>\n<p>Dann ziehen wir das Unterformular <b>sfmMitgliederUebersicht<\/b> aus dem Navigationsbereich in das Hauptformular und positionieren alle Elemente ungef&auml;hr wie in Bild 4.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1488_004.png\" alt=\"Das Unterformular im Hauptformular\" width=\"649,559\" height=\"413,432\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Das Unterformular im Hauptformular<\/span><\/b><\/p>\n<h2>Flexible Gr&ouml;&szlig;e des &Uuml;bersichtsformulars<\/h2>\n<p>In der aktuellen Ansicht ist das Formular recht klein gehalten. Der Benutzer soll es aber vergr&ouml;&szlig;ern k&ouml;nnen und dabei sollen sich auch bestimmte Elemente vergr&ouml;&szlig;ern beziehungsweise verschoben werden. In diesem Fall ist das Unterformular <b>sfmMitgliederUebersicht <\/b>das Element, das sowohl vertikal als auch horizontal angepasst werden soll, wenn der Benutzer das Hauptformular vergr&ouml;&szlig;ert oder verkleinert. Deshalb stellen wir die Eigenschaften <b>Horizontaler Anker <\/b>und <b>Vertikaler Anker <\/b>auf den Wert <b>Beide <\/b>ein. Das wirkt sich automatisch auch auf das Bezeichnungsfeld des Unterformular-Steuerelements aus, f&uuml;r das die Eigenschaften nun auf <b>Rechts <\/b>und <b>Unten <\/b>eingestellt sind. Diese legen wir wieder auf <b>Links <\/b>und <b>Oben <\/b>fest. <\/p>\n<p>Da sich das Unterformular-Steuerelement beim Vergr&ouml;&szlig;ern der H&ouml;he nach unten ausdehnt, m&uuml;ssen wir die darunter liegenden Steuerelemente ebenfalls nach unten verschieben. Deshalb stellen wir f&uuml;r die Schaltfl&auml;che <b>cmdOK <\/b>den Wert der Eigenschaft <b>Vertikaler Anker <\/b>auf <b>Unten <\/b>ein.<\/p>\n<h2>Design der Schaltfl&auml;chen<\/h2>\n<p>Die Schaltfl&auml;chen haben wir ein wenig angepasst, da das Standarddesign etwas altbacken daherkommt. Dazu haben wir zun&auml;chst Bilder hinzugef&uuml;gt. Das gelingt am schnellsten, indem man im Entwurf die jeweilige Schaltfl&auml;che anklickt und den Befehl <b>Bild einf&uuml;gen <\/b>aus dem Ribbon-Tab <b>Formularentwurf<\/b> ausw&auml;hlt. Danach k&ouml;nnen wir das gew&uuml;nschte Icon, am besten im PNG-Format, selektieren und es wird direkt der Schaltfl&auml;che zugeordnet. Einmal zur Anwendung hinzugef&uuml;gte Schaltfl&auml;chen sind danach &uuml;ber die Bildergalerie verf&uuml;gbar (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1488_005.png\" alt=\"Hinzuf&uuml;gen von Icons zu Schaltfl&auml;chen\" width=\"649,559\" height=\"283,3701\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Hinzuf&uuml;gen von Icons zu Schaltfl&auml;chen<\/span><\/b><\/p>\n<p>Damit der Text rechts vom Icon erscheint, stellen wie die Eigenschaft <b>Anordnung der Bildbeschriftung <\/b>auf <b>Rechts <\/b>ein.<\/p>\n<p>Den Rahmen haben wir durch Einstellen der Eigenschaft <b>Rahmenart <\/b>auf den Wert <b>Transparent <\/b>ausgeblendet. F&uuml;r die Schrift haben wir eine andere Farbe gew&auml;hlt, au&szlig;erdem wird diese nun fett dargestellt. Au&szlig;erdem haben wir auch den Hintergrund durch Einstellen der Eigenschaft <b>Hintergrundart <\/b>auf <b>Transparent <\/b>ausgeblendet.<\/p>\n<h2>Ereignisprozeduren im &Uuml;bersichtsformular<\/h2>\n<p>Nun f&uuml;gen wir die Ereignisprozeduren f&uuml;r die Schaltfl&auml;chen im Hauptformular hinzu. Wie beginnen mit der einfachsten Schaltfl&auml;che <b>cmdOK<\/b>. Diese l&ouml;st die folgende Prozedur aus, die einfach das Formular schlie&szlig;t:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdOK_Click()\r\n     DoCmd.Close acForm, Me.Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Suchfunktion programmieren<\/h2>\n<p>Damit kommen wir zur Suchfunktion. Das Suchfeld <b>txtSearch<\/b> soll auf die Eingabe eines jeden Zeichens reagieren und die angezeigten Datens&auml;tze im Unterformular filtern. Dazu reicht es nicht aus, mit dem Ereignis <b>Nach Aktualisierung <\/b>auf das Bet&auml;tigen der Eingabetaste oder das Verlassen des Steuerelements zu reagieren. Wir verwenden hier das Ereignis <b>Bei &Auml;nderung<\/b>, das bei der Eingabe jedes einzelnen Zeichens und auch beim L&ouml;schen von Zeichen ausgel&ouml;st wird.<\/p>\n<p>Daf&uuml;r hinterlegen wir die Prozedur aus Listing 2. Hier lesen wir zuerst den aktuellen Text aus dem Textfeld <b>txtSearch <\/b>ein. Es reicht nicht, einfach mit <b>Me!txtSearch <\/b>oder <b>Me!txtSearch.Value <\/b>den Wert des Textfeldes auszulesen, denn dieser &auml;ndert sich erst mit dem Speichern des Inhalts beispielsweise durch Verlassen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtSearch_Change()\r\n     <span style=\"color:blue;\">Dim <\/span>strSearch<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFilter<span style=\"color:blue;\"> As String<\/span>\r\n     strSearch = Me!txtSearch.Text\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strSearch) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = strFilter & \"OR Vorname LIKE ''*\" & strSearch & \"*''\"\r\n         strFilter = strFilter & \"OR Nachname LIKE ''*\" & strSearch & \"*''\"\r\n         strFilter = strFilter & \"OR Strasse LIKE ''*\" & strSearch & \"*''\"\r\n         strFilter = strFilter & \"OR PLZ LIKE ''*\" & strSearch & \"*''\"\r\n         strFilter = strFilter & \"OR Ort LIKE ''*\" & strSearch & \"*''\"\r\n         strFilter = strFilter & \"OR EMail LIKE ''*\" & strSearch & \"*''\"\r\n         strFilter = strFilter & \"OR Telefon LIKE ''*\" & strSearch & \"*''\"\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strFilter) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             strFilter = <span style=\"color:blue;\">Mid<\/span>(strFilter, 4)\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         Me!sfmMitgliederUebersicht.Form.Filter = strFilter\r\n         Me!sfmMitgliederUebersicht.Form.FilterOn = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me!sfmMitgliederUebersicht.Form.FilterOn = <span style=\"color:blue;\">False<\/span>\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 2: Code f&uuml;r die Suchfunktion<\/span><\/b><\/p>\n<p>Stattdessen verwenden wir die Eigenschaft <b>Text<\/b>, die den tats&auml;chlich angezeigten Text liefert. Den damit ermittelten Wert tragen wir in die Variable <b>strSearch <\/b>ein.<\/p>\n<p>Erst wenn die L&auml;nge dieser Zeichenkette gr&ouml;&szlig;er als <b>0 <\/b>ist, stellen wir einen Filterausdruck zusammen. Bei einer leeren Zeichenketten setzen wir den Filter f&uuml;r das Unterformular einfach mit <b>FilterOn = False <\/b>zur&uuml;ck, sodass dieses alle Datens&auml;tze der Datenquelle anzeigt.<\/p>\n<p>Finden wir jedoch einen Text in <b>strSearch<\/b>, beginnen wir mit dem Zusammenstellen des Filterausdrucks, den wir in der Variablen <b>strFilter <\/b>verwalten. In diesem Beispiel wollen wir die Felder <b>Vorname<\/b>, <b>Nachname<\/b>, <b>Strasse<\/b>, <b>PLZ<\/b>, <b>Ort<\/b>, <b>EMail <\/b>und <b>Telefon <\/b>nach dem Suchbegriff durchsuchen und alle Datens&auml;tze zur&uuml;ckliefern, in denen der Suchbegriff in irgendeinem der Felder auftritt.<\/p>\n<p>Deshalb verbinden wir den Suchausdruck f&uuml;r das jeweilige Feld, also beispielsweise <b>Vorname LIKE &#8220;*Suchbegriff*&#8220;<\/b>, mit dem <b>OR<\/b>-Operator. Die Sternchen verwenden wir, damit der Suchbegriff an beliebiger Stelle vorkommen kann.<\/p>\n<p>Am Ende erhalten wir ein Kriterium, das alle Felder nach dem angegebenen Suchbegriff durchsucht.<\/p>\n<p>Diesen weisen wir schlie&szlig;lich der Eigenschaft <b>Filter <\/b>des mit der <b>Form<\/b>-Eigenschaft des Unterformular-Steuerelements referenzierten Formulars zu. Mit <b>FilterOn = True <\/b>stellen wir dann den Filter scharf.<\/p>\n<p>Dies f&uuml;hrt dazu, dass die Ergebnismenge tats&auml;chlich nach der Eingabe eines jeden Zeichens angepasst wird (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1488_008.png\" alt=\"Die Suchfunktion in Aktion\" width=\"700\" height=\"250,2628\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Die Suchfunktion in Aktion<\/span><\/b><\/p>\n<h2>Neuen Datensatz hinzuf&uuml;gen<\/h2>\n<p>Zum Hinzuf&uuml;gen eines neuen Datensatzes soll der Benutzer die Schaltfl&auml;che <b>cmdAdd <\/b>mit der Beschriftung <b>Neu <\/b>bet&auml;tigen.<\/p>\n<p>Die l&ouml;st die Prozedur aus Listing 3 aus. Diese tr&auml;gt den Namen des Detailformulars in die Variable <b>strForm <\/b>ein. Warum verwenden wir hier eine Variable? Weil der Name des Formulars gleich an mehreren Stellen verwendet wird. Sollten wir diesen Namen einmal &auml;ndern oder gar den hier verwendeten Code noch in einem anderen Formular verwenden, brauchen wir den Formularnamen nur an einer Stelle zu &auml;ndern.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAdd_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>strForm<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngID<span style=\"color:blue;\"> As Long<\/span>\r\n     strForm = \"frmMitgliederDetails\"\r\n     DoCmd.OpenForm strForm, WindowMode:=acDialog, DataMode:=acFormAdd\r\n     <span style=\"color:blue;\">If <\/span>IstFormularGeoeffnet(strForm)<span style=\"color:blue;\"> Then<\/span>\r\n         lngID = Forms(strForm)!MitgliedID\r\n         DoCmd.Close acForm, strForm\r\n         Me!sfmMitgliederUebersicht.Form.Requery\r\n         Me!sfmMitgliederUebersicht.Form.Recordset.FindFirst \"MitgliedID = \" & lngID\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 3: Code zum Anlegen eines neuen Datensatzes<\/span><\/b><\/p>\n<p>In diesem Fall nutzen wir die Variable, um das Formular <b>frmMitgliederDetails <\/b>mit der <b>DoCmd.OpenForm<\/b>-Methode zu &ouml;ffnen. Dieses &ouml;ffnen wir als modalen Dialog (<b>WindowMode:=acDialog<\/b>), damit der aufrufende Code angehalten wird und erst nach dem Schlie&szlig;en oder Ausblenden des ge&ouml;ffneten Formulars weiterl&auml;uft. Au&szlig;erdem stellen wir den Datenmodus zum Anlegen eines neuen Datensatzes ein (<b>DataMode:=acFormAdd<\/b>).<\/p>\n<p>Dadurch erscheint das Formular <b>frmMitgliederDetails <\/b>wie in Bild 7 mit einem neuen, leeren Datensatz. Nachdem wir dort einen neuen Datensatz eingetragen haben und die <b>OK<\/b>-Schaltfl&auml;che bet&auml;tigen, wird das Formular mit <b>Me.Visible = False <\/b>ausgeblendet und der aufrufende Code wird fortgesetzt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1488_006.png\" alt=\"Das automatisch generierte Formular\" width=\"349,5589\" height=\"331,6057\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Das automatisch generierte Formular<\/span><\/b><\/p>\n<p>Dieser stellt mit der Hilfsfunktion <b>IstFormularGeoeffnet <\/b>fest, dass das Formular noch ge&ouml;ffnet ist. Daraufhin liest sie den Prim&auml;rschl&uuml;sselwert des neu angelegten Datensatzes in die Variable <b>lngID <\/b>ein und schlie&szlig;t das Detailformular. Dann aktualisiert sie die Daten im Unterformular <b>sfmMitgliederUebersicht <\/b>mit der <b>Requery<\/b>-Methode und stellt den Datensatzzeiger des Recordsets des Unterformulars auf den neuen Datensatz ein.<\/p>\n<p>Wenn der Benutzer das aufgerufene Formular mit der Schaltfl&auml;che <b>cmdCancel <\/b>schlie&szlig;t, wird dieses mit <b>DoCmd.Close <\/b>direkt geschlossen. In diesem Fall sind keine Aktualisierungen im aufrufenden Formular n&ouml;tig.<\/p>\n<h2>Bearbeiten eines Datensatzes<\/h2>\n<p>Die Schaltfl&auml;che <b>cmdEdit <\/b>ruft ebenfalls das Formular <b>frmMitgliederDetails <\/b>auf (siehe Listing 4). Auch hier verwenden wir wieder eine Variable mit dem Namen des zu &ouml;ffnenden Formulars. Au&szlig;erdem ermitteln wir den Prim&auml;rschl&uuml;sselwert des aktuell im Unterformular <b>sfmMitgliederUebersicht <\/b>markierten Datensatzes und speichern diesen in der Variablen <b>lngID<\/b>. Ist dort aktuell kein Datensatz markiert, landet der Wert <b>0 <\/b>in der Variablen. Ob <b>lngID <\/b>den Wert <b>0 <\/b>enth&auml;lt, pr&uuml;ft die folgende <b>If&#8230;Then<\/b>-Bedingung. Nur wenn diese nicht den Wert <b>0 <\/b>enth&auml;lt, &ouml;ffnet die Prozedur das Formular <b>frmMitgliederDetails<\/b>. Wir verwenden wieder den Parameter <b>WindowMode:=acDialog<\/b>, um das Formular als modalen Dialog zu &ouml;ffnen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdEdit_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>lngID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strForm<span style=\"color:blue;\"> As String<\/span>\r\n     strForm = \"frmMitgliederDetails\"\r\n     lngID = Nz(Me!sfmMitgliederUebersicht.Form.MitgliedID, 0)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> lngEdit = 0<span style=\"color:blue;\"> Then<\/span>\r\n         DoCmd.OpenForm strForm, WindowMode:=acDialog, DataMode:=acFormEdit, WhereCondition:=\"MitgliedID = \" & lngID\r\n         <span style=\"color:blue;\">If <\/span>IstFormularGeoeffnet(strForm)<span style=\"color:blue;\"> Then<\/span>\r\n             DoCmd.Close acForm, strForm\r\n             Me!sfmMitgliederUebersicht.Form.Refresh\r\n         <span style=\"color:blue;\">End If<\/span>\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: Code zum Bearbeiten eines Datensatzes<\/span><\/b><\/p>\n<p>Diesmal legen wir als Datenmodus <b>acFormEdit <\/b>fest. Au&szlig;erdem &uuml;bergeben wir mit der <b>WhereCondition <\/b>den zu bearbeitenden Datensatz, sodass dieser wie in Bild 8 im Detailformular angezeigt wird.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1488_007.png\" alt=\"Bearbeiten eines Datensatzes\" width=\"549,559\" height=\"423,6003\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Bearbeiten eines Datensatzes<\/span><\/b><\/p>\n<p>Nach dem Bearbeiten klickt der Benutzer wieder entweder auf <b>cmdOK<\/b>, was dazu f&uuml;hrt, dass das Formular <b>frmMitgliederDetails <\/b>ausgeblendet wird und der aufrufende Code fortgesetzt wird. Dieser pr&uuml;ft, ob das Formular noch ge&ouml;ffnet ist, und schlie&szlig;t es in diesem Fall. Au&szlig;erdem wird das Unterformular mit <b>Refresh <\/b>aktualisiert.<\/p>\n<p>Warum diesmal mit <b>Refresh <\/b>und nicht mit <b>Requery<\/b>? Weil Requery die komplette Datenquelle aktualisiert und vor allem wieder den ersten Datensatz markiert. <b>Refresh<\/b> aktualisiert nur den aktuellen Datensatz und vor allem bleibt der Datensatzzeiger auf dem aktuellen Datensatz stehen.<\/p>\n<p>Auch hier geschieht nichts, wenn der Benutzer das Formular <b>frmMitgliederDetails <\/b>mit der Schaltfl&auml;che <b>cmdCancel <\/b>schlie&szlig;t, wodurch eventuell get&auml;tigte &Auml;nderungen verworfen werden.<\/p>\n<h2>L&ouml;schen eines Datensatzes<\/h2>\n<p>Wenn der Benutzer bei markiertem Datensatz im Unterformular die Schaltfl&auml;che <b>cmdDelete<\/b>, l&ouml;st er die Prozedur aus Listing 5 aus.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdDelete_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>lngID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngPosition<span style=\"color:blue;\"> As Long<\/span>\r\n     lngID = Nz(Me!sfmMitgliederUebersicht.Form.MitgliedID, 0)\r\n     lngPosition = Me!sfmMitgliederUebersicht.Form.Recordset.AbsolutePosition\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> lngID = 0<span style=\"color:blue;\"> Then<\/span>\r\n         If <span style=\"color:blue;\">MsgBox<\/span>(\"Soll der Datensatz wirklich gel&ouml;scht werden?\", vbOKCancel + vbExclamation, \"L&ouml;schbest&auml;tigung\") _\r\n                 = vbOK Then\r\n             CurrentDb.Execute \"DELETE FROM tblMitglieder WHERE MitgliedID = \" & lngID, dbFailOnError\r\n             Me!sfmMitgliederUebersicht.Form.Requery\r\n             <span style=\"color:blue;\">If <\/span>lngPosition &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                 Me!sfmMitgliederUebersicht.Form.Recordset.AbsolutePosition = lngPosition - 1\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\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: Code zum L&ouml;schen eines Datensatzes<\/span><\/b><\/p>\n<p>Diese merkt sich gleich zu Beginn zwei Informationen:<\/p>\n<ul>\n<li>den Prim&auml;rschl&uuml;sselwert des zu l&ouml;schenden Datensatzes in der Variablen <b>lngID <\/b>und<\/li>\n<li>dessen absolute Position im Recordset des Formulars mit der Variablen <b>lngAbsolutePosition<\/b>.<\/li>\n<\/ul>\n<p>Wenn <b>lngID <\/b>nicht <b>0 <\/b>ist, erscheint eine Meldung mit einer R&uuml;ckfrage, ob der Datensatz tats&auml;chlich gel&ouml;scht werden soll (siehe Bild 9). In diesem Fall l&ouml;scht die Prozedur den Datensatz mit der <b>DELETE<\/b>-Anweisung, die als Parameter der <b>Execute<\/b>-Methode der aktuellen Datenbank abgesetzt wird. Wurde nicht der erste Datensatz gel&ouml;scht, was einem Wert von <b>0 <\/b>f&uuml;r die Eigenschaft <b>AbsolutePosition <\/b>entspricht, stellt die Prozedur den Datensatzzeiger nun auf die Position des Datensatzes ein, der sich vor dem gel&ouml;schten Datensatz befindet.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1488_009.png\" alt=\"L&ouml;schen eines Datensatzes\" width=\"549,559\" height=\"306,8145\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: L&ouml;schen eines Datensatzes<\/span><\/b><\/p>\n<h2>Detailformular programmieren<\/h2>\n<p>Das Detailformular <b>frmMitgliederDetails <\/b>soll jeweils einen neuen, leeren oder einen vorhandenen Datensatz der Tabelle <b>tblMitglieder <\/b>anzeigen. Dazu stellen wir zuerst die Eigenschaft <b>Datensatzquelle <\/b>auf den Namen dieser Tabelle ein (siehe Bild 10). In dieser Abbildung sehen wir auch bereits die Steuerelemente, die wir aus der Feldliste in den Formularentwurf gezogen haben. Au&szlig;erdem haben wir hier die beiden Schaltfl&auml;chen <b>cmdOK <\/b>und <b>cmdCancel <\/b>angelegt. Diese beiden Schaltfl&auml;chen haben wir mit dem gleichen Design versehen wie die im anderen Formular.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1488_010.png\" alt=\"Entwurf des Formulars frmMitgliederDetails\" width=\"549,559\" height=\"360,9172\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Entwurf des Formulars frmMitgliederDetails<\/span><\/b><\/p>\n<p>Die Prozeduren hinter diesen Schaltfl&auml;chen sind recht einfach gehalten. Die Schaltfl&auml;che <b>cmdOK <\/b>blendet das Formular einfach aus. Auf diese Weise kann der Code, der dieses Formular als modalen Dialog aufgerufen hat, fortgesetzt werden und noch Informationen aus dem Formular auslesen, bevor er dieses schlie&szlig;t:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdOK_Click()\r\n     Me.Visible = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die <b>Abbrechen<\/b>-Schaltfl&auml;che <b>cmdCancel <\/b>setzt mit <b>Me.Undo <\/b>zuerst alle nicht gespeicherten &Auml;nderungen zur&uuml;ck und schlie&szlig;t das Formular dann mit <b>DoCmd.Close<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdCancel_Click()\r\n     Me.Undo\r\n     DoCmd.Close acForm, Me.Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Typische Elemente ausblenden<\/h2>\n<p>Im &Uuml;bersichtsformular <b>frmMitgliederUebersicht <\/b>haben wir Elemente wie die Navigationsschaltfl&auml;chen und den Datensatzmarkierer ausgeblendet. Dort war das sinnvoll, weil das Hauptformular ohnehin keine Datens&auml;tze anzeigt, durch die man navigieren k&ouml;nnte. Beim Formular <b>frmMitgliederDetails <\/b>sieht das anders aus. Hier k&ouml;nnten wir diese Elemente grunds&auml;tzlich durchaus gebrauchen. Allerdings soll das Formular immer nur den zu bearbeitenden oder einen neuen Datensatz anzeigen. Eigentlich ben&ouml;tigen wir diese Elemente also doch nicht. Deshalb stellen wir auch hier die Eigenschaften <b>Datensatzmarkierer<\/b>, <b>Navigationsschaltfl&auml;chen<\/b>, <b>Bildlaufleisten <\/b>und <b>Trennlinien <\/b>auf <b>Nein <\/b>und <b>Automatisch zentrieren <\/b>auf <b>Ja <\/b>ein.<\/p>\n<h2>OK per Eingabetaste<\/h2>\n<p>Damit der Benutzer die Funktion dieser beiden Schaltfl&auml;chen auch per Tastatur ausl&ouml;sen kann, nehmen wir noch Einstellungen an den Eigenschaften der Schaltfl&auml;chen vor. F&uuml;r die Schaltfl&auml;che <b>cmdOK <\/b>legen wir dazu f&uuml;r die Eigenschaft <b>Standard <\/b>den Wert <b>Ja <\/b>fest (siehe Bild 11). Dadurch wird die Ereignisprozedur dieser Schaltfl&auml;che ausgel&ouml;st, wenn der Benutzer die Eingabetaste bet&auml;tigt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1488_011.png\" alt=\"Einstellen der Schaltfl&auml;chen-Eigenschaften\" width=\"424,5589\" height=\"435,8804\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Einstellen der Schaltfl&auml;chen-Eigenschaften<\/span><\/b><\/p>\n<h2>Abbrechen per Escape-Taste<\/h2>\n<p>Auf die gleiche Weise stellen wir die Eigenschaft <b>Abbrechen <\/b>f&uuml;r die Schaltfl&auml;che <b>cmdCancel <\/b>auf den Wert <b>True <\/b>ein. Damit k&ouml;nnen wir mit der <b>Escape<\/b>-Taste die Ereignisprozedur <b>cmdCancel_Click <\/b>ausl&ouml;sen.<\/p>\n<h2>Anzeigen anderer Datens&auml;tze verhindern<\/h2>\n<p>Standardm&auml;&szlig;ig kann man in einem Formular wie frmMitgliederDetails mit den Navigationsschaltfl&auml;chen zum ersten, zum vorherigen, zum n&auml;chsten oder zum letzten Datensatz der Datensatzquelle wechseln &#8211; oder auch zu einem neuen, leeren Datensatz.<\/p>\n<p>Beim &Ouml;ffnen des Formulars zum Anlegen eines neuen Datensatzes enth&auml;lt die Datenquelle des Formulars nur den neuen Datensatz, beim &Ouml;ffnen zum Bearbeiten eines Datensatzes nur den zu bearbeitenden Datensatz. Wir k&ouml;nnen jedoch beim Bearbeiten eines vorhandenen Datensatzes oder nach der Eingabe der ersten Daten f&uuml;r einen neuen Datensatz durch wiederholtes Bet&auml;tigen der Tab- oder Eingabetaste alle Steuerelemente durchlaufen und w&uuml;rden nach dem letzten Steuerelement der Aktivierreihenfolge in einem neuen, leeren Datensatz landen.<\/p>\n<p>Um das zu verhindern, stellen wir die Eigenschaft <b>Zyklus <\/b>auf <b>Aktueller Datensatz <\/b>ein. Auf diese Weise landet der Fokus nach dem Verlassen des letzten Steuerelements der Aktiviereihenfolge wieder beim ersten Steuerelement, ohne den Datensatz zu verlassen.<\/p>\n<h2>OK-Schaltfl&auml;che nur nach &Auml;nderung aktivieren<\/h2>\n<p>Der Benutzer kann das Formular <b>frmMitgliederDetails <\/b>nun zum Anlegen eines neuen Datensatzes &ouml;ffnen. Wenn er ohne das Anlegen eines Datensatzes auf die <b>OK<\/b>-Schaltfl&auml;che klickt, wird das Formular ausgeblendet, die aufrufende Prozedur des Formulars <b>frmMitgliederUebersicht <\/b>erzeugt dann aber einen Fehler in der Zeile, welche die ID des neuen Datensatzes ermitteln soll:<\/p>\n<pre>lngID = Forms(strForm)!MitgliedID<\/pre>\n<p>Solche Fehler wollen wir verhindern. Das gelingt am einfachsten, wenn wir die Zeile wie folgt &auml;ndern:<\/p>\n<pre>lngID = Nz(Forms(strForm)!MitgliedID, 0)<\/pre>\n<p>Eleganter w&auml;re es aber, wenn wir die <b>OK<\/b>-Schaltfl&auml;che <b>cmdOK <\/b>&uuml;berhaupt erst aktivieren, wenn der Benutzer &Auml;nderungen an dem neuen oder dem zu bearbeitenden Datensatz vorgenommen hat. Dazu stellen wir zun&auml;chst die Eigenschaft <b>Aktiviert <\/b>dieser Schaltfl&auml;che auf den Wert <b>Nein <\/b>ein. Rufen wir das Formular nun zum Bearbeiten eines vorhandenen oder neuen Datensatzes auf, ist die <b>OK<\/b>-Schaltfl&auml;che zun&auml;chst deaktiviert (siehe Bild 12).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1488_012.png\" alt=\"Formular mit deaktivierter OK-Schaltfl&auml;che\" width=\"349,5589\" height=\"331,6057\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Formular mit deaktivierter OK-Schaltfl&auml;che<\/span><\/b><\/p>\n<p>Nun m&uuml;ssen wir nur noch daf&uuml;r sorgen, dass die Schaltfl&auml;che aktiviert wird, wenn der Benutzer eine &Auml;nderung durchgef&uuml;hrt hat. Dies registrieren wir &uuml;ber die Ereigniseigenschaft <b>Bei Ge&auml;ndert<\/b>, f&uuml;r die wir die folgende Ereignisprozedur hinterlegen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Dirty(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Me!cmdOK.Enabled = <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Theoretisch k&ouml;nnten wir auch noch daf&uuml;r sorgen, dass die Schaltfl&auml;che wieder deaktiviert wird, wenn der Benutzer die &Auml;nderung mit der <b>Escape<\/b>-Taste r&uuml;ckg&auml;ngig macht. Dazu w&uuml;rden wir die folgende Prozedur nutzen, die wir f&uuml;r das Ereignis <b>Bei R&uuml;ckg&auml;ngig <\/b>hinterlegen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Undo(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Me!cmdOK.Enabled = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese wird auch ausgel&ouml;st, allerdings hat das keine Auswirkung mehr, denn mit der <b>Escape<\/b>-Taste feuert auch die Prozedur <b>cmdCancel_Click<\/b>, was die &Auml;nderungen zur&uuml;cksetzt und das Formular schlie&szlig;t.<\/p>\n<h2>Daten beim Schlie&szlig;en des Formulars speichern<\/h2>\n<p>Normalerweise speichert Access einen Datensatz, wenn dieser mit einem Formular eingegeben wurde und man das Formular dann schlie&szlig;t. Es gibt jedoch Bedingungen, unter denen dies misslingt. Der Datensatz wird dann einfach nicht gespeichert. Die Gr&uuml;nde daf&uuml;r erl&auml;utern wir im Beitrag <b>Formulare: Datensatz wird nicht gespeichert <\/b>(<b>www.access-im-unternehmen.de\/1489<\/b>). <\/p>\n<p>Der &uuml;bliche Grund f&uuml;r dieses Verhalten ist, dass es Restriktionen im Datenmodell gibt, die das Speichern des Datensatzes verhindern. Wenn wir zum Beispiel die Eigenschaft <b>Eingabe erforderlich <\/b>f&uuml;r das Feld <b>Vorname <\/b>auf <b>Ja <\/b>einstellen, kann ein Datensatz nur gespeichert werden, wenn dieses Feld einen Wert enth&auml;lt, also nicht Null ist. Beim Schlie&szlig;en des Formulars &uuml;ber die Schaltfl&auml;che <b>cmdOK <\/b>verwirft Access aber &Auml;nderungen an Datens&auml;tzen einfach, wenn Restriktionen im Datenmodell das Speichern verhindern. <\/p>\n<p>Um dies zu unterbinden, m&uuml;ssen wir den Datensatz vor dem Schlie&szlig;en des Formulars manuell per Code speichern. Dazu erg&auml;nzen wir die Prozedur <b>cmdOK_Click <\/b>wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdOK_Click()\r\n     RunCommand acCmdSaveRecord\r\n     Me.Visible = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wir rufen also den Befehl zum Speichern des Datensatzes auf. Wenn wir nun einen neuen Datensatz anlegen, erhalten wir immerhin eine entsprechende Fehlermeldung (siehe Bild 13).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1488_013.png\" alt=\"Fehler beim Speichern eines Datensatzes ohne Erf&uuml;llen aller Restriktionen\" width=\"599,559\" height=\"327,361\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Fehler beim Speichern eines Datensatzes ohne Erf&uuml;llen aller Restriktionen<\/span><\/b><\/p>\n<p>Auch ohne eine umfangreiche Validierung zum Formular hinzuf&uuml;gen zu wollen: Die Restriktionen des Datenmodells m&uuml;ssen wir einhalten und wir wollen den Benutzer auch nicht mit scheinbar grundlos nicht gespeicherten neuen Datens&auml;tzen verwirren. Also f&uuml;gen wir noch ein paar Zeilen Code hinzu, damit der Benutzer die Eingabe des Datensatzes korrekt abschlie&szlig;en kann. Diesen erl&auml;utern wir in dem oben genannten Beitrag, aber der Vollst&auml;ndigkeit halber nochmal die Prozedur f&uuml;r das Ereignis <b>Beim Klicken <\/b>der Schaltfl&auml;che <b>cmdOK<\/b> (siehe Listing 6).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdOK_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>lngErrorNumber<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strErrorDescription<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strField<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Control\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     RunCommand acCmdSaveRecord\r\n     lngErrorNumber = Err.Number\r\n     strErrorDescription = Err.Description\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     Select Case lngErrorNumber\r\n         <span style=\"color:blue;\">Case <\/span>3314, 3316\r\n             <span style=\"color:blue;\">MsgBox<\/span> strErrorDescription, vbExclamation + vbOKOnly, \"Fehlende Eingabe\"\r\n             strField = GetFieldFromErrorDescription(strErrorDescription)\r\n             <span style=\"color:blue;\">Set<\/span> ctl = GetBoundControlForField(Me, strField)\r\n             ctl.SetFocus\r\n         <span style=\"color:blue;\">Case <\/span>0\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> strErrorDescription, vbExclamation + vbOKOnly, \"Fehler \" & lngErrorNumber\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">If <\/span>lngErrorNumber = 0<span style=\"color:blue;\"> Then<\/span>\r\n         DoCmd.Close acForm, Me.Name\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 6: Verhindern, dass der Datensatz bei Verletzungen der Restriktionen nicht gespeichert wird<\/span><\/b><\/p>\n<p>Hier speichern wir mit <b>RunCommand acCmdSaveRecord <\/b>den aktuellen Datensatz, was bei Verletzen einer Restriktion zu einem Fehler f&uuml;hrt. Bei Feldern, die nicht leer sein d&uuml;rfen, aber leer sind, wird der Fehler mit der Nummer <b>3314 <\/b>ausgel&ouml;st, bei Verletzen der G&uuml;ltigkeitsregeln auf Tabellenebene der Fehler <b>3316<\/b>.<\/p>\n<p>In beiden F&auml;llen nutzen wir zwei im oben genannten Beitrag vorgestellte Hilfsfunktionen aus, welche aus der Fehlermeldung das Feld ermitteln, dessen Restriktion verletzt wurde und das Steuerelement suchen, das an dieses Feld gebunden ist &#8211; auf diese Weise k&ouml;nnen wir dieses Steuerelement nach dem Anzeigen der Fehlermeldung direkt selektieren.<\/p>\n<p>Nur wenn kein Fehler ausgel&ouml;st wurde und die Variable <b>lngErrorNumber <\/b>den Wert <b>0 <\/b>aufweist, wird das Formular geschlossen.<\/p>\n<h2>Anpassen der Suchfunktion<\/h2>\n<p>Die Suchfunktion haben wir so gestaltet, wie wir sie f&uuml;r funktional halten: Man gibt einen Suchbegriff ein, der in allen Feldern mit Textinhalten gesucht wird, und zwar als Bestandteil des Textes. Der gesuchte Text kann also an beliebiger Stelle innerhalb der Felder eines Datensatzes vorkommen.<\/p>\n<p>Hier gibt es noch Varianten:<\/p>\n<ul>\n<li>Man kann f&uuml;r jedes Feld des Unterformulars ein eigenes Suchfeld anlegen, dass nur das entsprechende Feld des Formulars durchsucht.<\/li>\n<li>Oder man f&uuml;gt einige Kontrollk&auml;stchen hinzu, mit denen man angeben kann, welche der Felder des Unterformulars nach dem Suchbegriff gefiltert werden sollen.<\/li>\n<li>Man k&ouml;nnte auch noch weitere Suchfelder hinzuf&uuml;gen, sodass der Benutzer mehrere Suchbegriffe eingeben kann. Das Suchergebnis w&uuml;rde dann alle Datens&auml;tze enthalten, in denen alle der angegebenen Suchbegriffe vorkommen.<\/li>\n<\/ul>\n<p>Davon abgesehen werden die Daten im Unterformular in der Datenblattansicht angezeigt, die ihrerseits einige M&ouml;glichkeiten zum Filtern anbietet (siehe Bild 14).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_02\/pic_1488_014.png\" alt=\"Eingebaute Such- und Sortierm&ouml;glichkeiten im Unterformular in der Datenblattansicht\" width=\"599,559\" height=\"410,3175\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Eingebaute Such- und Sortierm&ouml;glichkeiten im Unterformular in der Datenblattansicht<\/span><\/b><\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Beitrag zeigt, wie wir die Daten einer Tabelle in einen &Uuml;bersichtsformular anzeigen, von dem aus ein Detailformular mit dem ausgew&auml;hlten Datensatz ge&ouml;ffnet werden kann.<\/p>\n<p>Das ist die Grundlage f&uuml;r weitere Konstellationen: Wir k&ouml;nnten beispielsweise die Daten einer Tabelle mit Bestellungen hinzuziehen, die wir im Detailformular der Kunden als Unterformular einsetzen. Dieses Formular w&uuml;rde dann die Liste der Bestellungen des Kunden anzeigen und ebenfalls Schaltfl&auml;chen zum Anlegen, Bearbeiten von L&ouml;schen von Bestellungen enthalten. Ein Doppelklick auf eine Bestellung k&ouml;nnte dann ein weiteres Formular &ouml;ffnen, das wiederum die Bestelldetails im Unterformular anzeigt.<\/p>\n<p>In einem weiteren Beitrag namens <b>Formular und Unterformular mit Daten per Mausklick <\/b>(<b>www.access-im-unternehmen.de\/1487<\/b>) zeigen wir, wie man die in diesem Beitrag vorgestellte Konstellation aus &Uuml;bersichts- und Detailformular komplett per Code erstellen kann.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>DatenInUebersichtUndDetailAnzeigen.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/B8E144E1-6617-4016-A9C3-56DBCB0B584A\/aiu_1488.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Eine gute Basis f&uuml;r das Anzeigen und Bearbeiten von Daten ist die folgende Konstellation: Wir verwenden ein Haupt- und Unterformular, um die Daten einer Tabelle in einer &Uuml;bersichtsansicht anzuzeigen. Dabei k&ouml;nnen wir die Daten, die im Unterformular angezeigt werden, filtern und sortieren. Au&szlig;erdem stellen wir Schaltfl&auml;chen bereit, mit denen wir die Datens&auml;tze anlegen, bearbeiten und l&ouml;schen k&ouml;nnen. Zum Bearbeiten verwenden wir ein weiteres Formular, das die Daten in einer &uuml;bersichtlichen Ansicht darstellt. Zus&auml;tzlich f&uuml;gen wir noch ein den Code hinzu, der f&uuml;r das Interagieren der Formulare untereinander notwendig ist. Diese Konstellation von Formularen k&ouml;nnen wir f&uuml;r alle m&ouml;glichen Tabellen verwenden und schaffen so die Basis einer professionellen Anwendung. Anpassungen k&ouml;nnen schlie&szlig;lich dort vorgenommen werden, wo m:n- oder 1:n-Beziehungen dargestellt werden sollen.<\/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":[66022024,662024,44000023],"tags":[],"class_list":["post-55001488","post","type-post","status-publish","format-standard","hentry","category-66022024","category-662024","category-Mit_Formularen_arbeiten"],"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>Tabellendaten mit &Uuml;bersicht und Details anzeigen - 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\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tabellendaten mit &Uuml;bersicht und Details anzeigen\" \/>\n<meta property=\"og:description\" content=\"Eine gute Basis f&uuml;r das Anzeigen und Bearbeiten von Daten ist die folgende Konstellation: Wir verwenden ein Haupt- und Unterformular, um die Daten einer Tabelle in einer &Uuml;bersichtsansicht anzuzeigen. Dabei k&ouml;nnen wir die Daten, die im Unterformular angezeigt werden, filtern und sortieren. Au&szlig;erdem stellen wir Schaltfl&auml;chen bereit, mit denen wir die Datens&auml;tze anlegen, bearbeiten und l&ouml;schen k&ouml;nnen. Zum Bearbeiten verwenden wir ein weiteres Formular, das die Daten in einer &uuml;bersichtlichen Ansicht darstellt. Zus&auml;tzlich f&uuml;gen wir noch ein den Code hinzu, der f&uuml;r das Interagieren der Formulare untereinander notwendig ist. Diese Konstellation von Formularen k&ouml;nnen wir f&uuml;r alle m&ouml;glichen Tabellen verwenden und schaffen so die Basis einer professionellen Anwendung. Anpassungen k&ouml;nnen schlie&szlig;lich dort vorgenommen werden, wo m:n- oder 1:n-Beziehungen dargestellt werden sollen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2024-02-29T18:39:25+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg02.met.vgwort.de\/na\/79ab84f4efda47dabab1b1c839ff40be\" \/>\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=\"22\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Tabellendaten mit &Uuml;bersicht und Details anzeigen\",\"datePublished\":\"2024-02-29T18:39:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\\\/\"},\"wordCount\":3933,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/79ab84f4efda47dabab1b1c839ff40be\",\"articleSection\":[\"2\\\/2024\",\"2024\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\\\/\",\"name\":\"Tabellendaten mit &Uuml;bersicht und Details anzeigen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/79ab84f4efda47dabab1b1c839ff40be\",\"datePublished\":\"2024-02-29T18:39:25+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/79ab84f4efda47dabab1b1c839ff40be\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/79ab84f4efda47dabab1b1c839ff40be\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tabellendaten mit &Uuml;bersicht und Details anzeigen\"}]},{\"@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":"Tabellendaten mit &Uuml;bersicht und Details anzeigen - 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\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\/","og_locale":"de_DE","og_type":"article","og_title":"Tabellendaten mit &Uuml;bersicht und Details anzeigen","og_description":"Eine gute Basis f&uuml;r das Anzeigen und Bearbeiten von Daten ist die folgende Konstellation: Wir verwenden ein Haupt- und Unterformular, um die Daten einer Tabelle in einer &Uuml;bersichtsansicht anzuzeigen. Dabei k&ouml;nnen wir die Daten, die im Unterformular angezeigt werden, filtern und sortieren. Au&szlig;erdem stellen wir Schaltfl&auml;chen bereit, mit denen wir die Datens&auml;tze anlegen, bearbeiten und l&ouml;schen k&ouml;nnen. Zum Bearbeiten verwenden wir ein weiteres Formular, das die Daten in einer &uuml;bersichtlichen Ansicht darstellt. Zus&auml;tzlich f&uuml;gen wir noch ein den Code hinzu, der f&uuml;r das Interagieren der Formulare untereinander notwendig ist. Diese Konstellation von Formularen k&ouml;nnen wir f&uuml;r alle m&ouml;glichen Tabellen verwenden und schaffen so die Basis einer professionellen Anwendung. Anpassungen k&ouml;nnen schlie&szlig;lich dort vorgenommen werden, wo m:n- oder 1:n-Beziehungen dargestellt werden sollen.","og_url":"https:\/\/access-im-unternehmen.de\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\/","og_site_name":"Access im Unternehmen","article_published_time":"2024-02-29T18:39:25+00:00","og_image":[{"url":"http:\/\/vg02.met.vgwort.de\/na\/79ab84f4efda47dabab1b1c839ff40be","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"22\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Tabellendaten mit &Uuml;bersicht und Details anzeigen","datePublished":"2024-02-29T18:39:25+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\/"},"wordCount":3933,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/79ab84f4efda47dabab1b1c839ff40be","articleSection":["2\/2024","2024","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\/","url":"https:\/\/access-im-unternehmen.de\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\/","name":"Tabellendaten mit &Uuml;bersicht und Details anzeigen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/79ab84f4efda47dabab1b1c839ff40be","datePublished":"2024-02-29T18:39:25+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\/#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/79ab84f4efda47dabab1b1c839ff40be","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/79ab84f4efda47dabab1b1c839ff40be"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Tabellendaten_mit_Uebersicht_und_Details_anzeigen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Tabellendaten mit &Uuml;bersicht und Details anzeigen"}]},{"@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\/55001488","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=55001488"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001488\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001488"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001488"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001488"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}