{"id":55000967,"date":"2015-02-01T00:00:00","date_gmt":"2022-03-02T12:06:07","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=967"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Registerkarten_fuer_verschiedene_Datensaetze","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Registerkarten_fuer_verschiedene_Datensaetze\/","title":{"rendered":"Registerkarten f&uuml;r verschiedene Datens&auml;tze"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/6944affbdb9e440592579fa7077a4dfd\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Normalerweise verwendet man verschiedene Registerkarten, um unterschiedliche Daten anzuzeigen &#8211; beispielsweise auf dem Hauptformular die Basis-Daten zu einem Kunden wie Kundennummer und Name und auf den Registerkarten Informationen wie die Lieferanschrift, die Rechnungsanschrift und weitere Daten. Wir wollen in diesem Beitrag einmal zeigen, wie Sie verschiedene Datens&auml;tze der gleichen Tabelle auf Registerseiten anzeigen &#8211; beispielsweise, um die letzten zehn angezeigten Kunden immer schnell aufschlagen zu k&ouml;nnen.<\/b><\/p>\n<p>Damit w&auml;re auch schon die Anzahl der zu verwendenden Registerseiten festgelegt &#8211; n&auml;mlich zehn. Irgendwann w&uuml;rde es n&auml;mlich mit steigender Anzahl von Registerreitern etwas un&uuml;bersichtlich.<\/p>\n<p>Wir wollen also ein Hauptformular erstellen, das haupts&auml;chlich ein Registersteuerelement enth&auml;lt, das auf seinen zehn Registerseiten jeweils das gleiche Unterformular mit Daten aus der Tabelle <b>tblKunden <\/b>der Beispieldatenbank anzeigt.<\/p>\n<p>Da w&auml;re nun noch zu kl&auml;ren, wie wir daf&uuml;r sorgen, dass &uuml;berhaupt ein Kundendatensatz dorthin gelangt. Am einfachsten w&auml;re es, eine kleine Suchfunktion samt Ergebnisliste in Form eines Listenfeldes im Hauptformular unterzubringen. Per Doppelklick auf einen der Eintr&auml;ge im Listenfeld soll der gew&auml;hlte Kunde dann auf der Registerseite ganz links erscheinen. Die &uuml;brigen Kunden im Registersteuerelement sollen dann, sofern bereits vorhanden, auf die Registerseiten rechts davon verschoben werden.<\/p>\n<p>Sobald ein neuer Kunde ausgew&auml;hlt wird, soll bei komplett gef&uuml;llten Registerseiten also der letzte Kunde rechts rausfallen. Die vollst&auml;ndige L&ouml;sung sieht dann sp&auml;ter wie in Bild 1 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_967_009.png\" alt=\"Die fertige L&ouml;sung\" width=\"450\" height=\"331,6609\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Die fertige L&ouml;sung<\/span><\/b><\/p>\n<p><b>Unterformular erstellen<\/b><\/p>\n<p>Das Unterformular der L&ouml;sung soll <b>sfmKunden <\/b>hei&szlig;en und die Tabelle <b>tblKunden<\/b> als Datenherkunft nutzen. Ziehen Sie alle Felder der Datenherkunft aus der Feldliste in den Detailbereich des Formulars und teilen Sie diese etwa wie in Bild 2 auf. Stellen Sie die Eigenschaften <b>Bildlaufleisten<\/b>, <b>Navigationsschaltfl&auml;chen<\/b>, <b>Datensatzmarkierer <\/b>und <b>Trennlinien <\/b>auf den Wert <b>Nein <\/b>ein.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_967_001.png\" alt=\"Das Unterformular sfmKunden\" width=\"450\" height=\"217,6364\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Das Unterformular sfmKunden<\/span><\/b><\/p>\n<p><b>Kunden ausw&auml;hlen<\/b><\/p>\n<p>Die Auswahl der Kunden soll per Doppelklick auf die Eintr&auml;ge eines Listenfeldes erfolgen. Dieses soll wiederum nach der Eingabe in ein einfaches Suchfeld gefiltert werden.<\/p>\n<p>Dazu f&uuml;gen Sie dem Hauptformular namens <b>frmKundenregister <\/b>zun&auml;chst ein Textfeld namens <b>txtSuche <\/b>und ein Listenfeld namens <b>lstKunden <\/b>zu.<\/p>\n<p>Die Eigenschaften <b>Datensatzmarkierer<\/b>, <b>Navigationsschaltfl&auml;chen<\/b>, <b>Trennlinien <\/b>und <b>Bildlaufleisten <\/b>des Formulars sollten den Wert <b>Nein <\/b>enthalten.<\/p>\n<p>F&uuml;r das Listenfeld hinterlegen Sie ebenfalls die Tabelle <b>tblKunden<\/b> als Datenherkunft. Das Listenfeld soll die ersten vier Felder der Datensatzherkunft enthalten, daher stellen Sie die Eigenschaft <b>Spaltenanzahl <\/b>auf den Wert 4 ein. Die Spaltenbreiten sind mit 0cm;2cm;6cm;6cm vern&uuml;nftig ausgelegt. Die erste Spalte enth&auml;lt ja nur das Prim&auml;rschl&uuml;sselfeld, das als gebundene Spalte dienen soll &#8211; dieses braucht nicht sichtbar zu sein.<\/p>\n<p>Bis hierhin sieht das Hauptformular im Entwurf wie in Bild 3 aus. Damit das Listenfeld nur solche Eintr&auml;ge anzeigt, die in einem der drei Felder <b>Kundencode<\/b>, <b>Firma <\/b>oder <b>Kontaktperson <\/b>den im Suchfeld <b>txtSuche <\/b>eingegebenen Ausdruck enthalten, legen wir f&uuml;r das Ereignis <b>Bei &auml;nderung <\/b>des Textfeldes eine entsprechende VBA-Prozedur an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_967_002.png\" alt=\"Das Hauptformular mit Such- und Listenfeld\" width=\"575\" height=\"244,72\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Das Hauptformular mit Such- und Listenfeld<\/span><\/b><\/p>\n<p>Diese sieht wie in Listing 1 aus und stellt zun&auml;chst einen geeigneten Suchausdruck in Form einer <b>SELECT<\/b>-Anweisung zusammen. Diese wird dann der Eigenschaft <b>RowSource <\/b>des Listenfeldes zugewiesen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtSuche_Change()\r\n     <span style=\"color:blue;\">Dim <\/span>strSuche<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSQL<span style=\"color:blue;\"> As String<\/span>\r\n     strSuche = txtSuche.Text\r\n     strSQL = \"SELECT * FROM tblKunden WHERE KundenCode Like ''*\" & strSuche _\r\n         & \"*'' OR Firma LIKE ''*\" & strSuche _\r\n         & \"*'' OR Kontaktperson LIKE ''*\" & strSuche & \"*''\"\r\n     Me!lstKunden.RowSource = strSQL\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Filtern des Listenfeldes nach dem im Suchfeld eingegebenen Ausdruck<\/span><\/b><\/p>\n<p>Bild 4 zeigt die Suchfunktion mit dem entsprechenden Suchergebnis im Listenfeld.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_967_003.png\" alt=\"Die Suchfunktion des Beispielformulars\" width=\"575\" height=\"244,72\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Die Suchfunktion des Beispielformulars<\/span><\/b><\/p>\n<p><b>Registersteuerelement anlegen<\/b><\/p>\n<p>Damit kommen wir zum interessanten Teil und f&uuml;gen zun&auml;chst ein neues Registersteuerelement zum Formular <b>frmKundenregister <\/b>hinzu. Dieses soll nat&uuml;rlich unter dem Listenfeld landen und die gleiche Breite wie dieses einnehmen. Das Registersteuerelement soll den Namen <b>regKunden <\/b>erhalten.<\/p>\n<p>Nach dem Hinzuf&uuml;gen des Registersteuer-elements kommt das erste Unterformular an die Reihe. Genau genommen f&uuml;gen wir dort zun&auml;chst einmal ein Unterformular-Steuerelement ein. Dazu klicken Sie auf den linken Registerreiter, dann auf die Schaltfl&auml;che zum Hinzuf&uuml;gen eines Unterformular-Steuerelements und f&uuml;gen dieses dann schlie&szlig;lich in die erste Seite des Registersteuerelements ein.<\/p>\n<p>Die Registerseite sollte dabei wie in Bild 5 schwarz hinterlegt erscheinen. Entfernen Sie dann das Bezeichnungsfeld und stellen Sie die Eigenschaft <b>Name <\/b>auf den Wert <b>sfm01 <\/b>ein (sp&auml;ter werden wir noch weitere solcher Unterformulare einf&uuml;gen). Anschlie&szlig;end &auml;ndern Sie die Eigenschaft <b>Rahmenart <\/b>des Unterformular-Steuerelements auf den Wert <b>Transparent <\/b>(s. Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_967_005.png\" alt=\"Hinzuf&uuml;gen des Unterformulars zur ersten Registerkarte\" width=\"575\" height=\"441,1718\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Hinzuf&uuml;gen des Unterformulars zur ersten Registerkarte<\/span><\/b><\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_967_004.png\" alt=\"Der Rahmen des Unterformulars soll transparent erscheinen.\" width=\"575\" height=\"429,3219\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Der Rahmen des Unterformulars soll transparent erscheinen.<\/span><\/b><\/p>\n<p><b>Kundendaten auf Registerseite anzeigen<\/b><\/p>\n<p>Nun k&ouml;nnen wir uns um die F&uuml;llung des Unterformulars mit den Daten f&uuml;r den ersten im Listenfeld doppelt angeklickten Kunden-Datensatz k&uuml;mmern. Legen Sie also f&uuml;r das Listenfeld eine Ereignisprozedur an, die durch das Ereignis <b>Beim Doppelklicken <\/b>ausgel&ouml;st wird.<\/p>\n<p>Diese Prozedur sieht wie in Listing 2 aus und stellt zun&auml;chst die Beschriftung der ersten Registerseite des Registersteuerelements auf den Wert der Listenfeldspalte mit dem Index <b>2 <\/b>ein, also der dritten Spalte. Diese liefert den Wert des Feldes <b>Firma<\/b> der Tabelle <b>tblKunden<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>lstKunden_DblClick(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Me!regKunden.Pages(0).Caption = Me!lstKunden.Column(2)\r\n     <span style=\"color:blue;\">With<\/span> Me!sfm01\r\n         .SourceObject = \"sfmKunden\"\r\n         .Form.RecordSource = \"SELECT * FROM tblKunden WHERE KundeID = \" & Me!lstKunden\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Anzeigen des angeklickten Kunden im Registersteuerelement<\/span><\/b><\/p>\n<p>Danach folgen zwei Anweisungen, die sich mit dem Unterformular-Steuerelement besch&auml;ftigen: Die erste legt das Formular <b>sfmKunden <\/b>als das im Unterformular-Steuerelement anzuzeigende Objekt fest. Die zweite stellt die Datenherkunft f&uuml;r das Unterformular ein.<\/p>\n<p>Dabei handelt es sich um eine SQL-Abfrage, die genau den Datensatz der Tabelle <b>tblKunden <\/b>liefert, den der Benutzer soeben im Listenfeld <b>lstKunden <\/b>doppelt angeklickt hat. Das Ergebnis sieht aktuell wie in Bild 7 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_967_006.png\" alt=\"Anzeige des soeben doppelt angeklickten Kunden-Datensatzes\" width=\"575\" height=\"423,7889\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Anzeige des soeben doppelt angeklickten Kunden-Datensatzes<\/span><\/b><\/p>\n<p><b>Weitere Registerseiten f&uuml;llen<\/b><\/p>\n<p>Nun haben wir die erste Registerseite gef&uuml;llt. Dies funktioniert auch, wenn Sie danach andere Eintr&auml;ge des Listenfeldes anklicken. Allerdings fehlt noch die entscheidende Funktion: N&auml;mlich das Verschieben des aktuell auf der ersten Registerseite angezeigten Kunden auf die zweite Seite, wenn die erste Seite einen neuen Kunden anzeigen soll.<\/p>\n<p>Dazu wollen wir zun&auml;chst die Vorarbeiten erledigen &#8211; n&auml;mlich das Anlegen der &uuml;brigen neun Registerseiten samt Unterformular-Steuerelementen. Diese f&uuml;gen Sie jeweils in die &uuml;brigen Registerseiten ein und benennen diese durchlaufend mit <b>sfm02<\/b>, <b>sfm03 <\/b>und so weiter bis <b>sfm10<\/b>.<\/p>\n<p>Nachdem Sie gepr&uuml;ft haben, dass die Unterformular-Steuerelemente alle gleich ausgerichtet sind und die gleiche Gr&ouml;&szlig;e haben, k&uuml;mmern wir uns um den Code.<\/p>\n<p>Hier ist zun&auml;chst zu beachten, dass das Registersteuerelement im Startzustand, also wenn der Benutzer noch keinerlei Kunden-Datens&auml;tze darin angezeigt hat,  auch keine Daten anzeigen soll. Genau genommen w&auml;re es praktisch, wenn der Benutzer per Bezeichnungsfeld darauf aufmerksam gemacht wird, dass er per Doppelklick einen Kunden im Unterformular anzeigen kann.<\/p>\n<p>Vorher m&uuml;ssen wir uns allerdings noch &uuml;berlegen, wie wir die zuletzt aufgerufenen Kundendatens&auml;tze &uuml;berhaupt speichern, um diese sp&auml;ter wiederherstellen zu k&ouml;nnen. Da diese Information sitzungs&uuml;bergreifend verf&uuml;gbar sein soll, speichern wir diese also einfach in einer Tabelle namens <b>tblLetzteKunden<\/b>. Diese Tabelle sieht im Entwurf wie in Bild 8 aus. Sie speichert neben dem Prim&auml;rschl&uuml;sselwert, der ben&ouml;tigt wird, um die Reihenfolge des Anlegens zu dokumentieren, nur den Prim&auml;rschl&uuml;sselwert des jeweiligen Datensatzes der Tabelle <b>tblKunden<\/b>. Damit jeder Kundendatensatz hier nur einmal vermerkt wird, stellen wir f&uuml;r das Feld <b>LetzterKunde <\/b>noch den Wert <b>Ja (Ohne Duplikate) <\/b>f&uuml;r die Eigenschaft <b>Indiziert <\/b>ein.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_967_007.png\" alt=\"Tabelle zum Speichern der zuletzt angezeigten Kunden\" width=\"575\" height=\"373,7993\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Tabelle zum Speichern der zuletzt angezeigten Kunden<\/span><\/b><\/p>\n<p>Damit eventuell gel&ouml;schte Datens&auml;tze aus der Tabelle <b>tblKunden <\/b>auch aus der Tabelle <b>tblLetzteKunden <\/b>entfernt werden, legen wir noch eine Beziehung zwischen den beiden Tabellen an und versehen diese mit referenzieller Integrit&auml;t und L&ouml;schweitergabe (s. Bild 9).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_967_008.png\" alt=\"Einrichten einer L&ouml;schweitergabe f&uuml;r die Kundentabellen\" width=\"450\" height=\"328,6956\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Einrichten einer L&ouml;schweitergabe f&uuml;r die Kundentabellen<\/span><\/b><\/p>\n<p><b>Kunden &uuml;ber die Registerseiten verteilen<\/b><\/p>\n<p>Damit begeben wir uns an eine neue Version der Ereignisprozedur <b>lstKunden_DblClick<\/b> (s. Listing 3). Diese speichert zun&auml;chst den Wert des Feldes <b>Kunde-ID <\/b>aus dem Listenfeld in der Variablen <b>lngKundeID <\/b>zwischen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>lstKunden_DblClick(Cancel<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>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rstLetzteKunden<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intGefuellt<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     lngKundeID = Me!lstKunden\r\n     db.Execute \"DELETE FROM tblLetzteKunden WHERE LetzterKunde = \" & lngKundeID, _\r\n         dbFailOnError\r\n     db.Execute \"INSERT INTO tblLetzteKunden(LetzterKunde) VALUES(\" & lngKundeID & \")\", _\r\n         dbFailOnError\r\n     <span style=\"color:blue;\">Set<\/span> rstLetzteKunden = db.OpenRecordset(\"SELECT TOP 10 LetzterKunde &quot; _\r\n         &quot;FROM tblLetzteKunden ORDER BY LetzterKundeID DESC\", _\r\n         dbOpenDynaset)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rstLetzteKunden.EOF\r\n         Me!regKunden.Pages(intGefuellt).Visible = <span style=\"color:blue;\">True<\/span>\r\n         Me!regKunden.Pages(intGefuellt).Caption = DLookup(\"Firma\", \"tblKunden\", _\r\n             \"KundeID = \" & rstLetzteKunden!LetzterKunde)\r\n         intGefuellt = intGefuellt + 1\r\n         <span style=\"color:blue;\">With<\/span> Me(\"sfm\" & Format(intGefuellt, \"00\"))\r\n             .SourceObject = \"sfmKunden\"\r\n             .Form.RecordSource = \"SELECT * FROM tblKunden WHERE KundeID = \" _\r\n                 & rstLetzteKunden!LetzterKunde\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         rstLetzteKunden.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     For i = intGefuellt To 9\r\n         Me!regKunden.Pages(i).Visible = <span style=\"color:blue;\">False<\/span>\r\n         <span style=\"color:blue;\">With<\/span> Me(\"sfm\" & Format(i + 1, \"00\"))\r\n             .SourceObject = \"\"\r\n         End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Anzeigen der zuletzt gew&auml;hlten Kunden auf verschiedenen Registerseiten<\/span><\/b><\/p>\n<p>Dann l&ouml;scht sie einen eventuell bereits vorhandenen Datensatz in der Tabelle <b>tblLetzteKunden<\/b>, da dieser im n&auml;chsten Schritt neu angelegt wird. Warum nicht einfach pr&uuml;fen, ob ein solcher Datensatz vorhanden ist und diesen beibehalten Weil der zuletzt per Doppelklick ausgew&auml;hlte Datensatz ja als aktuellster Datensatz gespeichert und ganz links im Registersteuerelement angezeigt werden soll. Dies erreichen wir am einfachsten &uuml;ber den Autowert-Prim&auml;rschl&uuml;ssel der Tabelle <b>tblLetzteKunden<\/b>: Ein neuer Datensatz erh&auml;lt ja automatisch den h&ouml;chsten Wert und wird so &uuml;ber die Sortierung nach dem Prim&auml;rschl&uuml;sselwert als zuletzt gew&auml;hlter Eintrag erkannt.<\/p>\n<p>Danach erstellt die Prozedur ein Recordset auf Basis der Tabelle <b>tblLetzteKunden<\/b>, wobei sie die Daten absteigend nach dem Feld <b>LetzterKundeID <\/b>sortiert und nur zehn Datens&auml;tze liefert &#8211; mehr ben&ouml;tigen wir ja nicht, um die zehn Datens&auml;tze f&uuml;r die zehn Registerseiten zu ermitteln.<\/p>\n<p>Danach durchl&auml;uft die Prozedur die Datens&auml;tze dieses Recordsets in einer <b>Do While<\/b>-Schleife. Sollte die Tabelle weniger als zehn Datens&auml;tze enthalten, wird das Recordset nat&uuml;rlich auch mit weniger als zehn Datens&auml;tzen gef&uuml;llt. Dann stellt die Prozedur die Sichtbarkeit der Registerseite mit dem Indexwert aus der Variablen <b>intCounter <\/b>auf <b>True <\/b>ein. Beim ersten Durchlauf enth&auml;lt <b>intCounter <\/b>an dieser Stelle den Wert <b>0<\/b>, was der ersten Registerseite entspricht. Auf die gleiche Weise schreibt sie den Wert des Feldes <b>Firma <\/b>f&uuml;r diesen Datensatz der Tabelle <b>tblKunden<\/b>, den sie per <b>DLook-up <\/b>ermittelt, in die Eigenschaft <b>Caption <\/b>der Registerseite.<\/p>\n<p>Danach addiert die Prozedur den Wert <b>1 <\/b>zur Variablen <b>intCounter <\/b>hinzu. Diesen brauchen wir nicht nur innerhalb der <b>Do While<\/b>-Schleife f&uuml;r den Zugriff auf die Registerseiten &uuml;ber deren Index, sondern auch, um uns zu merken, wie viele Registerseiten mit Daten gef&uuml;llt werden. Die &uuml;brigen Registerseiten m&uuml;ssen ja sp&auml;ter geleert werden, damit nur die gew&uuml;nschten Daten erscheinen.<\/p>\n<p>Warum erh&ouml;hen wir <b>intCounter <\/b>an dieser Stelle und nicht sp&auml;ter Weil wir in der n&auml;chsten Anweisung das Unterformular-Steuerelement referenzieren m&uuml;ssen, das wir mit dem richtigen Unterformular und der passenden Datenherkunft versehen m&uuml;ssen. Und da wir diese nach dem Schema <b>sfm01<\/b>, <b>sfm02 <\/b>und so weiter benannt haben und nicht 0-basiert, erh&ouml;hen wir <b>intCounter <\/b>praktischerweise an dieser Stelle um den Wert <b>1<\/b>.<\/p>\n<p>Als Datenherkunft f&uuml;r das jeweilige Formular verwenden wir eine <b>SELECT<\/b>-Anweisung, welche genau den Datensatz der Tabelle <b>tblKunden <\/b>enth&auml;lt, dessen Prim&auml;rschl&uuml;sselwert im aktuellen Recordset der <b>Do While<\/b>-Schleife gespeichert ist. Danach steuert die <b>Do While<\/b>-Schleife den n&auml;chsten Datensatz an und beginnt von vorn.<\/p>\n<p>Dies geschieht entsprechend der Anzahl der Datens&auml;tze im Recordset. Wenn dieses sechs Datens&auml;tze enth&auml;lt, werden also sechs Registerseiten mit Kundendaten gef&uuml;llt. Was aber, wenn vorher schon einmal mehr Registerseiten gef&uuml;llt waren als jetzt &#8211; beispielsweise, weil zwischenzeitlich die Daten der Tabelle <b>tblLetzteKunden <\/b>gel&ouml;scht wurden Dann m&uuml;ssen wir nun daf&uuml;r sorgen, dass die nicht ben&ouml;tigten Registerseiten auch wieder geleert werden.<\/p>\n<p>Dies erledigen die &uuml;brigen Zeilen der Ereignisprozedur <b>lstKunden_DoubleClick<\/b>. Diese durchl&auml;uft dann eine <b>For&#8230;Next<\/b>-Schleife &uuml;ber alle Zahlen von dem Wert aus <b>intGefuellt <\/b>bis <b>9<\/b>. Wenn zuvor also etwa vier Registerseiten samt Unterformularen gef&uuml;llt wurden, dann durchl&auml;uft die Schleife nun die Werte von <b>4 <\/b>bis <b>9<\/b>, also die verbleibenden sechs.<\/p>\n<p>Innerhalb dieser Schleife stellt die Prozedur die <b>Visible<\/b>-Eigenschaft der Registerseiten auf <b>False <\/b>ein und blendet diese damit aus. Au&szlig;erdem werden die Unterformular-Steuerelemente geleert.<\/p>\n<p>Dieser Ansatz funktioniert wie gew&uuml;nscht: Die zuletzt ausgew&auml;hlten Kunden erscheinen auf den Registerseiten und werden &uuml;ber die Registerreiter sch&ouml;n &uuml;bersichtlich angezeigt.<\/p>\n<p>Die Sache hat nur einen Haken: Das F&uuml;llen von bis zu zehn Unterformular-Steuerelementen mit Unterformularen und Daten dauert einige Augenblicke und das Formular flackert auch recht ordentlich.<\/p>\n<p>Wir m&uuml;ssen also noch etwas an der Performance arbeiten.<\/p>\n<p><b>Optimierung der Anzeige der Unterformulare<\/b><\/p>\n<p>Hier gibt es gleich mehrere Ans&auml;tze. Der erste kommt einem automatisch in den Sinn, wenn es um mehrere Unterformulare im Registersteuerelement geht. Man k&ouml;nnte hier daf&uuml;r sorgen, dass die Inhalte der Unterformulare erst eingelesen werden, wenn das jeweilige Unterformular auch erscheint.<\/p>\n<p>Der zweite Ansatz ist: M&uuml;ssen die Unterformulare &uuml;berhaupt geleert werden, also muss man die Eigenschaft <b>SourceObject <\/b>(<b>Herkunftsobjekt<\/b>) eigentlich immer auf eine leere Zeichenkette einstellen und dann erneut mit dem Wert <b>sfmKunden <\/b>f&uuml;llen Sicher nicht, wenn ohnehin immer das gleiche Unterformular angezeigt wird.<\/p>\n<p>Dies schauen wir uns zuerst an. Wir entfernen also die folgende Zeile aus der <b>Do While<\/b>-Schleife:<\/p>\n<pre>.SourceObject = \"sfmKunden\"<\/pre>\n<p>Au&szlig;erdem l&ouml;schen wir die folgenden Zeilen aus der <b>If&#8230;Then<\/b>-Schleife:<\/p>\n<pre><span style=\"color:blue;\">With<\/span> Me(\"sfm\" & Format(i + 1, \"00\"))\r\n     .SourceObject = \"\"\r\nEnd <span style=\"color:blue;\">With<\/span><\/pre>\n<p>Der erste Testlauf danach zeigt: Das war schon die halbe Miete! Damit haben wir sicher 50% Zeit herausgeholt.<\/p>\n<p>Allerdings flackert es immer noch recht ordentlich, wenn man bei zehn gef&uuml;llten Registerseiten die Seite vorne links neu f&uuml;llt und alle Elemente um eines nach rechts verschiebt.<\/p>\n<p>Aber auch hier gibt es einen Ansatzpunkt: Warum nicht einfach die Reihenfolge der Registerseiten so verschieben, dass das letzte Element an die erste Stelle r&uuml;ckt und mit den Daten des zuletzt angeklickten Kundendatensatzes gef&uuml;llt wird und die &uuml;brigen Registerseiten alle um eine Position nach rechts verschoben werden<\/p>\n<p>Genau genommen gelingt dies sogar noch viel einfacher: Wir brauchen lediglich die Eigenschaft <b>PageIndex <\/b>des letzten Elements auf den Wert <b>0 <\/b>einzustellen und alle &uuml;brigen Elemente rutschen eine Position weiter nach rechts.<\/p>\n<p>Nun m&uuml;ssen wir nur noch die ganz links befindliche Registerseite sichtbar machen und aktualisieren. Dazu ermitteln wir zun&auml;chst den Namen des Unterformulars, das sich auf dieser Registerseite befindet. Diesen erhalten wir mit folgender Anweisung:<\/p>\n<pre>Me!regKunden.Pages(0).Controls(0).Name<\/pre>\n<p>Allerdings k&ouml;nnen wir ihm Rahmen dieser Umstellung gleich noch eine Menge weiterer Optimierungen vornehmen. Zusammengefasst kommen wir dann zu der nachfolgend vorgestellten Variante.<\/p>\n<p><b>Einlesen beim Laden<\/b><\/p>\n<p>Der erste Teil der fertigen L&ouml;sung besteht aus dem Laden der bereits in der Tabelle <b>tblLetzteKunden<\/b> gespeicherten Eintr&auml;ge und dem Einstellen des Registersteuerelements auf die dort vorgefundenen Datens&auml;tze &#8211; dies alles gleich beim &ouml;ffnen des Formulars.<\/p>\n<p>Das Ereignis <b>Beim Laden<\/b> l&ouml;st die Prozedur aus Listing 4 aus. Diese &ouml;ffnet ein Recordset mit den neuesten zehn Eintr&auml;gen der Tabelle <b>tblLetzteKunden <\/b>und durchl&auml;uft dieses dann in einer <b>Do While<\/b>-Schleife. Darin stellt sie zun&auml;chst die Eigenschaft <b>Visible <\/b>der Registerseite mit dem in der Variablen <b>intGefuellt <\/b>gespeicherten Indexwert auf <b>True <\/b>und blendet diese somit ein. Die Variable <b>intGefuellt <\/b>wird mit jedem Schleifendurchlauf um eins erh&ouml;ht &#8211; aber erst weiter unten. Dann folgt ein Schritt, den wir in der vorherigen Variante noch nicht ber&uuml;cksichtigt hatten: Wir tragen f&uuml;r die Eigenschaft <b>Tag <\/b>der aktuellen Registerseite den Prim&auml;rschl&uuml;sselwert des Kunden ein, der auf dieser Registerseite angezeigt werden soll. Wozu wir diesen ben&ouml;tigen, erfahren Sie weiter unten. Danach stellen wir die Bezeichnung auf den Wert des Feldes <b>Firma<\/b> f&uuml;r den auf dieser Registerseite darzustellenden Kunden ein, den wir per <b>DLookup <\/b>aus der Tabelle <b>tblKunden <\/b>ermitteln.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rstLetzteKunden<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intGefuellt<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> rstLetzteKunden = db.OpenRecordset( _\r\n         \"SELECT TOP 10 LetzterKunde FROM tblLetzteKunden ORDER BY LetzterKundeID DESC\", _\r\n         dbOpenDynaset)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rstLetzteKunden.EOF\r\n         Me!regKunden.Pages(intGefuellt).Visible = <span style=\"color:blue;\">True<\/span>\r\n         Me!regKunden.Pages(intGefuellt).Tag = rstLetzteKunden!LetzterKunde\r\n         Me!regKunden.Pages(intGefuellt).Caption = DLookup(\"Firma\", \"tblKunden\", _\r\n             \"KundeID = \" & rstLetzteKunden!LetzterKunde)\r\n         intGefuellt = intGefuellt + 1\r\n         <span style=\"color:blue;\">With<\/span> Me(\"sfm\" & Format(intGefuellt, \"00\"))\r\n             .Form.RecordSource = \"SELECT * FROM tblKunden WHERE KundeID = \" _\r\n                 & rstLetzteKunden!LetzterKunde\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         rstLetzteKunden.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     For i = intGefuellt To 9\r\n         Me!regKunden.Pages(i).Visible = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Laden der Eintr&auml;ge beim &ouml;ffnen des Formulars<\/span><\/b><\/p>\n<p>Erst dann erh&ouml;hen wir <b>intGefuellt <\/b>um den Wert <b>1 <\/b>und stellen anschlie&szlig;end die Datenherkunft des Unterformulars dieser Registerseite auf die entsprechende <b>SELECT<\/b>-Abfrage ein. <b>intGefuellt <\/b>liefert dabei den Index f&uuml;r den Namen des Unterformular-Steuerelements (zum Beispiel <b>sfm01<\/b>). Dies erledigt die Schleife nun f&uuml;r alle Datens&auml;tze des Recordsets. Sollte dieses weniger als zehn Datens&auml;tze enthalten, blendet die folgende <b>If&#8230;Then<\/b>-Schleife noch die nicht genutzten Registerseiten aus.<\/p>\n<p><b>Letzte Kunden zur&uuml;cksetzen<\/b><\/p>\n<p>Bisher haben wir noch keine M&ouml;glichkeit vorgesehen, wie der Benutzer die zuletzt angezeigten Kunden l&ouml;schen kann, um wieder ein leeres Registersteuerelement zu erhalten. Dies erledigen wir mit einer neuen Schaltfl&auml;che oben im Formular (s. Bild 10).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_01\/pic_967_010.png\" alt=\"Schaltfl&auml;che zum Leeren des Registersteuerelements\" width=\"575\" height=\"211,3828\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Schaltfl&auml;che zum Leeren des Registersteuerelements<\/span><\/b><\/p>\n<p>Die beim Anklicken dieser Schaltfl&auml;che ausgel&ouml;ste Prozedur finden Sie in Listing 5. Die Prozedur l&ouml;scht zun&auml;chst alle Datens&auml;tze aus der Tabelle <b>tblLetzteKunden<\/b>. Dann durchl&auml;uft sie in einer <b>For&#8230;Next<\/b>-Schleife alle Registerseiten des Registersteuerelements. Dabei stellt sie die Eigenschaft <b>Visible <\/b>der Registerseiten auf den Wert <b>False <\/b>ein und blendet diese somit aus. Au&szlig;erdem stellt sie die Eigenschaft <b>Tag <\/b>auf eine leere Zeichenkette ein und leert die Eigenschaft <b>RecordSource <\/b>der Unterformulare auf den Registerseiten.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdRegisterLeeren_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     db.Execute \"DELETE FROM tblLetzteKunden\", dbFailOnError\r\n     For i = 9 To 0 Step -1\r\n         Me!regKunden.Pages(i).Visible = <span style=\"color:blue;\">False<\/span>\r\n         Me!regKunden.Pages(i).Tag = \"\"\r\n         Me!regKunden.Pages(i).Controls(0).Form.RecordSource = \"\"\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     <span style=\"color:blue;\">Set<\/span> db = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Leeren der Registerseiten<\/span><\/b><\/p>\n<p><b>Anzeigen eines neuen Kunden<\/b><\/p>\n<p>Die Prozedur, die per Doppelklick einen neuen Kundendatensatz auf der ersten Registerseite abbilden und alle bereits vorhandenen Kunden nach rechts verschieben soll, haben wir komplett &uuml;berarbeitet. Die neue Version der durch das Ereignis <b>Beim Doppelklicken<\/b> ausgel&ouml;sten Ereignisprozedur sieht nun wie in Listing 6 aus.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>lstKunden_DblClick(Cancel<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>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rstLetzteKunden<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSubform<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolEnthalten<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     Me.Painting = <span style=\"color:blue;\">False<\/span>\r\n     lngKundeID = Me!lstKunden\r\n     db.Execute \"DELETE FROM tblLetzteKunden WHERE LetzterKunde = \" _\r\n         & lngKundeID, dbFailOnError\r\n     db.Execute \"INSERT INTO tblLetzteKunden(LetzterKunde) VALUES(\" _\r\n         & lngKundeID & \")\", dbFailOnError\r\n     <span style=\"color:blue;\">Set<\/span> rstLetzteKunden = db.OpenRecordset( _\r\n         \"SELECT TOP 10 LetzterKunde FROM tblLetzteKunden ORDER BY LetzterKundeID DESC\", _\r\n         dbOpenDynaset)\r\n     rstLetzteKunden.MoveLast\r\n     For i = 0 To rstLetzteKunden.RecordCount - 1\r\n         <span style=\"color:blue;\">If <\/span>Me!regKunden.Pages(i).Tag = lngKundeID<span style=\"color:blue;\"> Then<\/span>\r\n             bolEnthalten = <span style=\"color:blue;\">True<\/span>\r\n             Me!regKunden.Pages(i).PageIndex = 0\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         Me!regKunden.Pages(i).Visible = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     For i = rstLetzteKunden.RecordCount To 9\r\n         Me!regKunden.Pages(i).Visible = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> bolEnthalten And rstLetzteKunden.RecordCount &gt; 1<span style=\"color:blue;\"> Then<\/span>\r\n         Me!regKunden.Pages(rstLetzteKunden.RecordCount - 1).PageIndex = 0\r\n         Me!regKunden.Pages(rstLetzteKunden.RecordCount - 1).Visible = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Me!regKunden = 0\r\n     strSubform = Me!regKunden.Pages(0).Controls(0).Name\r\n     Me!regKunden.Pages(0).Caption = DLookup(\"Firma\", \"tblKunden\", \"KundeID = \" & lngKundeID)\r\n     Me!regKunden.Pages(0).Controls(strSubform).Form.RecordSource = _\r\n         \"SELECT * FROM tblKunden WHERE KundeID = \" & lngKundeID\r\n     Me.Painting = <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: &ouml;ffnen eines neuen Elements auf der ersten Registerseite<\/span><\/b><\/p>\n<p>Die Prozedur stellt zu Beginn die Eigenschaft <b>Painting <\/b>des Formulars auf <b>False <\/b>ein und deaktiviert so tempor&auml;r das Neuzeichnen des Formulars. Dies erspart uns das sonst auftretende Flackern beim Ein- und Ausblenden und Verschieben von Elementen. Dann speichert sie den Prim&auml;rschl&uuml;sselwert des im Listenfeld angeklickten Kunden in der Variablen <b>lngKundeID<\/b>.<\/p>\n<p>Dann folgen zwei Schritte, die Sie bereits aus der ersten Version der Prozedur kennen: Das L&ouml;schen des Datensatzes aus der Tabelle <b>tblLetzterKunde<\/b>, dessen Feld <b>LetzterKunde <\/b>mit dem Wert aus <b>lngKundeID <\/b>&uuml;bereinstimmt, sowie das Neuanlegen dieses Datensatzes. Dann &ouml;ffnet die Prozedur wiederum ein Recordset auf Basis der zuletzt angelegten zehn Datens&auml;tze in der Tabelle <b>tblLetzteKunden<\/b>. Dieses ist diesmal allerdings nicht dazu vorgesehen, alle Datens&auml;tze zu durchlaufen und dabei die Registerseiten entsprechend zu best&uuml;cken. Wir wollen damit lediglich die Anzahl der maximal zehn zuletzt angelegten Datens&auml;tze ermitteln und in der Variablen <b>intAnzahlKunden <\/b>speichern.<\/p>\n<p>Diesen Wert ben&ouml;tigen wir zuerst in einer <b>For&#8230;Next<\/b>-Schleife &uuml;ber die Werte von <b>0 <\/b>bis zur Anzahl der Datens&auml;tze minus eins. Innerhalb der Schleife pr&uuml;ft die Prozedur in einer <b>If&#8230;Then<\/b>-Bedingung, ob die <b>Tag<\/b>-Eigenschaft der Registerseite mit dem Wert der Laufvariablen <b>i <\/b>als Index mit dem in <b>lngKundeID <\/b>gespeicherten Wert &uuml;bereinstimmt &#8211; sprich: ob die aktuelle Registerseite zuf&auml;llig bereits den Kunden anzeigt, den der Benutzer gerade im Listenfeld doppelt angeklickt hat.<\/p>\n<p>Sie erinnern sich: Den Prim&auml;rschl&uuml;sselwert des jeweils im Unterformular einer Registerseite angezeigten Kunden hatten wir ja in der <b>Tag<\/b>-Eigenschaft der entsprechenden Registerseite gespeichert.<\/p>\n<p>In diesem Fall stellen wir die <b>Boolean<\/b>-Variable <b>bolEnthalten <\/b>auf den Wert <b>True <\/b>ein und stellen die Eigenschaft <b>PageIndex <\/b>der Registerseite auf den Wert <b>0 <\/b>ein. Das hei&szlig;t, dass wir diese Registerseite ganz nach links verschieben.<\/p>\n<p>Schlie&szlig;lich machen wir, unabh&auml;ngig davon, ob die Seite den aktuell angeklickten Kunden anzeigt, die Seite mit <b>Visible = True <\/b>sichtbar. Auf diese Weise verf&auml;hrt die Prozedur mit der dem Wert der Variablen <b>intAnzahlKunden <\/b>entsprechenden Menge von Registerseiten.<\/p>\n<p>Danach k&uuml;mmert sie sich in einer weiteren Schleife um die &uuml;brigen Registerseiten &#8211; also um diejenigen Seiten, in denen keine Kundendaten angezeigt werden sollen. Dies geschieht allerdings nur, wenn <b>intAnzahlKunden <\/b>kleiner als zehn ist. In dem Fall stellt die Prozedur die <b>Visible<\/b>-Eigenschaften der hinteren Registerseiten auf den Wert <b>False <\/b>ein und blendet diese damit aus.<\/p>\n<p>Sollte der im Listenfeld angeklickte Kunde noch nicht auf einer der Registerseiten abgebildet worden sein, kommt die folgende <b>If&#8230;Then<\/b>-Bedingung zum Tragen: Hat <b>bolEnthalten <\/b>den Wert <b>False <\/b>und ist die Anzahl der Kunden aus <b>intAnzahlKunden <\/b>gr&ouml;&szlig;er als eins, verschiebt die Prozedur zun&auml;chst alle gef&uuml;llten und sichtbaren Registerseiten um eine Position nach rechts, indem sie eine nicht gef&uuml;llte Registerseite nach links vorn holt.<\/p>\n<p>Dazu stellt es die Eigenschaft <b>PageIndex <\/b>der Registerseite, deren Index der Anzahl der Kunden minus eins entspricht, auf den Wert <b>0 <\/b>ein. Au&szlig;erdem wird diese Seite &uuml;ber die <b>Visible<\/b>-Eigenschaft eingeblendet.<\/p>\n<p>Nachdem die Sortierung der Registerseiten abgeschlossen ist, soll die Registerseite ganz links angezeigt werden, was wir durch das Einstellen der <b>Value<\/b>-Eigenschaft auf den Wert <b>0 <\/b>erreichen (die <b>Value<\/b>-Eigenschaft ist die Standard-eigenschaft einer Registerseite, daher kann man diese auch weglassen).<\/p>\n<p>Fehlt noch das F&uuml;llen des Unterformulars der nun nach vorne links geholten Registerseite. Den Namen des enthaltenen Unterformulars m&uuml;ssen wir erst noch ermitteln, denn nach dem wiederholten Aufrufen einiger Kundendatens&auml;tze ger&auml;t die Reihenfolge der Unterformulare auf den Registerseiten ordentlich durcheinander.<\/p>\n<p>Also ermittelt die Prozedur &uuml;ber die <b>Name<\/b>-Eigenschaft des ersten Steuerelements der ersten Registerseite den Namen des Unterformular-Steuerelements und speichert diesen in der Variablen <b>strSubform<\/b>. Dann stellt sie die Beschriftung der Registerseite auf den Namen des Feldes <b>Firma <\/b>des angezeigten Datensatzes ein.<\/p>\n<p>Schlie&szlig;lich folgt die Zuordnung der passenden Datenherkunft &uuml;ber die Eigenschaft RecordSource des Unterformular-Steuerelements, das wir dank der Kenntnis des Namens des Unterformular-Steuerelements nun leicht referenzieren k&ouml;nnen.<\/p>\n<p>Damit sind wir fast fertig &#8211; wir m&uuml;ssen nur noch die Eigenschaft <b>Painting <\/b>wieder auf den Wert <b>True <\/b>einstellen. Sollten Sie diese Anweisung vergessen oder tritt in der Prozedur ein Fehler auf, woraufhin diese abgebrochen wird, friert das Formular ein &#8211; Sie k&ouml;nnen es dann nicht mehr bedienen oder &uuml;ber das Formular selbst schlie&szlig;en. Sie m&uuml;ssen es dann beispielsweise &uuml;ber den Navigationsbereich im Entwurf &ouml;ffnen und k&ouml;nnen es erst dann schlie&szlig;en.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Die L&ouml;sung dieses Beitrags liefert eine einfache M&ouml;glichkeit, die zuletzt aufgerufenen Kunden schnell einzusehen.<\/p>\n<p>Im ersten Ansatz zeigen wir, zu welchen performancetechnischen Problemen es kommen kann, wenn man den Fokus bei der Programmierung lediglich auf die Erf&uuml;llung der geplanten Funktion legt.<\/p>\n<p>Sp&auml;ter optimieren wir diese L&ouml;sung dann durch einige Tricks, was gute Kenntnis der M&ouml;glichkeiten von Registersteuerelement und von Unterformularen voraussetzt.<\/p>\n<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>RegisterkartenFuerVerschiedeneDatensaetze.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/7465B6F5-C9A0-42BC-9567-1867F7E7DDBC\/aiu_967.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Normalerweise verwendet man verschiedene Registerkarten, um unterschiedliche Daten anzuzeigen &#8211; beispielsweise auf dem Hauptformular die Basis-Daten zu einem Kunden wie Kundennummer und Name und auf den Registerkarten Informationen wie die Lieferanschrift, die Rechnungsanschrift und weitere Daten. Wir wollen in diesem Beitrag einmal zeigen, wie Sie verschiedene Datens&auml;tze der gleichen Tabelle auf Registerseiten anzeigen &#8211; beispielsweise, um die letzten zehn angezeigten Kunden immer schnell aufschlagen zu k&ouml;nnen.<\/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":[66012015,662015,44000023],"tags":[],"class_list":["post-55000967","post","type-post","status-publish","format-standard","hentry","category-66012015","category-662015","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>Registerkarten f&uuml;r verschiedene Datens&auml;tze - 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\/Registerkarten_fuer_verschiedene_Datensaetze\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Registerkarten f&uuml;r verschiedene Datens&auml;tze\" \/>\n<meta property=\"og:description\" content=\"Normalerweise verwendet man verschiedene Registerkarten, um unterschiedliche Daten anzuzeigen - beispielsweise auf dem Hauptformular die Basis-Daten zu einem Kunden wie Kundennummer und Name und auf den Registerkarten Informationen wie die Lieferanschrift, die Rechnungsanschrift und weitere Daten. Wir wollen in diesem Beitrag einmal zeigen, wie Sie verschiedene Datens&auml;tze der gleichen Tabelle auf Registerseiten anzeigen - beispielsweise, um die letzten zehn angezeigten Kunden immer schnell aufschlagen zu k&ouml;nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Registerkarten_fuer_verschiedene_Datensaetze\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2022-03-02T12:06:07+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/6944affbdb9e440592579fa7077a4dfd\" \/>\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=\"21\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Registerkarten_fuer_verschiedene_Datensaetze\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Registerkarten_fuer_verschiedene_Datensaetze\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Registerkarten f&uuml;r verschiedene Datens&auml;tze\",\"datePublished\":\"2022-03-02T12:06:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Registerkarten_fuer_verschiedene_Datensaetze\\\/\"},\"wordCount\":3712,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Registerkarten_fuer_verschiedene_Datensaetze\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/6944affbdb9e440592579fa7077a4dfd\",\"articleSection\":[\"1\\\/2015\",\"2015\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Registerkarten_fuer_verschiedene_Datensaetze\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Registerkarten_fuer_verschiedene_Datensaetze\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Registerkarten_fuer_verschiedene_Datensaetze\\\/\",\"name\":\"Registerkarten f&uuml;r verschiedene Datens&auml;tze - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Registerkarten_fuer_verschiedene_Datensaetze\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Registerkarten_fuer_verschiedene_Datensaetze\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/6944affbdb9e440592579fa7077a4dfd\",\"datePublished\":\"2022-03-02T12:06:07+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Registerkarten_fuer_verschiedene_Datensaetze\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Registerkarten_fuer_verschiedene_Datensaetze\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Registerkarten_fuer_verschiedene_Datensaetze\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/6944affbdb9e440592579fa7077a4dfd\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/6944affbdb9e440592579fa7077a4dfd\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Registerkarten_fuer_verschiedene_Datensaetze\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Registerkarten f&uuml;r verschiedene Datens&auml;tze\"}]},{\"@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":"Registerkarten f&uuml;r verschiedene Datens&auml;tze - 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\/Registerkarten_fuer_verschiedene_Datensaetze\/","og_locale":"de_DE","og_type":"article","og_title":"Registerkarten f&uuml;r verschiedene Datens&auml;tze","og_description":"Normalerweise verwendet man verschiedene Registerkarten, um unterschiedliche Daten anzuzeigen - beispielsweise auf dem Hauptformular die Basis-Daten zu einem Kunden wie Kundennummer und Name und auf den Registerkarten Informationen wie die Lieferanschrift, die Rechnungsanschrift und weitere Daten. Wir wollen in diesem Beitrag einmal zeigen, wie Sie verschiedene Datens&auml;tze der gleichen Tabelle auf Registerseiten anzeigen - beispielsweise, um die letzten zehn angezeigten Kunden immer schnell aufschlagen zu k&ouml;nnen.","og_url":"https:\/\/access-im-unternehmen.de\/Registerkarten_fuer_verschiedene_Datensaetze\/","og_site_name":"Access im Unternehmen","article_published_time":"2022-03-02T12:06:07+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/6944affbdb9e440592579fa7077a4dfd","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"21\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Registerkarten_fuer_verschiedene_Datensaetze\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Registerkarten_fuer_verschiedene_Datensaetze\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Registerkarten f&uuml;r verschiedene Datens&auml;tze","datePublished":"2022-03-02T12:06:07+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Registerkarten_fuer_verschiedene_Datensaetze\/"},"wordCount":3712,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Registerkarten_fuer_verschiedene_Datensaetze\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/6944affbdb9e440592579fa7077a4dfd","articleSection":["1\/2015","2015","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Registerkarten_fuer_verschiedene_Datensaetze\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Registerkarten_fuer_verschiedene_Datensaetze\/","url":"https:\/\/access-im-unternehmen.de\/Registerkarten_fuer_verschiedene_Datensaetze\/","name":"Registerkarten f&uuml;r verschiedene Datens&auml;tze - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Registerkarten_fuer_verschiedene_Datensaetze\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Registerkarten_fuer_verschiedene_Datensaetze\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/6944affbdb9e440592579fa7077a4dfd","datePublished":"2022-03-02T12:06:07+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Registerkarten_fuer_verschiedene_Datensaetze\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Registerkarten_fuer_verschiedene_Datensaetze\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Registerkarten_fuer_verschiedene_Datensaetze\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/6944affbdb9e440592579fa7077a4dfd","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/6944affbdb9e440592579fa7077a4dfd"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Registerkarten_fuer_verschiedene_Datensaetze\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Registerkarten f&uuml;r verschiedene Datens&auml;tze"}]},{"@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\/55000967","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=55000967"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000967\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000967"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000967"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000967"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}