{"id":55001010,"date":"2015-12-01T00:00:00","date_gmt":"2020-05-22T19:08:40","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1010"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Mehrere_Datensaetze_pro_Spalte_in_Formularen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\/","title":{"rendered":"Mehrere Datens&auml;tze pro Spalte in Formularen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/61556b8eb2c24e5792d94333b00f35f3\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>&uuml;blicherweise landen in einem Access-Formular entweder die Details eines Datensatzes oder mehrere Datens&auml;tze. Erstere k&ouml;nnen &uuml;ber das Formular verteilt werden, Letztere erscheinen untereinander in der Datenblattansicht oder der Endlosansicht. Mit einigen Unterformular-Steuerelementen lassen sich jedoch auch mehrere Datens&auml;tze nebeneinander anzeigen. Dieser Beitrag zeigt die Grundlagen zur Anzeige mehrerer Datens&auml;tze in einer Matrix von Unterformularen.<\/b><\/p>\n<p>Grundlage f&uuml;r die Anzeige mehrerer Datens&auml;tze nebeneinander ist, dass Sie f&uuml;r jeden Datensatz ein Unterformular anlegen und diese dann nebeneinander anordnen. Die Datenherk&uuml;nfte der Unterformulare m&uuml;ssen Sie dann noch so gestalten, dass diese jeweils den gew&uuml;nschten Datensatz anzeigen. Wenn Sie also beispielsweise drei Kundendatens&auml;tze nebeneinander anzeigen wollen, m&uuml;ssten Sie dem ersten Unterformular den ersten Datensatz der Datenherkunft , dem zweiten den zweiten Datensatz und so weiter zuweisen.<\/p>\n<p>Das Bl&auml;ttern in solchen Daten ist nat&uuml;rlich nicht mehr &uuml;ber die Bildlaufleiste m&ouml;glich &#8211; dazu m&uuml;ssten Sie sich mit eigenen Steuerelementen wie etwa einer <b>Nach oben<\/b>&#8211; oder <b>Nach unten<\/b>-Schaltfl&auml;che behelfen. Nat&uuml;rlich k&ouml;nnte man auch die herk&ouml;mmliche Bildlaufleiste nutzen, aber dann m&uuml;sste das Formular so viele Unterformulare enthalten, dass alle Datens&auml;tze der Datenherkunft angezeigt werden k&ouml;nnen.<\/p>\n<p>Mit steigender Datensatzanzahl sinkt hier die Performance, und auch die Anzahl der Unterformularsteuerelemente ist nat&uuml;rlich begrenzt. Also wollen wir es lieber bei einer vordefinierten Anzahl belassen und eigene Schaltfl&auml;chen zum Bl&auml;ttern zwischen den Datens&auml;tzen verwenden. Das Ergebnis soll in der Rohfassung wie in Bild 1 aussehen. Das Hauptformular legen Sie als einfaches Formular mit der Bezeichnung <b>frmKundenNebeneinander <\/b>an und speichern dieses. <\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_06\/pic_1010_001.png\" alt=\"Unterformulare in mehreren Spalten zur Anzeige von Daten\" width=\"700\" height=\"317,9364\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Unterformulare in mehreren Spalten zur Anzeige von Daten<\/span><\/b><\/p>\n<h2>Unterformulare hinzuf&uuml;gen<\/h2>\n<p>Im folgenden Beispiel wollen wir zw&ouml;lf Unterformulare in drei Spalten und vier Zeilen anordnen. Die Unterformulare sollen die Bezeichnungen <b>sfm01<\/b>, <b>smf02 <\/b>und so weiter erhalten. Damit die Unterformulare korrekt positioniert und mit den richtigen Abmessungen ausgestattet werden, wollen wir diese mit einem kleinen Skript zum Hauptformular hinzuf&uuml;gen.<\/p>\n<p>Dieses sieht wie in Listing 1 aus und ist in der Beispieldatenbank im Modul <b>mdlTools <\/b>zu finden. Die Prozedur erwartet einige Parameter, welche den Namen des mit Unterformularen auszustattenden Formulars sowie die Abmessungen f&uuml;r die Unterformularsteuerelemente enthalten. Dabei liefern <b>intX <\/b>und <b>intY <\/b>zun&auml;chst die Anzahl der anzulegenden Unterformulare je Zeile und Spalte. <b>lngBreite <\/b>und <b>lngHoehe <\/b>enthalten die Abmessungen, <b>lngAbstand-X <\/b>und <b>lngAbstandY <\/b>den Abstand der Unterformulare untereinander und zum linken und oberen Rand des Formulars. Schlie&szlig;lich legen Sie mit <b>strSubform<\/b>, soweit gew&uuml;nscht, noch den Wert der Eigenschaft <b>Herkunftsobjekt <\/b>(VBA: <b>SourceObject<\/b>) fest.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>UnterformulareAnlegen(strForm<span style=\"color:blue;\"> As String<\/span>, intX<span style=\"color:blue;\"> As Integer<\/span>, intY<span style=\"color:blue;\"> As Integer<\/span>, lngBreite<span style=\"color:blue;\"> As Long<\/span>, _\r\n         lngHoehe<span style=\"color:blue;\"> As Long<\/span>, lngAbstandX<span style=\"color:blue;\"> As Long<\/span>, lngAbstandY<span style=\"color:blue;\"> As Long<\/span>, <span style=\"color:blue;\">Optional<\/span> strSubform<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>frm<span style=\"color:blue;\"> As <\/span>Form\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Control\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>x<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>y<span style=\"color:blue;\"> As Integer<\/span>\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     DoCmd.Close acForm, strForm\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     DoCmd.OpenForm strForm, acDesign\r\n     <span style=\"color:blue;\">Set<\/span> frm = Forms(strForm)\r\n     For i = frm.Controls.Count - 1 To 0 Step -1\r\n         <span style=\"color:blue;\">Set<\/span> ctl = frm.Controls(i)\r\n         Select Case ctl.ControlType\r\n             <span style=\"color:blue;\">Case <\/span>acLabel, acSubform\r\n                 DeleteControl frm.Name, ctl.Name\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     i = 0\r\n     For y = 1 To intY\r\n         For x = 1 To intX\r\n             i = i + 1\r\n             <span style=\"color:blue;\">Set<\/span> ctl = CreateControl(frm.Name, acSubform, acDetail, , , lngAbstandX + (lngAbstandX + lngBreite) _\r\n                 * (x - 1), lngAbstandY + (lngAbstandX + lngHoehe) * (y - 1), lngBreite, lngHoehe)\r\n             ctl.Name = \"sfm\" & Format(i, \"00\")\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strSubform) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                 ctl.SourceObject = strSubform\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Next<\/span> x\r\n     <span style=\"color:blue;\">Next<\/span> y\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Hinzuf&uuml;gen der Unterformulare zum Hauptformular<\/span><\/b><\/p>\n<p>F&uuml;r die Konstellation in der Beispieldatenbank haben wir den folgenden Aufruf der Prozedur zusammengestellt:<\/p>\n<pre>UnterformulareAnlegen \"frmKundenNebeneinander\", 3, 4, 4000, 3000, 100, 100, \"sfmKundenNebeneinander\"<\/pre>\n<p>Damit legt diese 3 x 4 Unterformularsteuerelemente an und f&uuml;llt diese gleich mit dem Unterformular <b>sfmKundenNebeneinander<\/b>. Die Prozedur schlie&szlig;t zun&auml;chst das mit <b>strForm <\/b>&uuml;bergebene Formular, sofern dieses noch ge&ouml;ffnet ist, und &ouml;ffnet es erneut, diesmal in der Entwurfsansicht. Dann speichert es einen Verweis auf das Formular in der Variablen <b>frm<\/b>.<\/p>\n<p>In einer <b>For&#8230;Next<\/b>-Schleife &uuml;ber alle im Formular enthaltenen Steuerelemente l&ouml;scht sie dann alle bereits vorhandenen Unterformulare. Sie sollten die Routine also nicht f&uuml;r Formulare nutzen, die bereits f&uuml;r andere Zwecke vorgesehene Unterformulare enthalten, oder aber eine Pr&uuml;fung einbauen, welche nur die in vorherigen Aufrufen angelegte Unterformularsteuerelemente l&ouml;scht. Zum L&ouml;schen der Steuerelemente verwendet die Routine die <b>DeleteControl<\/b>-Methode, die den Namen des Formulars und des zu l&ouml;schenden Steuerelements enth&auml;lt.<\/p>\n<p>Danach durchl&auml;uft die Prozedur zwei verschachtelte <b>For&#8230;Next<\/b>-Schleifen &uuml;ber die Werte von <b>1 <\/b>bis <b>intY <\/b>beziehungsweise <b>1 <\/b>bis <b>intX<\/b>. In der Schleife erh&ouml;ht sie den Wert der Variablen <b>i<\/b>, die zuvor auf <b>0 <\/b>eingestellt wurde, um <b>1<\/b>. <b>i <\/b>soll die Nummer f&uuml;r den Steuerelementnamen (<b>sfm01<\/b>, <b>sfm02 <\/b>und so weiter) liefern. Nun folgt die Methode <b>CreateControl<\/b>, welche das eigentliche Steuerelement erstellt. Sie erwartet den Namen des Zielformulars, den Typ des zu erstellenden Steuerelements, den Zielbereich (hier den Detailbereich) sowie die Koordinaten und Abmessungen.<\/p>\n<p>Die Abmessungen entnimmt die Routine den Parametern <b>intHoehe <\/b>und <b>intBreite<\/b>, die Koordinaten werden f&uuml;r jedes Steuerelement neu berechnet. Der Abstand vom linken Formularrand stammt dabei aus der Formel <b>lngAbstandX + (lngAbstandX + lngBreite) * (x &#8211; 1)<\/b>. Im ersten Durchlauf ist <b>x = 0<\/b>, also ist der Abstand der mit <b>lngAbstandX <\/b>&uuml;bergebene Wert. F&uuml;r die folgenden Elemente, die nat&uuml;rlich rechts neben dem jeweils zuvor platzierten Element landen sollen, ermittelt die Routine die Position aus dem Abstand des ersten Elements vom linken Rand plus dem Produkt der Breite eines Elements plus dem einfachen Abstand und dem Index des Steuerelements. Auf die gleiche Art berechnet die Routine den Abstand vom oberen Formularrand.<\/p>\n<p>Die Variable <b>ctl <\/b>speichert den Verweis auf das soeben erstellte Steuerelement. Damit weist die Routine noch den Namen f&uuml;r das Steuerelement zu. Wenn <b>strSubform <\/b>den Namen des Unterformulars enth&auml;lt, der im Unterformularsteuerelement angezeigt werden soll, weist die Prozedur diesen der Eigenschaft <b>SourceObject <\/b>des Unterformularsteuerelements zu. Diesen Vorgang wiederholt die Prozedur, bis alle Zeilen und Spalten in den <b>For&#8230;Next<\/b>-Schleifen durchlaufen wurden. Das Ergebnis sieht zu diesem Zeitpunkt etwa wie in Bild 2 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_06\/pic_1010_002.png\" alt=\"Frisch angelegte Unterformulare in der Entwurfsansicht\" width=\"700\" height=\"406,5776\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Frisch angelegte Unterformulare in der Entwurfsansicht<\/span><\/b><\/p>\n<h2>Unterformular anlegen<\/h2>\n<p>Schlie&szlig;lich ben&ouml;tigen wir auch noch das Unterformular, das in den Unterformularsteuerelementen des Hauptformulars erscheinen und die verschiedenen Datens&auml;tze anzeigen soll. Die Herkunftstabelle hei&szlig;t <b>tblKunden <\/b>und liefert einige Felder, die wir wie in Bild 3 im Unterformular <b>sfmKundenNebeneinander <\/b>anorden. Au&szlig;erdem legen wir dort schon einmal eine Schaltfl&auml;che namens <b>cmdLoeschen<\/b> an, die sp&auml;ter das L&ouml;schen des im Unterformular angezeigten Datensatzes erlauben soll.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_06\/pic_1010_003.png\" alt=\"Das Unterformular der Beispielanwendung\" width=\"425\" height=\"315,1914\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Das Unterformular der Beispielanwendung<\/span><\/b><\/p>\n<p>Wenn Sie nun das Hauptformular in der Formularansicht &ouml;ffnen, zeigt dieses f&uuml;r jedes Unterformular den gleichen Datensatz an (s. Bild 4). Kein Wunder: Das Unterformular ist ja in allen F&auml;llen genau gleich aufgebaut und zeigt dementsprechend auch die gleichen Daten an &#8211; zumindest, bis wir gleich mit einigen Zeilen Code eingreifen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_06\/pic_1010_004.png\" alt=\"Gleicher Datensatz in allen Unterformularen\" width=\"500\" height=\"387,5\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Gleicher Datensatz in allen Unterformularen<\/span><\/b><\/p>\n<h2>Unterformulare mit verschiedenen Datens&auml;tzen f&uuml;llen<\/h2>\n<p>Die Unterformulare f&uuml;llen wir gleich beim &ouml;ffnen des Hauptformulars, und zwar in der Ereignisprozedur, die durch das Ereignis <b>Beim Laden <\/b>ausgel&ouml;st wird (s. Listing 2). Diese Prozedur verwendet bereits einige Variablen, die wir modulweit im Kopf des Klassenmoduls <b>Form_frmKundenNebeneinander <\/b>deklarieren:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Dim <\/span>intElemente<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>j<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM tblKunden\", dbOpenDynaset)\r\n     intStartdatensatz = 1\r\n     UnterformulareFuellen intElemente\r\n     Me!cmdNachUnten.Enabled = <span style=\"color:blue;\">Not<\/span> (intStartdatensatz + intElemente - 1 &gt;= rst.RecordCount)\r\n     Me!cmdNachOben.Enabled = <span style=\"color:blue;\">Not<\/span> intStartdatensatz = 1\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 2: F&uuml;llen der Unterformulare mit den gew&uuml;nschten Datens&auml;tzen<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n<span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n<span style=\"color:blue;\">Dim <\/span>intStartdatensatz<span style=\"color:blue;\"> As Integer<\/span><\/pre>\n<p>Die Prozedur f&uuml;llt die Variable <b>db <\/b>mit einem Verweis auf das aktuelle <b>Database<\/b>-Objekt. Die Recordset-Variable <b>rst <\/b>f&uuml;llt die Prozedur mit den Daten der Tabelle <b>tblKunden<\/b>.<\/p>\n<p>Mit der Variablen <b>intElemente <\/b>als Parameter ruft die Prozedur damit die Routine <b>UnterformulareFuellen <\/b>auf. Diese ist letztlich daf&uuml;r verantwortlich, in den Unterformularen den richtigen Datensatz anzuzeigen. Da wir sp&auml;ter mit dem Formular durch die Kundendatens&auml;tze bl&auml;ttern wollen, ben&ouml;tigen wir noch die aktuelle Position. Dazu tragen wir den Wert <b>1 <\/b>in die Variable <b>intStartdatensatz <\/b>ein, was bedeutet, dass das erste Unterformular den ersten Datensatz der Datenherkunft anzeigt. Schlie&szlig;lich soll das Formular zwei Schaltfl&auml;chen namens <b>cmdNachOben <\/b>und <b>cmdNachUnten <\/b>enthalten, mit denen der Benutzer zu den vorherigen beziehungsweise n&auml;chsten Datens&auml;tzen bl&auml;ttern kann, sowie eine Schaltfl&auml;che zum Anlegen eines neuen Datensatzes (<b>cmdNeu<\/b>) &#8211; s. Bild 5.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_06\/pic_1010_005.png\" alt=\"Schaltfl&auml;chen zum Bl&auml;ttern nach oben und unten und zum Anlegen eines neuen Datensatzes\" width=\"700\" height=\"130,4734\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Schaltfl&auml;chen zum Bl&auml;ttern nach oben und unten und zum Anlegen eines neuen Datensatzes<\/span><\/b><\/p>\n<p>Wenn das Formular gerade die ersten Datens&auml;tze anzeigt, soll die Schaltfl&auml;che <b>cmdNachOben <\/b>nat&uuml;rlich deaktiviert sein, das Gleiche gilt f&uuml;r die Schaltfl&auml;che <b>cmdNachUnten <\/b>auf der letzten Seite. Dies erledigen die letzten beiden Anweisungen der Prozedur. Die Bedingung f&uuml;r das Deaktivieren der Schaltfl&auml;che <b>cmdNachUnten <\/b>lautet <b>Not (intStartdatensatz + intElemente &#8211; 1 >= rst.RecordCount)<\/b>. Der Startdatensatz (in diesem Fall <b>1<\/b>) plus der Anzahl der angezeigten Datens&auml;tze (von der Prozedur <b>UnterformulareFuellen <\/b>mit dem Parameter <b>intElemente <\/b>zur&uuml;ckgeliefert) minus <b>1 <\/b>soll nicht gr&ouml;&szlig;er oder gleich der Anzahl der Datens&auml;tze der Datenherkunft sein. Die <b>Nach oben<\/b>-Schaltfl&auml;che wird immer aktiviert, wenn der Startdatensatz nicht der erste ist (<b>intStartdatensatz = 1<\/b>).<\/p>\n<h2>Unterformulare f&uuml;llen<\/h2>\n<p>Die Ereignisprozedur <b>Form_Load <\/b>ruft die Routine <b>UnterformulareFuellen <\/b>aus Listing 3 auf, um die entsprechenden Datens&auml;tze in den einzelnen Unterformularen anzuzeigen. Diese verwendet einen Parameter namens <b>intElemente<\/b>, der die Anzahl der auf dieser Seite gef&uuml;llten Unterformulare zur&uuml;ckgeben soll. Die Prozedur durchl&auml;uft eine <b>Do While<\/b>-Schleife, die erst abgebrochen wird, wenn das Ende des Recordsets erreicht ist, also keine Datens&auml;tze mehr in Unterformularen abzubilden sind, oder <b>intElemente <\/b>kleiner als <b>intUnterformulare <\/b>wird, also alle Unterformulare gef&uuml;llt sind. <b>intElemente <\/b>wird gleich in der ersten Anweisung um <b>1 <\/b>erh&ouml;ht. Dann ermittelt die Prozedur den Wert des Prim&auml;rschl&uuml;sselfeldes des aktuellen Datensatzes und speichert diesen in der Variablen <b>lngKundeID<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>UnterformulareFuellen(intElemente<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>lngKundeID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intLetzterEintrag<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>j<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF And intElemente &lt; intUnterformulare\r\n         intElemente = intElemente + 1\r\n         lngKundeID = rst!KundeID\r\n         <span style=\"color:blue;\">With<\/span> Me(\"sfm\" & Format(intElemente, \"00\"))\r\n             .Form.RecordSource = \"SELECT * FROM tblKunden WHERE KundeID = \" & lngKundeID\r\n             .Visible = <span style=\"color:blue;\">True<\/span>\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     <span style=\"color:blue;\">If <\/span>intElemente &lt; intUnterformulare<span style=\"color:blue;\"> Then<\/span>\r\n         For j = intElemente + 1 To intUnterformulare\r\n             <span style=\"color:blue;\">With<\/span> Me(\"sfm\" & Format(j, \"00\"))\r\n                 .Form.RecordSource = \"\"\r\n                 .Visible = <span style=\"color:blue;\">False<\/span>\r\n             End <span style=\"color:blue;\">With<\/span>\r\n         <span style=\"color:blue;\">Next<\/span> j\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span>rst.EOF = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         intLetzterEintrag = rst.RecordCount\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         intLetzterEintrag = rst.AbsolutePosition\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Me!lblEintraege.Caption = intStartdatensatz & \"-\" & intLetzterEintrag & \" von \" & rst.RecordCount\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Unterformulare f&uuml;llen<\/span><\/b><\/p>\n<p>Damit beginnen die Arbeiten am Unterformular: Dieses erh&auml;lt zun&auml;chst eine Abfrage als Datensatzquelle, die den Kunden mit dem in <b>lngKundeID <\/b>gespeicherten Prim&auml;rschl&uuml;sselwert liefert. Die <b>Visible<\/b>-Eigenschaft erh&auml;lt den Wert <b>True<\/b>, damit das Unterformularsteuerelement eingeblendet wird. Dies wiederholt die Schleife so lange, bis die Abbruchbedingung erf&uuml;llt ist.<\/p>\n<p>Wenn alle Unterformulare vor dem Aufruf von <b>UnterformulareFuellen <\/b>gef&uuml;llt sind und dann die letzte Seite aufgerufen wird und nicht alle Unterformulare mit neuen Datens&auml;tzen gef&uuml;llt werden, sollen die nicht ben&ouml;tigten Unterformulare nat&uuml;rlich geleert und ausgeblendet werden. Dies erledigen die Anweisungen innerhalb der folgenden <b>If&#8230;Then<\/b>-Bedingung. Hat <b>intElemente <\/b>nach dem Durchlaufen der Datens&auml;tze des Recordsets einen Wert kleiner als <b>intUnterformulare <\/b>(was beispielsweise der Fall ist, wenn noch sechs Datens&auml;tze f&uuml;r die letzte Seite &uuml;brig sind, diese aber zw&ouml;lf Datens&auml;tze anzeigen soll), ist die Bedingung erf&uuml;llt. In diesem Fall durchl&auml;uft eine <b>For&#8230;Next<\/b>-Schleife alle Werte von <b>intElemente +1 <\/b>bis zur Anzahl der Unterformulare (<b>intUnterformulare<\/b>). F&uuml;r die entsprechenden Unterformulare stellt die Prozedur dann die Eigenschaft <b>Recordsource <\/b>auf eine leere Zeichenkette ein und blendet das Unterformularsteuerelement mit <b>Visible = False <\/b>aus.<\/p>\n<p>Nun soll die Prozedur noch ein Bezeichnungsfeld mit Informationen &uuml;ber die aktuell angezeigten Daten f&uuml;llen. Dazu pr&uuml;ft es zun&auml;chst, ob die Eigenschaft <b>rst.EOF<\/b> den Wert <b>True <\/b>aufweist, also ob das Ende des Recordsets erreicht ist. In diesem Fall, der nur bei nicht komplett gef&uuml;llter letzter Seite eintritt, speichert die Prozedur in der Variablen <b>intLetzterEintrag <\/b>die Anzahl der Datens&auml;tze des Recordsets, anderenfalls die aktuelle Position. So erhalten Sie im Bezeichnungsfeld <b>lblEintr&auml;ge <\/b>etwa einen Text wie <b>13-24 von 37<\/b>.<\/p>\n<h2>N&auml;chste Seite anzeigen<\/h2>\n<p>Die Schaltfl&auml;che <b>cmdNachUnten <\/b>soll die n&auml;chsten x Datens&auml;tze in den vorhandenen Unterformularsteuerelementen anzeigen. Dazu l&ouml;st sie die Ereignisprozedur aus Listing 4 aus. Diese verschiebt die Position des Datensatzzeigers des Recordsets aus <b>rst <\/b>auf den Datensatz, der auf der aktuellen Seite gerade nicht mehr angezeigt wird. <b>intStartdatensatz <\/b>enth&auml;lt den Index des im ersten Unterformular angezeigten Datensatzes. Diesem f&uuml;gt sie die Anzahl der Unterformulare hinzu und zieht <b>1 <\/b>ab (da AbsolutePosition 0-basiert ist). F&uuml;r die zweite Seite w&auml;re das also <b>1 + 12 &#8211; 1 = 12<\/b>. Der Datensatz des Recordsets mit dem Index <b>12 <\/b>(also der dreizehnte) soll also im ersten Unterformular erscheinen. Der Wert f&uuml;r <b>intStartdatensatz <\/b>wird dann von <b>1 <\/b>auf <b>13 <\/b>ge&auml;ndert. Die Prozedur <b>UnterformulareFuellen<\/b> stellt dann wiederum die Unterformulare auf die entsprechenden Datens&auml;tze ein. Schlie&szlig;lich erfolgt auch hier wieder die Aktivierung\/Deaktivierung der Schaltfl&auml;chen <b>cmdNachOben <\/b>und <b>cmdNachUnten<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdNachUnten_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>intElemente<span style=\"color:blue;\"> As Integer<\/span>\r\n     rst.AbsolutePosition = intStartdatensatz + intUnterformulare - 1\r\n     intStartdatensatz = intStartdatensatz + intUnterformulare\r\n     UnterformulareFuellen intElemente\r\n     Me!cmdNachUnten.Enabled = <span style=\"color:blue;\">Not<\/span> (intStartdatensatz + intElemente &gt; rst.RecordCount)\r\n     Me!cmdNachOben.Enabled = <span style=\"color:blue;\">Not<\/span> intStartdatensatz = 1\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Nach unten bl&auml;ttern<\/span><\/b><\/p>\n<h2>Vorherige Seite anzeigen<\/h2>\n<p>Die vorherige Seite zeigt ein Klick auf die Schaltfl&auml;che <b>cmdOben <\/b>an (s. Listing 5). Diese pr&uuml;ft, ob der Wert von <b>intStartdatensatz <\/b>gr&ouml;&szlig;er als <b>0 <\/b>ist. In diesem Fall stellt sie die Position des Datensatzzeigers &uuml;ber die Eigenschaft <b>AbsolutePosition <\/b>auf einen Wert ein, der dem aktuellen Wert von <b>intStartdatensatz <\/b>(zum Beispiel <b>13<\/b>, wenn zuvor die zweite Seite von Datens&auml;tzen angezeigt wurde) die Anzahl der Unterformulare (<b>intUnterformulare<\/b>) und den Wert <b>1 <\/b>abzieht (um dem 0-basierten Wert von <b>AbsolutePosition <\/b>gerecht zu werden). Anderenfalls erh&auml;lt <b>AbsolutePosition <\/b>den Wert <b>0<\/b>, was der ersten Seite entspricht. Die Prozedur <b>UnterformulareFuellen <\/b>aktualisiert wieder die Unterformulare und die &uuml;brigen Anweisungen aktivieren beziehungsweise deaktivieren die Schaltfl&auml;chen <b>cmdNachUnten <\/b>und <b>cmdNachOben<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdNachOben_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>intElemente<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">If <\/span>intStartdatensatz &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         rst.AbsolutePosition = intStartdatensatz - intUnterformulare - 1\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         rst.AbsolutePosition = 0\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     UnterformulareFuellen intElemente\r\n     intStartdatensatz = intStartdatensatz + intElemente - intUnterformulare * 2\r\n     Me!cmdNachUnten.Enabled = <span style=\"color:blue;\">Not<\/span> (intStartdatensatz &gt;= rst.RecordCount)\r\n     Me!cmdNachOben.Enabled = <span style=\"color:blue;\">Not<\/span> intStartdatensatz = 1\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Nach oben bl&auml;ttern<\/span><\/b><\/p>\n<h2>Neuen Datensatz hinzuf&uuml;gen<\/h2>\n<p>Ein Klick auf die Schaltfl&auml;che <b>cmdNeu <\/b>soll einen neuen Datensatz hinzuf&uuml;gen. In herk&ouml;mmlichen Formularen ist dies einfach: Sie m&uuml;ssen dazu einfach nur den Datensatzzeiger auf den neuen, leeren Datensatz verschieben und legen los. Hier ist es nicht so einfach, denn die angezeigten Unterformulare zeigen ja jeweils bereits einen Datensatz an. Es w&auml;re recht ergonomisch, wenn f&uuml;r einen neuen Datensatz ein neues Unterformular angezeigt werden k&ouml;nnte, das dann einen leeren Datensatz zum Bearbeiten bereitstellt. Dazu m&uuml;ssen wir also zun&auml;chst einmal zur letzten Seite wechseln, da neue Datens&auml;tze ja meist hinten angef&uuml;gt werden und nicht einfach mittendrin. Dann pr&uuml;fen wir, ob die letzte Seite nicht zuf&auml;llig komplett gef&uuml;llt ist, was dazu f&uuml;hrt, dass wir dort kein Unterformular mehr f&uuml;r den neuen Datensatz nutzen k&ouml;nnen, und wechseln gegebenenfalls zu einer komplett leeren Seite und zeigen dort das leere Unterformular an. All dies erledigt die Prozedur aus Listing 6.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdNeu_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>intElemente<span style=\"color:blue;\"> As Integer<\/span>\r\n     Select Case rst.RecordCount <span style=\"color:blue;\">Mod<\/span> intUnterformulare\r\n         <span style=\"color:blue;\">Case <\/span>0\r\n             intStartdatensatz = rst.RecordCount + 1\r\n             rst.AbsolutePosition = intStartdatensatz - 1\r\n             UnterformulareFuellen 0\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             intStartdatensatz = rst.RecordCount - rst.RecordCount <span style=\"color:blue;\">Mod<\/span> intUnterformulare + 1\r\n             rst.AbsolutePosition = intStartdatensatz - 1\r\n             UnterformulareFuellen intElemente\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">With<\/span> Me(\"sfm\" & Format(intElemente + 1, \"00\"))\r\n         .Form.RecordSource = \"SELECT * FROM tblKunden WHERE 1=2\"\r\n         .Visible = <span style=\"color:blue;\">True<\/span>\r\n         .SetFocus\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     Me!cmdNachUnten.Enabled = <span style=\"color:blue;\">Not<\/span> (intStartdatensatz + intElemente - 1 &gt;= rst.RecordCount)\r\n     Me!cmdNachOben.Enabled = <span style=\"color:blue;\">Not<\/span> intStartdatensatz = 1\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Neuen Datensatz hinzuf&uuml;gen<\/span><\/b><\/p>\n<p>Die Prozedur pr&uuml;ft zun&auml;chst, ob die Unterformulare aller Seiten komplett gef&uuml;llt sind. In diesem Fall liefert die Division der Anzahl der Datens&auml;tze durch die Anzahl der Unterformulare je Seite den Rest <b>0<\/b>. In diesem Fall stellt die Prozedur den Wert f&uuml;r <b>intStartdatensatz <\/b>auf einen noch nicht vorhandenen Datensatz ein (<b>rst.RecordCount + 1<\/b>), bei 36 vorhandenen Datens&auml;tzen also etwa auf <b>37<\/b>. <b>AbsolutePosition<\/b> wird wegen der 0-Basis wieder auf <b>intStartdatensatz &#8211; 1 <\/b>eingestellt. Dann ruft die Prozedur die Routine <b>Unterformulare-Fuellen <\/b>auf, was in diesem Fall dazu f&uuml;hrt, dass nur ein Unterformular eingeblendet ist, dieses aber den letzten Datensatz der Datenherkunft anzeigt (etwa wie in Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_06\/pic_1010_006.png\" alt=\"Ein f&uuml;r das Anlegen eines neuen Datensatzes vorgesehenes Unterformular, ...\" width=\"425\" height=\"220,5189\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Ein f&uuml;r das Anlegen eines neuen Datensatzes vorgesehenes Unterformular, &#8230;<\/span><\/b><\/p>\n<p>Das geht nicht anders, weil wir <b>AbsolutePosition <\/b>nicht etwa durch den Wert <b>36 <\/b>auf einen neuen, leeren Datensatz positionieren k&ouml;nnen &#8211; dies w&uuml;rde zu einem Fehler f&uuml;hren. Stattdessen sorgen die Anweisungen hinter der <b>Select Case<\/b>-Bedingung daf&uuml;r, dass das Unterformular f&uuml;r den neuen Datensatz tats&auml;chlich einen neuen, leeren Datensatz anzeigt. Dazu stellt die Routine die Eigenschaft <b>RecordSource <\/b>auf eine Abfrage auf Basis der Tabelle <b>tblKunden <\/b>ein, die aber wegen des Kriteriums <b>1=2 <\/b>keine Datens&auml;tze zur&uuml;ckliefert. Au&szlig;erdem blendet die Prozedur das Unterformular ein und aktiviert es, bevor es wie &uuml;blich die beiden Schaltfl&auml;chen <b>cmdNachUnten <\/b>und <b>cmdNachOben <\/b>aktiviert\/deaktiviert (s. Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_06\/pic_1010_007.png\" alt=\"... das dann mit dem neuen, leeren Datensatz gef&uuml;llt wird und bereit zur Eingabe ist.\" width=\"425\" height=\"220,1324\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: &#8230; das dann mit dem neuen, leeren Datensatz gef&uuml;llt wird und bereit zur Eingabe ist.<\/span><\/b><\/p>\n<p>F&uuml;r den Fall, dass der Benutzer auf die Schaltfl&auml;che <b>cmdNeu <\/b>klickt, w&auml;hrend auf der letzten Seite noch mindestens ein Unterformular keinen Datensatz anzeigt, verwenden wir f&uuml;r den neuen Datensatz einfach das n&auml;chste freie Unterformular auf der letzten Seite. Dazu stellt der zweite Teil der <b>Select Case<\/b>-Bedingung die Variable <b>intStartdatensatz <\/b>auf den Wert <b>rst.RecordCount &#8211; rst.RecordCount Mod intUnterformular + 1 <\/b>ein, was den Index des ersten Eintrags auf der letzten Seite ermittelt, im Falle von 38 Eintr&auml;gen also etwa <b>38 &#8211; 38 Mod 12 + 1 = 37<\/b>. Damit f&uuml;llt die Prozedur dann die letzte Seite, bevor das Unterformular f&uuml;r den neuen Datensatz vorbereitet wird.<\/p>\n<h2>Nach dem Hinzuf&uuml;gen<\/h2>\n<p>Was geschieht nun, nachdem der Benutzer die Felder des neuen Datensatzes gef&uuml;llt und diesen gespeichert hat &uuml;blicherweise sind dort keine Schritte mehr n&ouml;tig. Aber wir m&uuml;ssen das Recordset aus der Variablen <b>rst<\/b> auf dem aktuellen Stand halten, da wir dieses f&uuml;r das F&uuml;llen der Unterformulare verwenden. Dies gelingt nur mit der <b>Requery<\/b>-Methode. Um &uuml;berhaupt zu registrieren, wann der Benutzer den neuen Datensatz speichert, legen Sie f&uuml;r das Ereignis <b>Nach Einf&uuml;gung <\/b>des Unterformulars die folgende Ereignisprozedur an:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_AfterInsert()\r\n     Me.Parent.DatensatzHinzugefuegt\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese ruft die Prozedur <b>DatensatzHinzugefuegt <\/b>des Hauptformulars auf, die wiederum so aussieht:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>DatensatzHinzugefuegt()\r\n     <span style=\"color:blue;\">With<\/span> rst\r\n         .Requery\r\n         .MoveLast\r\n         .MoveFirst\r\n         .AbsolutePosition = intStartdatensatz - 1\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     UnterformulareFuellen 0\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur aktualisiert das Recordset <b>rst <\/b>mit der <b>Requery<\/b>-Methode und verschiebt den Datensatzzeiger dann auf den letzten und wieder auf den ersten Datensatz, damit die folgende Zuweisung des Wertes <b>intStartdatensatz &#8211; 1<\/b> an die Eigenschaft <b>AbsolutePosition <\/b>des Recordsets keinen Fehler ausl&ouml;st.<\/p>\n<p>Nach der Aktualisierung des Recordsets kann die Routine <b>UnterformulareFuellen <\/b>dann die Unterformulare der aktuellen Seite f&uuml;llen.<\/p>\n<h2>L&ouml;schen eines Datensatzes<\/h2>\n<p>Damit der Benutzer einen Datensatz l&ouml;schen kann, haben wir die Schaltfl&auml;che <b>cmdLoeschen <\/b>zum Unterformular hinzugef&uuml;gt. Diese ruft die Methode <b>DatensatzLoeschen <\/b>im Hauptformular auf:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdLoeschen_Click()\r\n     Me.Parent.DatensatzLoeschen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese ist als Public deklariert, damit sie vom Unterformular aus aufgerufen werden kann, und enth&auml;lt die folgenden beiden Anweisungen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>DatensatzLoeschen()\r\n     RunCommand acCmdSelectRecord\r\n     RunCommand acCmdDeleteRecord\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese markieren und l&ouml;schen den aktuell im Unterformular angezeigten Datensatz. Auch hier m&uuml;ssen wir noch ein wenig nacharbeiten, damit das Unterformular, das den gel&ouml;schten Datensatz angezeigt hat, ausgeblendet wird. Dazu f&uuml;gen wir wiederum eine Ereignisprozedur zum Unterformular hinzu, die diesmal durch das Ereignis <b>Nach L&ouml;schbest&auml;tigung <\/b>ausgel&ouml;st wird:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_AfterDelConfirm(Status<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Me.Parent.DatensatzGeloescht\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die hier aufgerufene Prozedur des Hauptformulars sieht so aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>DatensatzGeloescht()\r\n     Me!cmdNeu.SetFocus\r\n     Select Case rst.RecordCount <span style=\"color:blue;\">Mod<\/span> intUnterformulare\r\n         <span style=\"color:blue;\">Case <\/span>1\r\n             intStartdatensatz = _\r\n                 intStartdatensatz - intUnterformulare\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">With<\/span> rst\r\n         .Requery\r\n         .MoveLast\r\n         .MoveFirst\r\n         .AbsolutePosition = intStartdatensatz - 1\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     UnterformulareFuellen 0\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Sie stellt, falls der zu l&ouml;schende Eintrag allein auf der aktuellen Seite erscheint, den Startdatensatz auf den Index des ersten Datensatzes der vorherigen Seite ein. Danach aktualisiert sie das Recordset und f&uuml;llt die Unterformulare neu.<\/p>\n<h2>Aktivieren und Deaktivieren der L&ouml;schen-Schaltfl&auml;che<\/h2>\n<p>Die <b>L&ouml;schen<\/b>-Schaltfl&auml;che soll bei Datens&auml;tzen, die gerade erst angelegt werden, deaktiviert sein, da das L&ouml;schen sonst einen Fehler ausl&ouml;st. Dies erledigen wir mit der folgenden Prozedur, die durch das Ereignis <b>Beim Anzeigen <\/b>des Unterformulars ausgel&ouml;st wird und die den Wert der Eigenschaft <b>Enabled <\/b>in Abh&auml;ngigkeit von <b>NewRecord <\/b>einstellt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Current()\r\n     Me!cmdLoeschen.Enabled = <span style=\"color:blue;\">Not<\/span> Me.NewRecord\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Die hier vorgestellte L&ouml;sung erm&ouml;glicht die Anzeige mehrerer Datens&auml;tze nebeneinander. Dabei kommt eine Matrix aus Unterformularen zum Einsatz, von denen jedes einen eigenen Datensatz anzeigt.<\/p>\n<p>Im Beitrag <b>Kontakte verwalten <\/b>(<b>www.access-im-unternehmen.de\/1019<\/b>) finden Sie in der folgenden Ausgabe ein Beispiel f&uuml;r ein h&uuml;bsch aufbereitetes Formular auf Basis der L&ouml;sung des vorliegenden Beitrags.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>DatenInFormularNebeneinander.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{D7C5917A-F20D-4672-BE05-E720D56BC1A5}\/aiu_1010.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&Uuml;blicherweise landen in einem Access-Formular entweder die Details eines Datens&auml;tzes oder mehrere Datens&auml;tze. Erstere k&ouml;nnen &uuml;ber das Formular verteilt werden, Letztere erscheinen untereinander in der Datenblattansicht oder der Endlosansicht. Mit einigen Unterformular-Steuerelementen lassen sich jedoch auch mehrere Datens&auml;tze nebeneinander anzeigen. Dieser Beitrag zeigt die Grundlagen zur Anzeige mehrerer Datens&auml;tze in einer Matrix von Unterformularen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662015,66062015,44000023],"tags":[],"class_list":["post-55001010","post","type-post","status-publish","format-standard","hentry","category-662015","category-66062015","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>Mehrere Datens&auml;tze pro Spalte in Formularen - 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\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mehrere Datens&auml;tze pro Spalte in Formularen\" \/>\n<meta property=\"og:description\" content=\"&Uuml;blicherweise landen in einem Access-Formular entweder die Details eines Datens&auml;tzes oder mehrere Datens&auml;tze. Erstere k&ouml;nnen &uuml;ber das Formular verteilt werden, Letztere erscheinen untereinander in der Datenblattansicht oder der Endlosansicht. Mit einigen Unterformular-Steuerelementen lassen sich jedoch auch mehrere Datens&auml;tze nebeneinander anzeigen. Dieser Beitrag zeigt die Grundlagen zur Anzeige mehrerer Datens&auml;tze in einer Matrix von Unterformularen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T19:08:40+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/61556b8eb2c24e5792d94333b00f35f3\" \/>\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=\"19\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Mehrere Datens&auml;tze pro Spalte in Formularen\",\"datePublished\":\"2020-05-22T19:08:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\\\/\"},\"wordCount\":3166,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/61556b8eb2c24e5792d94333b00f35f3\",\"articleSection\":[\"2015\",\"6\\\/2015\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\\\/\",\"name\":\"Mehrere Datens&auml;tze pro Spalte in Formularen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/61556b8eb2c24e5792d94333b00f35f3\",\"datePublished\":\"2020-05-22T19:08:40+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/61556b8eb2c24e5792d94333b00f35f3\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/61556b8eb2c24e5792d94333b00f35f3\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mehrere Datens&auml;tze pro Spalte in Formularen\"}]},{\"@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":"Mehrere Datens&auml;tze pro Spalte in Formularen - 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\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\/","og_locale":"de_DE","og_type":"article","og_title":"Mehrere Datens&auml;tze pro Spalte in Formularen","og_description":"&Uuml;blicherweise landen in einem Access-Formular entweder die Details eines Datens&auml;tzes oder mehrere Datens&auml;tze. Erstere k&ouml;nnen &uuml;ber das Formular verteilt werden, Letztere erscheinen untereinander in der Datenblattansicht oder der Endlosansicht. Mit einigen Unterformular-Steuerelementen lassen sich jedoch auch mehrere Datens&auml;tze nebeneinander anzeigen. Dieser Beitrag zeigt die Grundlagen zur Anzeige mehrerer Datens&auml;tze in einer Matrix von Unterformularen.","og_url":"https:\/\/access-im-unternehmen.de\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T19:08:40+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/61556b8eb2c24e5792d94333b00f35f3","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"19\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Mehrere Datens&auml;tze pro Spalte in Formularen","datePublished":"2020-05-22T19:08:40+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\/"},"wordCount":3166,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/61556b8eb2c24e5792d94333b00f35f3","articleSection":["2015","6\/2015","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\/","url":"https:\/\/access-im-unternehmen.de\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\/","name":"Mehrere Datens&auml;tze pro Spalte in Formularen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/61556b8eb2c24e5792d94333b00f35f3","datePublished":"2020-05-22T19:08:40+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/61556b8eb2c24e5792d94333b00f35f3","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/61556b8eb2c24e5792d94333b00f35f3"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Mehrere_Datensaetze_pro_Spalte_in_Formularen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Mehrere Datens&auml;tze pro Spalte in Formularen"}]},{"@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\/55001010","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=55001010"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001010\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001010"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001010"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001010"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}