{"id":55001019,"date":"2016-02-01T00:00:00","date_gmt":"2020-05-22T19:04:10","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1019"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Kontakte_verwalten","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Kontakte_verwalten\/","title":{"rendered":"Kontakte verwalten"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/d35d6cf6b1ea4035b444d39f7759022a\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Im Beitrag &#8222;Mehrere Datens&auml;tze pro Spalte in Formularen&#8220; haben wir gezeigt, wie Sie mehrere Unterformulare in einem Formular mit jeweils einem Datensatz f&uuml;llen, sodass der Eindruck entsteht, die Datens&auml;tze seien innerhalb des Formulars in Spalten und Zeilen arrangiert. Im vorliegenden Beitrag zeigen wir ein Beispiel f&uuml;r den praktischen Einsatz dieser L&ouml;sung. Dabei wollen wir die Daten einer Kundendatenbank wie in der Kontakte-Ansicht von Outlook als Visitenkarten darstellen &#8211; mit der zus&auml;tzlichen Option, einen Kontakt direkt von der &uuml;bersicht aus l&ouml;schen zu k&ouml;nnen.<\/b><\/p>\n<p>Im Beitrag <b>Mehrere Datens&auml;tze pro Spalte in Formularen <\/b>(<b>www.access-im-unternehmen.de\/1010<\/b>) haben wir ja einigen Code in den Klassenmodulen des Haupt- und Unterformulars untergebracht, der teilweise auch noch an die verwendete Datenherkunft (die Tabelle <b>tblKunden<\/b>) angepasst war.<\/p>\n<p>Wenn Sie die dort vorgestellten Techniken in weiteren Formularen nutzen wollen, sollten Sie nicht immer den kompletten Code &uuml;bertragen und anpassen m&uuml;ssen.<\/p>\n<p>Deshalb haben wir den Code in zwei Klassenmodule ausgelagert. Diese m&uuml;ssen Sie nur noch f&uuml;r die gew&uuml;nschte Konfiguration konfigurieren und initialisieren, was mit einem einzigen Befehl m&ouml;glich ist. Damit m&uuml;ssen Sie sich weniger mit der Programmierung auseinandersetzen und k&ouml;nnen sich etwas mehr auf das Design konzentrieren.<\/p>\n<p>Um eine sch&ouml;ne Kontakt&uuml;bersicht wie in Outlook zu erstellen, legen Sie dazu zun&auml;chst ein Hauptformular an, dem Sie die Steuerelemente zum Bl&auml;ttern in den Kontakten hinzuf&uuml;gen. Diese benennen Sie beispielsweise <b>cmdNachOben<\/b>, <b>cmdNachUnten <\/b>und <b>cmdNeu<\/b>. Au&szlig;erdem ben&ouml;tigen Sie noch ein Bezeichnungsfeld zur Anzeige der aktuellen Position, das in diesem Fall <b>lblEintraege <\/b>hei&szlig;en soll.<\/p>\n<p>Das Hauptformular sieht demnach zun&auml;chst wie in Bild 1 aus und erh&auml;lt den Namen <b>frmKontakteVerwalten<\/b>. Um die Optik k&uuml;mmern wir uns sp&auml;ter, wir wollen zun&auml;chst die Funktionalit&auml;t sicherstellen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_01\/pic_1019_001.png\" alt=\"Hauptformular f&uuml;r die Anzeige der Kontakte\" width=\"500\" height=\"272,8873\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Hauptformular f&uuml;r die Anzeige der Kontakte<\/span><\/b><\/p>\n<p>Bevor wir uns um das Unterformular k&uuml;mmern, stellen Sie noch die Eigenschaften <b>Navigationsschaltfl&auml;chen<\/b>, <b>Datensatzmarkierer<\/b>, <b>Bildlaufleisten <\/b>und <b>Trennlinien <\/b>auf den Wert <b>Nein <\/b>ein. Diese Elemente ben&ouml;tigen wir nicht, da das Hauptformular ja komplett ungebunden ist.<\/p>\n<h2>Unterformular erstellen<\/h2>\n<p>Im zweiten Schritt legen Sie ein Unterformular namens <b>sfm-Kon-takteVerwalten <\/b>an, dem Sie &#8211; nur zum Hinzuf&uuml;gen der entsprechenden Steuerelemente &#8211; die zu verwendende Datenherkunft zuweisen. In diesem Fall verwenden wir eine Tabelle namens <b>tblKunden<\/b>, die im Entwurf wie in Bild 2 aussieht.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_01\/pic_1019_002.png\" alt=\"Entwurf der Tabelle mit den anzuzeigenden Kontaktdaten\" width=\"500\" height=\"426,5976\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Entwurf der Tabelle mit den anzuzeigenden Kontaktdaten<\/span><\/b><\/p>\n<p>F&uuml;gen Sie dann die Felder der Tabelle hinzu und ordnen Sie diese wie in Bild 3 an. Da nur ein Datensatz je Unterformular angezeigt werden soll, ben&ouml;tigen wir die Elemente zum Navigieren innerhalb der Datens&auml;tze des Unterformulars nicht. Stellen Sie daher die Eigenschaften <b>Navigationsschaltfl&auml;chen<\/b>, <b>Datensatzmarkierer<\/b>, <b>Bildlaufleisten <\/b>und <b>Trennlinien <\/b>auf den Wert <b>Nein <\/b>ein. Au&szlig;erdem legen Sie den Wert der Eigenschaft <b>Zyklus <\/b>auf <b>Aktueller Datensatz <\/b>fest, damit der Benutzer den Datensatz beim Navigieren mit der <b>Tab<\/b>-Taste nicht wechseln kann.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_01\/pic_1019_003.png\" alt=\"Hinzuf&uuml;gen der Felder zum Unterformular sfmKontakteVerwalten\" width=\"500\" height=\"356,7662\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Hinzuf&uuml;gen der Felder zum Unterformular sfmKontakteVerwalten<\/span><\/b><\/p>\n<p>Au&szlig;erdem f&uuml;gen Sie noch eine Schaltfl&auml;che namens <b>cmdLoeschen <\/b>hinzu, die Sie, genau wie die Schaltfl&auml;chen im Hauptformular, nicht mit einer Ereignisprozedur zu versehen brauchen. Das Unterformular sieht dann in der Formularansicht wie in Bild 4 aus.<\/p>\n<p class=\"image\"><img loading=\"lazy\" decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_01\/pic_1019_004.png\" alt=\"Das Unterformular in der Formularansicht\" width=\"425\" height=\"275\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Das Unterformular in der Formularansicht<\/span><\/b><\/p>\n<p>Wichtig ist hier, dass Sie nur wenig Platz zwischen den Steuerelementen und dem Seitenrand lassen. Nur wenn die Rahmenlinien der enthaltenen Steuerelemente angezeigt werden sollen, lassen Sie einen Abstand von <b>1 <\/b>zwischen den Steuerelementen und den Seitenr&auml;ndern des Detailbereichs des Unterformulars. Abst&auml;nde f&uuml;gen wir sp&auml;ter durch die Positionierung der Unterformulare im Hauptformular hinzu.<\/p>\n<h2>Unterformulare-Steuerelemente einf&uuml;gen<\/h2>\n<p>Nun m&uuml;ssen Sie nur noch Unterformular-Steuerelemente in der gew&uuml;nschten Anzahl zum Hauptformular hinzuf&uuml;gen. Die Betonung liegt auf Unterformular-<b>Steuerelemente<\/b>, denn wir wollen diese Steuerelemente erst zur Laufzeit mit dem Verweis auf das Unterformular selbst f&uuml;llen. Um die Gr&ouml;&szlig;e optimal einzustellen, sollten Sie jedoch f&uuml;rs Erste einfach das komplette Unterformular zum Hauptformular hinzuf&uuml;gen. Dies erledigen Sie am einfachsten, indem Sie das Hauptformular in der Entwurfsansicht &ouml;ffnen und das Unterformular aus dem Navigationsbereich an die gew&uuml;nschte Stelle im Entwurf ziehen.<\/p>\n<p>Hier entfernen Sie zun&auml;chst das Bezeichnungsfeld des Unterformular-Steuerelements. Danach wechseln Sie in die Formularansicht des Hauptformulars, um zu pr&uuml;fen, ob alle Elemente des Unterformulars wie gew&uuml;nscht angezeigt werden. Die Ansicht aus Bild 5 macht uns darauf aufmerksam, dass die st&auml;ndige Wiederholung der Bezeichnungsfelder f&uuml;r jeden Datensatz wohl wenig Sinn macht und eine Menge Platz ben&ouml;tigt &#8211; also gehen wir nochmals in den Entwurf des Unterformulars und entfernen die Bezeichnungsfelder.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_01\/pic_1019_005.png\" alt=\"Erster Test des Unterformulars im Hauptformular\" width=\"425\" height=\"206,8965\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Erster Test des Unterformulars im Hauptformular<\/span><\/b><\/p>\n<p>Nachdem dies erledigt ist, ziehen wir das Unterformular erneut in das Hauptformular und entfernen wieder das Bezeichnungsfeld des Unterformular-Steuerelements. Nun passt alles!<\/p>\n<p>Sie k&ouml;nnen nun das Unterformular mit <b>Strg + C <\/b>kopieren und <b>Strg + V <\/b>so oft in das Formular einf&uuml;gen, wie Sie es w&uuml;nschen. Ordnen Sie die Unterformulare dabei so wie in Bild 6 an und lassen Sie etwas Platz dazwischen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_01\/pic_1019_006.png\" alt=\"Fertig angeordnete Unterformulare\" width=\"650\" height=\"477,4405\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Fertig angeordnete Unterformulare<\/span><\/b><\/p>\n<p>Stellen Sie die Eigenschaft <b>Rahmenart <\/b>des Unterformular-Steuerelements nach Wunsch auf <b>Transparent <\/b>ein, um die Rahmen um jeden Kontakt zu entfernen.<\/p>\n<p>Wenn Sie nun in die Formularansicht wechseln, erhalten Sie die Ansicht aus Bild 7. Alle Unterformulare zeigen den gleichen Datensatz an &#8211; und zwar den ersten, den die Datenherkunft liefert.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_01\/pic_1019_007.png\" alt=\"Alle Unterformulare zeigen den gleichen Datensatz an.\" width=\"500\" height=\"366,5448\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Alle Unterformulare zeigen den gleichen Datensatz an.<\/span><\/b><\/p>\n<p>Das ist auch logisch, denn wir haben dem Formular ja noch keinerlei Logik hinzugef&uuml;gt. Bevor wir dies tun, ist auch noch ein weiterer Schritt n&ouml;tig: Damit die Programmlogik die Unterformulare mit den gew&uuml;nschten Daten f&uuml;llen kann, m&uuml;ssen diese noch entsprechende Namen erhalten.<\/p>\n<p>Daher benennen Sie diese von links nach rechts und dann von oben nach unten mit Namen nach dem Schema <b>sfm-XX<\/b>, wobei <b>XX <\/b>bei <b>00 <\/b>beginnt und dann jeweils um eins erh&ouml;ht wird. Bild 8 zeigt die Namen der Unterformular-Steuerelemente f&uuml;r eine Konfiguration mit drei mal drei Unterformularen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_01\/pic_1019_008.png\" alt=\"Namen der Unterformular-Steuerelemente\" width=\"500\" height=\"374,4048\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Namen der Unterformular-Steuerelemente<\/span><\/b><\/p>\n<h2>Unterformulare f&uuml;llen<\/h2>\n<p>Damit kommen wir zum Einsatz der beiden Klassen <b>clsDatenNebeneinander <\/b>und <b>clsDatenNebeneinanderUnterformular<\/b>. F&uuml;gen Sie dem Formular <b>frmKontakteVerwalten <\/b>eine Prozedur hinzu, die durch das Ereignis <b>Beim Laden <\/b>ausgel&ouml;st wird. Diese erg&auml;nzen Sie um eine der Anweisungen aus Listing 1.<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objDatenNebeneinander<span style=\"color:blue;\"> As <\/span>clsDatenNebeneinander\r\n<span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Set<\/span> objDatenNebeneinander = <span style=\"color:blue;\">New<\/span> clsDatenNebeneinander\r\n     <span style=\"color:blue;\">With<\/span> objDatenNebeneinander\r\n         .Initialisieren Me, Me!cmdNachUnten, Me!cmdNachOben, Me!cmdNeu, Me!lblEintraege, \"sfmKontakteVerwalten\", _\r\n             \"tblKunden\", \"KundeID\", \"cmdLoeschen\"\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 1: Initialisieren der Unterformulare und der Funktionen zum Bl&auml;ttern, Anlegen und L&ouml;schen<\/span><\/b><\/p>\n<p>Hier deklarieren wir zun&auml;chst eine Objektvariable des Typs <b>clsDatenNebeneinander <\/b>im Kopf des Klassenmoduls. Dies bewirkt, dass das Objekt auch nach dem Beenden der <b>Form_Load<\/b>-Prozedur, welche die Variable f&uuml;llt, noch vorhanden ist. Die <b>Form_Load<\/b>-Prozedur erstellt ein neues Objekt auf Basis der Klasse <b>clsDatenNebeneinander <\/b>und speichert den Verweis darauf in der Variablen <b>objDatenNebeneinander<\/b>. Nun fehlt nur noch ein Schritt, n&auml;mlich das &uuml;bergeben der Daten f&uuml;r die Funktion dieser Klasse. Dies erfolgt mit der Methode <b>Initialisieren<\/b>, welche die folgenden Parameter erwartet:<\/p>\n<ul>\n<li><b>frm<\/b>: Verweis auf das aufrufende Formular, einfach per <b>Me <\/b>zu &uuml;bergeben<\/li>\n<li><b>cmdNachUnten<\/b>: Verweis auf die Schaltfl&auml;che, mit der eine Seite nach unten gebl&auml;ttert werden soll (im Beispiel <b>cmdNachUnten<\/b>)<\/li>\n<li><b>cmdNachOben<\/b>: Verweis auf die Schaltfl&auml;che, mit der eine Seite nach oben gebl&auml;ttert werden soll (hier <b>cmdNachOben<\/b>)<\/li>\n<li><b>cmdNeu<\/b>: Schaltfl&auml;che zum Anlegen eines neuen Datensatzes (hier <b>cmdNeu<\/b>)<\/li>\n<li><b>lblEintraege<\/b>: Bezeichnungsfeld, das die aktuelle Position anzeigen soll<\/li>\n<li><b>strSubform<\/b>: Name des Unterformulars, das in den Unterformular-Steuerelementen angezeigt werden soll, hier <b>sfmKontakteVerwalten<\/b><\/li>\n<li><b>strRecordsource<\/b>: Datenherkunft f&uuml;r die Unterformulare, hier <b>tblKunden<\/b><\/li>\n<li><b>strPrimaerschluessel<\/b>: Name des Prim&auml;rschl&uuml;sselfeldes der Datenherkunft, hier <b>KundeID<\/b><\/li>\n<li><b>strLoeschen<\/b>: Name der L&ouml;schen-Schaltfl&auml;che im Unterformular, hier <b>cmdLoeschen<\/b><\/li>\n<\/ul>\n<p><!--30percent--><\/p>\n<p>&ouml;ffnen Sie das Formular nun in der Formularansicht, erhalten Sie die gew&uuml;nschten Daten wie in Bild 9. Das Vor- und Zur&uuml;ckbl&auml;ttern gelingt ebenso wie das Anlegen neuer und das L&ouml;schen vorhandener Datens&auml;tze.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_01\/pic_1019_009.png\" alt=\"Formular mit gef&uuml;llten Unterformularen\" width=\"650\" height=\"450,8197\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Formular mit gef&uuml;llten Unterformularen<\/span><\/b><\/p>\n<h2>Technische Hintergr&uuml;nde<\/h2>\n<p>Es stellt sich nun zum Beispiel noch die Frage, warum der Aufruf der Methode <b>Initialisieren <\/b>keine Angabe der Anzahl der zu f&uuml;llenden Unterformulare enth&auml;lt.<\/p>\n<p>Der Grund ist einfach: Wenn Sie die Unterformular-Steuer-elemente nach den Vorgaben benennen, also mit <b>sfm00<\/b>, <b>sfm01 <\/b>und so weiter, durchl&auml;uft die Klasse diese einfach und f&uuml;llt alle vorhandenen Unterformulare.<\/p>\n<p>Erst, wenn es das n&auml;chste Unterformular-Steuerelement in der Reihenfolge nicht mehr findet, geht es davon aus, dass es alle Unterformulare gef&uuml;llt hat.<\/p>\n<p>Gegen&uuml;ber der Basisversion, die wir im Beitrag <b>Mehrere Datens&auml;tze pro Spalte in Formularen <\/b>(<b>www.access-im-unternehmen.de\/1010<\/b>) vorgestellt haben, mussten wir nat&uuml;rlich einige Elemente umbauen &#8211; immerhin sollte ja die komplette Funktionalit&auml;t, die dort in Haupt- und Unterformular steckte, nun in zwei Klassen ausgelagert werden, die nur noch per <b>Initialisieren<\/b>-Methode aufgerufen werden sollen.<\/p>\n<h2>Formulare mit Leben f&uuml;llen<\/h2>\n<p>Diese Methode ist dann auch das steuerende Element, wenn es um die Vorbereitung des Formulars geht (s. Listing 2).<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Initialisieren(frm<span style=\"color:blue;\"> As <\/span>Form, cmdNachUnten<span style=\"color:blue;\"> As <\/span>CommandButton, cmdNachOben<span style=\"color:blue;\"> As <\/span>CommandButton, _\r\n         cmdNeu<span style=\"color:blue;\"> As <\/span>CommandButton, lblEintraege<span style=\"color:blue;\"> As <\/span>Label, strSubform<span style=\"color:blue;\"> As String<\/span>, strRecordsource<span style=\"color:blue;\"> As String<\/span>, _\r\n         strPrimaerschluessel<span style=\"color:blue;\"> As String<\/span>, strLoeschen<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> m_Form = frm\r\n     <span style=\"color:blue;\">Set<\/span> m_NachOben = cmdNachOben\r\n     <span style=\"color:blue;\">With<\/span> m_NachOben\r\n         .OnClick = \"[Event Procedure]\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> m_NachUnten = cmdNachUnten\r\n     <span style=\"color:blue;\">With<\/span> m_NachUnten\r\n         .OnClick = \"[Event Procedure]\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> m_Neu = cmdNeu\r\n     <span style=\"color:blue;\">With<\/span> m_Neu\r\n         .OnClick = \"[Event Procedure]\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> m_Eintraege = lblEintraege\r\n     m_Recordsource = strRecordsource\r\n     m_Primaerschluesselfeld = strPrimaerschluessel\r\n     m_Subform = strSubform\r\n     m_strLoeschen = strLoeschen\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objSubform = m_Form(\"sfm00\")\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">If <\/span>objSubform.Form.HasModule = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Die Eigenschaft ''Enth&auml;lt Modul'' muss f&uuml;r das Formular ''\" & m_Subform & \"'' auf ''Ja'' eingestellt werden.\"\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> objSubform Is Nothing\r\n         i = i + 1\r\n         objSubform.SourceObject = m_Subform\r\n         <span style=\"color:blue;\">Set<\/span> objSubform = Nothing\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objSubform = m_Form(\"sfm\" & Format(i, \"00\"))\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     intUnterformulare = i\r\n     m_Form_Load\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Die Methode zum Initialisieren von Haupt- und Unterformularen samt Steuerelementen<\/span><\/b><\/p>\n<p>Die erwarteten Parameter haben wir ja weiter oben bereits besprochen. Die Methode f&uuml;llt zun&auml;chst einige Membervariablen mit Verweisen auf die jeweiligen Elemente. Diese werden im Klassenmodul <b>clsDatenNebeneinander <\/b>wie folgt deklariert und mit dem f&uuml;hrenden Buchstaben <b>m <\/b>und einem Unterstrich charakterisiert:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>WithEvents m_Form<span style=\"color:blue;\"> As <\/span>Form\r\n<span style=\"color:blue;\">Dim <\/span>WithEvents m_NachOben<span style=\"color:blue;\"> As <\/span>CommandButton\r\n<span style=\"color:blue;\">Dim <\/span>WithEvents m_NachUnten<span style=\"color:blue;\"> As <\/span>CommandButton\r\n<span style=\"color:blue;\">Dim <\/span>WithEvents m_Neu<span style=\"color:blue;\"> As <\/span>CommandButton\r\n<span style=\"color:blue;\">Dim <\/span>m_Recordsource<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Dim <\/span>m_Subform<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Dim <\/span>m_Primaerschluesselfeld<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Dim <\/span>m_Eintraege<span style=\"color:blue;\"> As <\/span>Label\r\n<span style=\"color:blue;\">Dim <\/span>m_strLoeschen<span style=\"color:blue;\"> As String<\/span><\/pre>\n<p>Einige Variablen sind mit dem Schl&uuml;sselwort <b>WithEvents <\/b>deklariert, was bedeutet, dass wir f&uuml;r diese in der gleichen Klasse auch noch Ereignisprozeduren implementieren wollen &#8211; etwa, um das Ereignis, das beim Klicken auf die Schaltfl&auml;che <b>cmdNachUnten <\/b>ausgel&ouml;st wird, innerhalb der Klasse <b>clsDatenNebeneinander <\/b>unterbringen zu k&ouml;nnen und nicht im Klassenmodul des Formulars.<\/p>\n<p>Es fehlt aber noch eine Variable f&uuml;r die Schaltfl&auml;che <b>cmdLoeschen<\/b> Das ist richtig, allerdings wird diese ja f&uuml;r jedes Unterformular ben&ouml;tigt &#8211; und wir legen sp&auml;ter f&uuml;r jedes Unterformular eine Instanz der Klasse <b>clsDatenNebeneinanderUnterformular <\/b>an, welche sich dann um die Eigenschaften der Unterformulare k&uuml;mmert.<\/p>\n<p>Neben diesen Membervariablen ben&ouml;tigen wir noch einige weitere lokale Variablen:<\/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>\r\n<span style=\"color:blue;\">Dim <\/span>objSubform<span style=\"color:blue;\"> As <\/span>Subform\r\n<span style=\"color:blue;\">Dim <\/span>colSubforms<span style=\"color:blue;\"> As <\/span>Collection\r\n<span style=\"color:blue;\">Dim <\/span>intUnterformulare<span style=\"color:blue;\"> As Integer<\/span><\/pre>\n<p><b>colSubforms <\/b>ist dabei wichtig, denn diese Collection nimmt sp&auml;ter die Instanzen der Klasse <b>clsDatenNebeneinanderUnterformular <\/b>auf.<\/p>\n<p>Die Methode <b>Initialisieren <\/b>weist den Member-Variablen nun zun&auml;chst die mit den Parametern &uuml;bergebenen Objektverweise und Werte zu. Bei den Objekten, die Ereignisse ausl&ouml;sen, tr&auml;gt sie gleich den Wert <b>[Event Procedure] <\/b>f&uuml;r die jeweilige Ereigniseigenschaft ein. Bei der Schaltfl&auml;che <b>cmdNachOben<\/b>, die in der Variablen <b>m_NachOben <\/b>gespeichert wird, erh&auml;lt so beispielsweise die Eigenschaft <b>OnClick <\/b>diesen Wert. Danach testet die Methode, ob das Unterformular-Steuerelement <b>sfm00 <\/b>vorhanden ist. Dazu versucht sie, bei deaktivierter Fehlerbehandlung die Variable <b>objSubform <\/b>mit einem Verweis auf dieses Unterformular-Steuerelement zu f&uuml;llen. Falls ja, steigt es in eine <b>Do While<\/b>-Schleife ein, die erst beendet wird, wenn kein neues Unterformular entsprechend der vorgegebenen Namenskonvention mehr gefunden wird (<b>sfm00<\/b>, <b>sfm01 <\/b>und so weiter). Innerhalb der Schleife erh&ouml;ht die Methode den Wert der Z&auml;hlervariablen <b>i <\/b>jeweils um <b>1 <\/b>und weist dem Unterformular-Steuerelement das anzuzeigende Unterformular zu. Dieses ist zwischenzeitlich vom Parameter <b>strSubform <\/b>in der Membervariablen <b>m_Subform <\/b>gelandet. Danach stellt sie die Variable <b>objSubform<\/b> auf <b>Nothing <\/b>ein und versucht, das n&auml;chste Unterformular  mit <b>m_Form(&#8222;sfm&#8220; &#038; Format(1, &#8222;00&#8220;)) <\/b>zu referenzieren.<\/p>\n<p>Nachdem alle Unterformular-Steuerelemente mit dem jeweiligen Unterformular gef&uuml;llt wurden, tr&auml;gt die Methode den aktuellen Wert von <b>i<\/b>, welcher der Anzahl der Unterformulare entspricht, in die Variable <b>intUnterformulare <\/b>ein und ruft eine weitere Prozedur namens <b>m_Form_Load <\/b>auf. Der Name dieser Prozedur ist historisch bedingt, denn wir haben diese aus der Datenbankversion des zu Beginn erw&auml;hnten Beitrags &uuml;bernommen, wo diese noch als Ereignisprozedur des Hauptformulars vorlag. Hier wird <b>m_Form_Load <\/b>allerdings nicht mehr beim Laden des Hauptformulars ausgel&ouml;st, da die Klasse ja erst im eigentlichen <b>Form_Load<\/b>-Ereignis des Hauptformulars instanziert und initialisiert wurde.<\/p>\n<p>Die Prozedur <b>m_Form_Load <\/b>liest die angegebene Datenherkunft in ein Recordset ein und stellt den klasseninternen Datensatzindex <b>intStartdatensatz <\/b>auf den Wert <b>1 <\/b>ein. Die Prozedur ruft dann eine weitere Routine namens <b>UnterformulareFuellen <\/b>auf und &uuml;bergibt dieser mit <b>int-Elemente <\/b>eine Variable, die von der aufgerufenen Methode gef&uuml;llt werden soll. Das Ergebnis wird dann genutzt, um die Schaltfl&auml;chen aus <b>m_NachUnten <\/b>und <b>m_Nach-Oben <\/b>zu aktivieren oder deaktivieren.<\/p>\n<h2>Unterformulare f&uuml;llen<\/h2>\n<p>Das F&uuml;llen der Unterformulare &uuml;bernimmt dann die Prozedur <b>UnterformulareFuellen<\/b>. Diese entspricht im Wesentlichen der Methode, die wir schon im Beitrag <b>Mehrere Datens&auml;tze pro Spalte in Formularen <\/b>erl&auml;utert haben &#8211; mit dem Unterschied, dass Sie noch die Routine <b>UnterformulareInitialisieren <\/b>aufruft (s. Listing 3).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>UnterformulareInitialisieren()\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objDatenNebeneinanderUnterformular<span style=\"color:blue;\"> As <\/span>clsDatenNebeneinanderUnterformular\r\n     <span style=\"color:blue;\">Set<\/span> colSubforms = <span style=\"color:blue;\">New<\/span> Collection\r\n     For i = 0 To intUnterformulare - 1\r\n         <span style=\"color:blue;\">Set<\/span> objSubform = m_Form(\"sfm\" & Format(i, \"00\"))\r\n         <span style=\"color:blue;\">Set<\/span> objDatenNebeneinanderUnterformular = <span style=\"color:blue;\">New<\/span> clsDatenNebeneinanderUnterformular\r\n         <span style=\"color:blue;\">With<\/span> objDatenNebeneinanderUnterformular\r\n             <span style=\"color:blue;\">Set<\/span> .Form = m_Form\r\n             <span style=\"color:blue;\">Set<\/span> .Subform = objSubform.Form\r\n             .Loeschen = m_strLoeschen\r\n             <span style=\"color:blue;\">Set<\/span> .Parent = Me\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         colSubforms.Add objDatenNebeneinanderUnterformular\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 3: Diese Prozedur initialisiert f&uuml;r jedes Unterformular ein Element auf Basis der Klasse clsDatenNebeneinanderUnterformular<\/span><\/b><\/p>\n<p>Diese instanziert die <b>Collection<\/b>-Variable <b>colSubforms<\/b> und durchl&auml;uft dann eine <b>For&#8230;Next<\/b>-Schleife &uuml;ber die gesamte Anzahl der Unterformulare aus der Variablen <b>intUnterformulare<\/b>. Innerhalb dieser Schleife tr&auml;gt sie einen Verweis auf das jeweilige Unterformular in die Variable <b>objSubform <\/b>ein. Dann erstellt sie eine neue Instanz der Klasse <b>clsDatenNebeneinanderUnterformular <\/b>und weist dieser vier Eigenschaften zu:<\/p>\n<ul>\n<li><b>Form<\/b>: Verweis auf das Hauptformular<\/li>\n<li><b>Subform<\/b>: Verweis auf das Unterformular<\/li>\n<li><b>Loeschen<\/b>: Name der <b>L&ouml;schen<\/b>-Schaltfl&auml;che<\/li>\n<li><b>Parent<\/b>: Verweis auf das aufrufende Objekt, also die Instanz der Klasse <b>clsDatenNebeneinander<\/b><\/li>\n<\/ul>\n<p>Danach tr&auml;gt sie mit der <b>Add<\/b>-Methode den Verweis auf das neu erstellte und konfigurierte Objekt in die Collection namens <b>colSubforms <\/b>ein.<\/p>\n<h2>Die Klasse clsDatenNebeneinanderUnterformular<\/h2>\n<p>Diese Klasse h&auml;lt die Ereignisse bereits, die durch jedes der angezeigten Unterformulare ausgel&ouml;st werden sollen &#8211; also diejenigen, die zuvor im Beispiel des vorherigen Beitrags im Klassenmodul des Formulars <b>sfmKundenNebeneinander <\/b>enthalten waren (s. Listing 4). Damit Sie die dazu notwendigen Codezeilen nicht bei jeder neuen Implementierung in das Klassenmodul des Unterformulars eintragen m&uuml;ssen, haben wir diese in ein weiteres Klassenmodul ausgelagert. Dieses verwendet wieder zwei Objektvariablen, die mit dem Schl&uuml;sselwort <b>WithEvents <\/b>deklariert wurden und dementsprechend Ereignisse implementieren sollen. Dabei handelt es sich um das Unterformular-Objekt sowie die <b>L&ouml;schen<\/b>-Schaltfl&auml;che:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>WithEvents m_Subform<span style=\"color:blue;\"> As <\/span>Form\r\n<span style=\"color:blue;\">Private <\/span>m_Form<span style=\"color:blue;\"> As <\/span>Form\r\n<span style=\"color:blue;\">Private <\/span>WithEvents cmdLoeschen<span style=\"color:blue;\"> As <\/span>CommandButton\r\n<span style=\"color:blue;\">Private <\/span>m_Parent<span style=\"color:blue;\"> As <\/span>clsDatenNebeneinander\r\n<span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>Subform(frm<span style=\"color:blue;\"> As <\/span>Form)\r\n     <span style=\"color:blue;\">Set<\/span> m_Subform = frm\r\n     <span style=\"color:blue;\">With<\/span> m_Subform\r\n         .AfterDelConfirm = \"[Event Procedure]\"\r\n         .AfterInsert = \"[Event Procedure]\"\r\n         .OnCurrent = \"[Event Procedure]\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>Form(frm<span style=\"color:blue;\"> As <\/span>Form)\r\n     <span style=\"color:blue;\">Set<\/span> m_Form = frm\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Let <\/span>Loeschen(strLoeschen<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Set<\/span> cmdLoeschen = m_Subform.Controls(strLoeschen)\r\n     <span style=\"color:blue;\">With<\/span> cmdLoeschen\r\n         .OnClick = \"[Event Procedure]\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>Parent(obj<span style=\"color:blue;\"> As <\/span>clsDatenNebeneinander)\r\n     <span style=\"color:blue;\">Set<\/span> m_Parent = obj\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>cmdLoeschen_Click()\r\n     m_Parent.DatensatzLoeschen\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>m_Subform_AfterDelConfirm(Status<span style=\"color:blue;\"> As Integer<\/span>)\r\n     m_Parent.DatensatzGeloescht\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>m_Subform_AfterInsert()\r\n     m_Parent.DatensatzHinzugefuegt\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>m_Subform_Current()\r\n     cmdLoeschen.Enabled = <span style=\"color:blue;\">Not<\/span> m_Subform.NewRecord\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Inhalt der Klasse clsDatenNebeneinanderUnterformular<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private <\/span>WithEvents m_Subform<span style=\"color:blue;\"> As <\/span>Form\r\n<span style=\"color:blue;\">Private <\/span>WithEvents cmdLoeschen<span style=\"color:blue;\"> As <\/span>CommandButton<\/pre>\n<p>Weitere Membervariablen nehmen die Verweise auf das &uuml;bergeordnete Formular und die &uuml;bergeordnete Klasse <b>clsDatenNebeneinander <\/b>auf:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>m_Form<span style=\"color:blue;\"> As <\/span>Form\r\n<span style=\"color:blue;\">Private <\/span>m_Parent<span style=\"color:blue;\"> As <\/span>clsDatenNebeneinander<\/pre>\n<p>Die <b>Property Set<\/b>-Prozedur <b>Subform <\/b>nimmt den Verweis auf das Unterformular entgegen und stellt die ben&ouml;tigten Ereigniseigenschaften auf den Wert <b>[Event Procedure] <\/b>ein.<\/p>\n<p>Gleiches gilt f&uuml;r die <b>Property Set<\/b>-Prozedur <b>Loeschen<\/b>, welche die Schaltfl&auml;che mit dem Namen aus <b>strLoeschen <\/b>mit der Variablen <b>cmdLoeschen <\/b>referenziert und deren Ereigniseigenschaft <b>OnClick <\/b>auf <b>[Event Procedure] <\/b>einstellt.<\/p>\n<p>Das Anklicken der L&ouml;schen-Schaltfl&auml;che l&ouml;st schlie&szlig;lich die Prozedur <b>cmdLoeschen_Click <\/b>aus, welche die Methode <b>DatensatzLoeschen <\/b>der &uuml;bergeordneten und mit <b>m_Parent <\/b>referenzierten Klasse aufruft.<\/p>\n<p>Die beiden Ereignisprozeduren, die durch die Ereignisse <b>Nach L&ouml;schbest&auml;tigung <\/b>und <b>Nach Einf&uuml;gung <\/b>ausgel&ouml;st werden, rufen ebenfalls entsprechende Methoden der Klasse <b>clsDatenNebeneinander <\/b>auf.<\/p>\n<p>Schlie&szlig;lich gibt es noch das Ereignis <b>Beim Anzeigen <\/b>des mit <b>m_Subform <\/b>referenzierten Formulars, das die L&ouml;schen-Schaltfl&auml;che aktiviert oder deaktiviert &#8211; je nachdem, ob das Unterformular einen neuen Datensatz anzeigt oder nicht.<\/p>\n<h2>Weitere Anpassungen<\/h2>\n<p>Wenn wir nun mit einem Klick auf die Schaltfl&auml;che <b>cmdNeu<\/b> einen neuen Datensatz anlegen wollen, wechselt das Formular zur letzten Seite und zeigt ein neues, leeres Unterformular an. Da wir die Bezeichnungsfelder f&uuml;r <b>Vorname<\/b>, <b>Nachname <\/b>und so weiter entfernt haben, kann der Benutzer so nur anhand der vorhandenen Kontakte erkennen, was er in welches Feld eintragen soll (s. Bild 10). Noch schwieriger wird es, wenn bereits genau so viele Datens&auml;tze vorliegen, dass ein neuer Datensatz auf einer neuen, leeren Seite landet &#8211; dann findet der Benutzer gar keine Orientierung f&uuml;r die einzuf&uuml;genden Daten. Das ist nat&uuml;rlich nicht optimal, also erg&auml;nzen wir das Formular noch um eine kleine Hilfestellung.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_01\/pic_1019_010.png\" alt=\"Felder neuer Datens&auml;tze k&ouml;nnen nur im Blindflug gef&uuml;llt werden\" width=\"500\" height=\"378,2288\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Felder neuer Datens&auml;tze k&ouml;nnen nur im Blindflug gef&uuml;llt werden<\/span><\/b><\/p>\n<p>Dazu tragen Sie f&uuml;r die <b>Format<\/b>-Eigenschaft der jeweiligen Textfelder einen Ausdruck wie den folgenden ein (hier f&uuml;r das Feld <b>Anrede<\/b>):<\/p>\n<pre>@;[Rot]\"[Anrede]\"<\/pre>\n<p>Damit erhalten Sie, wenn das Feld den Wert <b>Null<\/b> oder eine leere Zeichenfolge enth&auml;lt, den Ausdruck in Anf&uuml;hrungszeichen in der in eckigen Klammern angegebenen Farbe. Wir haben dies einmal f&uuml;r alle Textfelder des Unterformulars erledigt &#8211; das Ergebnis finden Sie in Bild 11.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_01\/pic_1019_011.png\" alt=\"Die Felder selbst enthalten einen Hinweis auf die einzuf&uuml;genden Daten.\" width=\"500\" height=\"387,4539\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Die Felder selbst enthalten einen Hinweis auf die einzuf&uuml;genden Daten.<\/span><\/b><\/p>\n<p>Die Bilder f&uuml;r die Anlagefelder f&uuml;gen Sie durch einen Doppelklick auf das Bild und anschlie&szlig;endes Ausw&auml;hlen eines Bildes &uuml;ber den Dialog zum Verwalten von Anlagefeldern ein.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Beitrag zeigt, wie Sie die Funktionen zur Anzeige mehrerer Datens&auml;tze in zeilen- und spaltenweise angeordneten Unterformularen in zwei Klassen auslagern und diese ganz einfach mit wenigen Zeilen zu einem Hauptformular mit den ben&ouml;tigten Unterformularen zuweisen. <\/p>\n<p>Sie k&ouml;nnen das Formular noch etwas versch&ouml;nern, indem Sie die Schaltfl&auml;chen mit Icons versehen. Eine zus&auml;tzliche Funktion w&auml;re eine Suche mit einem Suchfeld und einer Schaltfl&auml;che zum Ausl&ouml;sen der Suche. Gegebenenfalls erweitern wir die Klassen dieses Beitrags in einer der folgenden Ausgaben um eine solche Suchfunktion.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>KontakteVerwalten.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{79494DA9-5D47-4933-8FCC-D1394B642F15}\/aiu_1019.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Beitrag &#8222;Mehrere Datens&auml;tze pro Spalte in Formularen&#8220; haben wir gezeigt, wie Sie mehrere Unterformulare in einem Formular mit jeweils einem Datensatz f&uuml;llen, sodass der Eindruck erscheint, die Datens&auml;tze w&auml;ren innerhalb des Formulars in Spalten und Zeilen arrangiert. Im vorliegenden Beitrag zeigen wir ein Beispiel f&uuml;r den praktischen Einsatz dieser L&ouml;sung. Dabei wollen wir die Daten einer Kundendatenbank wie in der Kontakte-Ansicht von Outlook als Visitenkarten darstellen &#8211; mit der zus&auml;tzlichen Optionen, einen Kontakt direkt von der &Uuml;bersicht aus l&ouml;schen 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":[66012016,662016,44000023],"tags":[],"class_list":["post-55001019","post","type-post","status-publish","format-standard","hentry","category-66012016","category-662016","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Kontakte verwalten - 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\/Kontakte_verwalten\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kontakte verwalten\" \/>\n<meta property=\"og:description\" content=\"Im Beitrag &quot;Mehrere Datens&auml;tze pro Spalte in Formularen&quot; haben wir gezeigt, wie Sie mehrere Unterformulare in einem Formular mit jeweils einem Datensatz f&uuml;llen, sodass der Eindruck erscheint, die Datens&auml;tze w&auml;ren innerhalb des Formulars in Spalten und Zeilen arrangiert. Im vorliegenden Beitrag zeigen wir ein Beispiel f&uuml;r den praktischen Einsatz dieser L&ouml;sung. Dabei wollen wir die Daten einer Kundendatenbank wie in der Kontakte-Ansicht von Outlook als Visitenkarten darstellen - mit der zus&auml;tzlichen Optionen, einen Kontakt direkt von der &Uuml;bersicht aus l&ouml;schen zu k&ouml;nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Kontakte_verwalten\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T19:04:10+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/d35d6cf6b1ea4035b444d39f7759022a\" \/>\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=\"17\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kontakte_verwalten\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kontakte_verwalten\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Kontakte verwalten\",\"datePublished\":\"2020-05-22T19:04:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kontakte_verwalten\\\/\"},\"wordCount\":2942,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kontakte_verwalten\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/d35d6cf6b1ea4035b444d39f7759022a\",\"articleSection\":[\"1\\\/2016\",\"2016\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Kontakte_verwalten\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kontakte_verwalten\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kontakte_verwalten\\\/\",\"name\":\"Kontakte verwalten - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kontakte_verwalten\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kontakte_verwalten\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/d35d6cf6b1ea4035b444d39f7759022a\",\"datePublished\":\"2020-05-22T19:04:10+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kontakte_verwalten\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Kontakte_verwalten\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kontakte_verwalten\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/d35d6cf6b1ea4035b444d39f7759022a\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/d35d6cf6b1ea4035b444d39f7759022a\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kontakte_verwalten\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kontakte verwalten\"}]},{\"@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":"Kontakte verwalten - 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\/Kontakte_verwalten\/","og_locale":"de_DE","og_type":"article","og_title":"Kontakte verwalten","og_description":"Im Beitrag \"Mehrere Datens&auml;tze pro Spalte in Formularen\" haben wir gezeigt, wie Sie mehrere Unterformulare in einem Formular mit jeweils einem Datensatz f&uuml;llen, sodass der Eindruck erscheint, die Datens&auml;tze w&auml;ren innerhalb des Formulars in Spalten und Zeilen arrangiert. Im vorliegenden Beitrag zeigen wir ein Beispiel f&uuml;r den praktischen Einsatz dieser L&ouml;sung. Dabei wollen wir die Daten einer Kundendatenbank wie in der Kontakte-Ansicht von Outlook als Visitenkarten darstellen - mit der zus&auml;tzlichen Optionen, einen Kontakt direkt von der &Uuml;bersicht aus l&ouml;schen zu k&ouml;nnen.","og_url":"https:\/\/access-im-unternehmen.de\/Kontakte_verwalten\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T19:04:10+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/d35d6cf6b1ea4035b444d39f7759022a","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"17\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Kontakte_verwalten\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Kontakte_verwalten\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Kontakte verwalten","datePublished":"2020-05-22T19:04:10+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Kontakte_verwalten\/"},"wordCount":2942,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Kontakte_verwalten\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/d35d6cf6b1ea4035b444d39f7759022a","articleSection":["1\/2016","2016","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Kontakte_verwalten\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Kontakte_verwalten\/","url":"https:\/\/access-im-unternehmen.de\/Kontakte_verwalten\/","name":"Kontakte verwalten - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Kontakte_verwalten\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Kontakte_verwalten\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/d35d6cf6b1ea4035b444d39f7759022a","datePublished":"2020-05-22T19:04:10+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Kontakte_verwalten\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Kontakte_verwalten\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Kontakte_verwalten\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/d35d6cf6b1ea4035b444d39f7759022a","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/d35d6cf6b1ea4035b444d39f7759022a"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Kontakte_verwalten\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Kontakte verwalten"}]},{"@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\/55001019","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=55001019"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001019\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001019"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001019"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001019"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}