{"id":55000902,"date":"2013-10-01T00:00:00","date_gmt":"2020-05-22T21:30:31","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=902"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Persistente_Mehrfachauswahl_mit_Klasse","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Persistente_Mehrfachauswahl_mit_Klasse\/","title":{"rendered":"Persistente Mehrfachauswahl mit Klasse"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg05.met.vgwort.de\/na\/565bb03f53b841d1b58060818e51c818\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wenn Sie Listenfelder f&uuml;r die Anzeige von Daten aus m:n-Beziehungen nutzen, m&uuml;ssen Sie die &auml;nderungen an der Auswahl jeweils in der zugrunde liegenden m:n-Verkn&uuml;pfungstabelle speichern und diese beim Anzeigen eines Datensatzes wiederherstellen. Das ist kein Hexenwerk, wie der Beitrag Persistente Mehrfachauswahl in Listenfeldern (www.access-im-unternehmen.de\/479) zeigt. Wenn Sie diese Technik h&auml;ufiger verwenden, artet das Anlegen der entsprechenden Ereignisprozeduren jedoch in echte Arbeit aus. Warum also die Funktionalit&auml;t nicht einfach in eine Klasse auslagern und diese wiederverwenden<\/b><\/p>\n<p><b>Beispiel<\/b><\/p>\n<p>Ein gutes Beispiel f&uuml;r einen solchen Fall ist das Formular <b>frmMitarbeiterDetail <\/b>aus der L&ouml;sung, die der Beitrag <b>Schichtplaner<\/b> (<b>www.access-im-unternehmen.de\/906<\/b>) beschreibt. Dort finden Sie gleich zwei Listenfelder, welche die Daten aus m:n-Beziehungen darstellen. Dort sollen n&auml;mlich f&uuml;r einen Mitarbeiter sowohl die Schichten, f&uuml;r die er zur Verf&uuml;gung steht, als auch die entsprechenden Wochentage markiert und nat&uuml;rlich auch gespeichert werden (s. Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_05\/pic_902_001.png\" alt=\"Formular mit zwei Listenfeldern zum Speichern von Daten aus m:n-Beziehungen\" width=\"570\" height=\"417,5449\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Formular mit zwei Listenfeldern zum Speichern von Daten aus m:n-Beziehungen<\/span><\/b><\/p>\n<p>Wenn der Benutzer in diesem Formular zum n&auml;chsten Mitarbeiter wechselt, soll dieses nat&uuml;rlich auch gleich die richtigen Datens&auml;tze in den beiden Listenfeldern markieren. Und wenn der Benutzer einen der Listenfeldeintr&auml;ge aus- oder abw&auml;hlt, m&uuml;ssen nat&uuml;rlich die entsprechenden &auml;nderungen in den zugrunde liegenden Tabellen durchgef&uuml;hrt werden.<\/p>\n<p><b>Woher kommen die Daten<\/b><\/p>\n<p>Um das Beispiel zu verdeutlichen, schauen wir uns die Tabellen an, auf denen die einzelnen Elemente aufbauen.<\/p>\n<p>Das Formular <b>frmMitarbeiterDetail <\/b>zeigt die Daten der Tabelle <b>tblMitarbeiter <\/b>an. Diese ist sehr einfach gehalten und enth&auml;lt lediglich zwei Felder:<\/p>\n<ul>\n<li><b>MitarbeiterID <\/b>(Prim&auml;rschl&uuml;sselfeld) und<\/li>\n<li><b>Mitarbeiter <\/b>(Bezeichnung des Mitarbeiters).<\/li>\n<\/ul>\n<p>Das Listenfeld <b>lstSchichtarten <\/b>verwendet die Tabelle <b>tblSchichtarten <\/b>als Datensatzherkunft, wobei diese Tabelle &uuml;ber die Tabelle <b>tblMitarbeiterSchichtarten <\/b>mit der Tabelle <b>tblMitarbeiter <\/b>verkn&uuml;pft wird (s. Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_05\/pic_902_002.png\" alt=\"Aufbau der an der m:n-Beziehung beteiligten Tabellen\" width=\"570\" height=\"217,5\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Aufbau der an der m:n-Beziehung beteiligten Tabellen<\/span><\/b><\/p>\n<p>Damit das Listenfeld zwar das Feld <b>SchichtartID<\/b> als gebundene Spalte verwendet, diese aber nicht anzeigt, stellen Sie die beiden Eigenschaften <b>Spaltenanzahl <\/b>und <b>Spaltenbreite <\/b>auf die Werte <b>2 <\/b>und <b>0cm <\/b>ein. Auf diese Weise erscheint nur die entsprechende Schichtart im Listenfeld.<\/p>\n<p>Um die Mehrfachauswahl zu erm&ouml;glichen, stellen Sie au&szlig;erdem die gleichnamige Eigenschaft auf den Wert <b>Einfach <\/b>ein (s. Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_05\/pic_902_003.png\" alt=\"Die Listenfelder bieten die Mehrfachauswahl f&uuml;r ihre Eintr&auml;ge an.\" width=\"570\" height=\"405,8481\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Die Listenfelder bieten die Mehrfachauswahl f&uuml;r ihre Eintr&auml;ge an.<\/span><\/b><\/p>\n<p><b>Voraussetzung<\/b><\/p>\n<p>Eine Voraussetzung hat die hier vorgestellte Version der Klasse: Die Namen der Prim&auml;rschl&uuml;sselfelder der verkn&uuml;pften Tabellen sowie der Fremdschl&uuml;sselfelder der Verkn&uuml;pfungstabelle m&uuml;ssen &uuml;bereinstimmen. Anderenfalls m&uuml;ssten Sie die Klasse entsprechend erweitern.<\/p>\n<p><b>Ben&ouml;tigte Ereignisse<\/b><\/p>\n<p>Was ist nun zu tun Als Erstes sollen beim Anzeigen eines Datensatzes im Hauptformular die diesem Datensatz zugeordneten Eintr&auml;ge der im Listenfeld angezeigten Tabelle markiert werden. Sprich: Die Eintr&auml;ge des Listenfeldes werden einzeln durchlaufen und mit den Daten der Verkn&uuml;pfungstabelle <b>tblMitarbeiterSchichtarten <\/b>abgeglichen. Ist der aktuelle Eintrag &uuml;ber diese Tabelle mit dem im Formular angezeigten Mitarbeiter verkn&uuml;pft, soll der Eintrag markiert werden.<\/p>\n<p>Dies geschieht logischerweise, wenn das Ereignis <b>Beim Anzeigen<\/b> ausgel&ouml;st wird.<\/p>\n<p>Au&szlig;erdem soll bei einem Klick auf einen der Eintr&auml;ge eine &auml;nderung in der Tabelle <b>tblMitarbeiterSchichtarten <\/b>vorgenommen werden: Ist der Eintrag noch nicht markiert, soll der Tabelle ein Datensatz hinzugef&uuml;gt werden, der im Feld <b>MitarbeiterID <\/b>den Wert des gleichnamigen Feldes im Formular und im Feld <b>SchichtartID <\/b>den Wert der gebundenen Spalte des angeklickten Eintrags des Listenfeldes aufnimmt.<\/p>\n<p>Wenn der Eintrag beim Anklick bereits markiert war und somit deaktiviert wird, soll die Prozedur den Datensatz der Tabelle <b>tblMitarbeiterSchichtarten<\/b> suchen, der dem Wert des Feldes <b>MitarbeiterID <\/b>im Formular und dem Wert der gebundenen Spalte des angeklickten Eintrags im Listenfeld entspricht.<\/p>\n<p>Und da wir schon von Anklicken reden, wissen wir auch, welches Ereignis gemeint ist: n&auml;mlich das Ereignis <b>Beim Klicken<\/b>.<\/p>\n<p>Diese beiden Ereignisse m&uuml;ssten wir also in einer Klasse implementieren, die uns die wiederkehrende Programmierarbeit f&uuml;r das Speichern und Wiederherstellen der Mehrfachauswahl in Listenfeldern abnehmen soll.<\/p>\n<p><b>Benutzung der Klasse<\/b><\/p>\n<p>Die Klasse soll <b>clsPersistenteMehrfachauswahl<\/b> hei&szlig;en, also deklarieren wir im Kopf des Klassenmoduls des Formulars mit den auszur&uuml;stenden Listenfeldern f&uuml;r jedes Listenfeld eine entsprechende Objektvariable.<\/p>\n<p>In unserem Beispiel handelt es sich um die folgenden beiden Eintr&auml;ge:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objPMSchichtarten<span style=\"color:blue;\"> As <\/span> clsPersistenteMehrfachauswahl\r\n<span style=\"color:blue;\">Dim <\/span>objPMWochentage<span style=\"color:blue;\"> As <\/span> clsPersistenteMehrfachauswahl<\/pre>\n<p>Die Instanzierung der beiden Klassen erfolgt in der Prozedur, die durch das Ereignis <b>Beim Laden <\/b>des Formulars ausgel&ouml;st wird. Diese sieht wie in Listing 1 aus und f&uuml;hrt die folgenden Schritte f&uuml;r die beiden Listenfelder durch:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Set<\/span> objPMSchichtarten = <span style=\"color:blue;\">New<\/span> clsPersistenteMehrfachauswahl\r\n     <span style=\"color:blue;\">With<\/span> objPMSchichtarten\r\n         <span style=\"color:blue;\">Set<\/span> .Form = Me\r\n         <span style=\"color:blue;\">Set<\/span> .Listbox = Me!lstSchichtarten\r\n         .mField = \"MitarbeiterID\"\r\n         .nField = \"SchichtartID\"\r\n         .mnTable = \"tblMitarbeiterSchichtarten\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objPMWochentage = <span style=\"color:blue;\">New<\/span> clsPersistenteMehrfachauswahl\r\n     <span style=\"color:blue;\">With<\/span> objPMWochentage\r\n         <span style=\"color:blue;\">Set<\/span> .Form = Me\r\n         <span style=\"color:blue;\">Set<\/span> .Listbox = Me!lstWochentage\r\n         .mField = \"MitarbeiterID\"\r\n         .nField = \"WochentagID\"\r\n         .mnTable = \"tblMitarbeiterWochentage\"\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 Klasse clsPersinstenteMehrfachauswahl f&uuml;r die beiden Listenfelder<\/span><\/b><\/p>\n<ul>\n<li>Instanzieren eines Objekt auf Basis der Klasse mit dem Schl&uuml;sselwort <b>New<\/b><\/li>\n<li>Zuweisen des aktuellen Formulars an die Eigenschaft <b>Form <\/b>der Klasse<\/li>\n<li>Zuweisen eines Verweises auf das Listenfeld an die Eigenschaft <b>Listbox<\/b><\/li>\n<li>Zuweisen des Namens des Prim&auml;rschl&uuml;sselfeldes der Tabelle der m-Seite der Beziehung an die Eigenschaft <b>mField<\/b><\/li>\n<li>Zuweisen des entsprechenden Feldes der n-Seite der Beziehung an die Eigenschaft <b>nField<\/b><\/li>\n<li>Zuweisen des Namens der Verkn&uuml;pfungstabelle an die Eigenschaft <b>mnTable<\/b><\/li>\n<\/ul>\n<p>Diese Schritte f&uuml;hrt man f&uuml;r jedes mit der Klasse auszustattende Listenfeld aus.<\/p>\n<p>Wenn Sie die Klasse <b>clsPersistenteMehrfachauswahl <\/b>einfach in Ihre Anwendung &uuml;bernehmen, war es das &#8211; die Anzeige und das Speichern der ausgew&auml;hlten Werte funktioniert nun bereits.<\/p>\n<p><!--30percent--><\/p>\n<p><b>Die Klasse clsPersistenteMehrfachauswahl<\/b><\/p>\n<p>Erstellen Sie im VBA-Editor zun&auml;chst ein neues Klassenmodul (Men&uuml;eintrag <b>Einf&uuml;gen|Klassenmodul<\/b>).<\/p>\n<p>Wie Sie der oben beschriebenen Anleitung entnehmen konnten, soll die Klasse nach dem Instanzieren gleich f&uuml;nf Variablen entgegennehmen.<\/p>\n<p>Daf&uuml;r ben&ouml;tigen wir nat&uuml;rlich erstens f&uuml;nf Member-Variablen, die nur innerhalb der Klasse verwendet werden und von au&szlig;en zugewiesen werden sollen.<\/p>\n<p>Bei der Variablen f&uuml;r die &uuml;bergabe der Tabelle ben&ouml;tigen wir beispielsweise die folgende Deklaration:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>m_mnTable<span style=\"color:blue;\"> As String<\/span><\/pre>\n<p>Damit man diese private deklarierte Variable nach dem Instanzieren von au&szlig;en f&uuml;llen kann, ben&ouml;tigen wir eine entsprechende <b>Property Let<\/b>-Prozedur.<\/p>\n<p>Diese sieht wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Public Property Let <\/span>mnTable(str<span style=\"color:blue;\"> As String<\/span>)\r\n     m_mnTable = str\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Die Prozedur liefert beim Zugriff auf ein Objekt auf Basis der Klasse von au&szlig;en die M&ouml;glichkeit, die Variable <b>m_mnTable <\/b>wie folgt zu f&uuml;llen:<\/p>\n<pre>objPMSchichtarten.mnTable =  \"tblMitarbeiterSchichtarten\"<\/pre>\n<p>Auf die gleiche Weise deklarieren wir die beiden Variablen zum Aufnehmen der betroffenen Tabellenfelder:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>m_mField<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Private <\/span>m_nField<span style=\"color:blue;\"> As String<\/span><\/pre>\n<p>Die <b>Property Let<\/b>-Prozeduren sehen so aus:<\/p>\n<pre><span style=\"color:blue;\">Public Property Let <\/span>mField(str<span style=\"color:blue;\"> As String<\/span>)\r\n     m_mField = str\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Let <\/span>nField(str<span style=\"color:blue;\"> As String<\/span>)\r\n     m_nField = str\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Fehlen noch die beiden Objektvariablen zum Referenzieren des Formulars und des Listenfeldes.<\/p>\n<p>Diese deklarieren Sie wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>WithEvents m_Form<span style=\"color:blue;\"> As <\/span>Form\r\n<span style=\"color:blue;\">Private <\/span>WithEvents m_Listbox<span style=\"color:blue;\"> As <\/span>Listbox<\/pre>\n<p>Der Unterschied zu den vorherigen Deklarationen ist, dass wir hier jeweils das Schl&uuml;sselwort <b>WithEvents <\/b>verwenden.<\/p>\n<p>Dies f&uuml;hrt dazu, dass wir im aktuellen Klassenmodul die Ereignisprozeduren der beiden Objekte implementieren k&ouml;nnen. Das hei&szlig;t, dass wir nicht etwa eine Ereignisprozedur namens <b>Form_Current <\/b>im Klassenmodul des Formulars definieren, sondern eine namens <b>m_Form_Current <\/b>in der neu erstellten Klasse.<\/p>\n<p>Wir m&uuml;ssen jedoch noch angeben, dass beim Ausl&ouml;sen etwa des Ereignisses <b>Beim Anzeigen<\/b> auch in der aktuellen Klasse nach Ereignisprozeduren gesucht werden soll. Dies erledigen wir gleich in der <b>Public Property Set<\/b>-Prozedur f&uuml;r die Eigenschaft <b>Form<\/b>:<\/p>\n<pre><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     m_Form.OnCurrent = \"[Event Procedure]\"\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Wir legen also f&uuml;r die Eigenschaft <b>OnCurrent <\/b>den Wert <b>[Event Procedure] <\/b>fest. Das ist das Gleiche, als wenn wir im Eigenschaftsfenster des Formulars f&uuml;r die Eigenschaft <b>Beim Anzeigen <\/b>den Wert <b>[Ereignisprozedur] <\/b>eintragen &#8211; nur dass wir dies hier zur Laufzeit durchf&uuml;hren.<\/p>\n<p>Warum verwenden wir hier <b>Set <\/b>und nicht <b>Let<\/b> Nun: <b>Set <\/b>ist den Objektvariablen vorbehalten, <b>Let <\/b>den einfachen Datentypen wie <b>String<\/b>, <b>Long<\/b>, <b>Boolean <\/b>et cetera.<\/p>\n<p><b>Listenfeld referenzieren<\/b><\/p>\n<p>&auml;hnlich gehen wir beim Listenfeld vor, auf dessen <b>Beim Klicken<\/b>-Ereignis die Klasse reagieren soll:<\/p>\n<pre><span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>Listbox(lst<span style=\"color:blue;\"> As <\/span>Listbox)\r\n     <span style=\"color:blue;\">Set<\/span> m_Listbox = lst\r\n     m_Listbox.OnClick = \"[Event Procedure]\"\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Hier stellen wir die Eigenschaft <b>OnClick <\/b>auf den Wert <b>[Event Procedure] <\/b>ein.<\/p>\n<p><b>Ereignisse implementieren<\/b><\/p>\n<p>Fehlen noch die beiden Ereignisprozeduren, die im Klassenmodul <b>clsPersistenteMehrfachauswahl <\/b>implementiert und durch die entsprechenden Ereignisse im Formular ausgel&ouml;st werden sollen. Die erste Ereignisprozedur <b>m_Form_Current<\/b> finden Sie in Listing 2. Die Prozedur sorgt daf&uuml;r, dass die Eintr&auml;ge des Listenfeldes f&uuml;r den aktuell im Formular angezeigten Datensatz aktiviert oder deaktiviert werden &#8211; je nachdem, welche Daten die f&uuml;r die Eigenschaft <b>mnTable <\/b>angegebene Tabelle f&uuml;r den aktuellen Datensatz bereith&auml;lt.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>m_Form_Current()\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>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>strSQL<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     For i = 0 To m_Listbox.ListCount - 1\r\n         m_Listbox.Selected(i) = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     <span style=\"color:blue;\">If <\/span>IsNull(m_Form(m_mField))<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     strSQL = \"SELECT \" & m_mField & \", \" & m_nField & \" FROM \" & m_mnTable _\r\n         & \" WHERE \" & m_mField & \" = \" & m_Form(m_mField)\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(strSQL, dbOpenDynaset)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> rst.EOF<span style=\"color:blue;\"> Then<\/span>\r\n         For i = 0 To m_Listbox.ListCount - 1\r\n             <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n                 <span style=\"color:blue;\">If <\/span>CLng(rst(m_nField)) = CLng(m_Listbox.ItemData(i))<span style=\"color:blue;\"> Then<\/span>\r\n                     m_Listbox.Selected(i) = <span style=\"color:blue;\">True<\/span>\r\n                     <span style=\"color:blue;\">Exit Do<\/span>\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             rst.Move<span style=\"color:blue;\">Next<\/span>\r\n             <span style=\"color:blue;\">Loop<\/span>\r\n             rst.MoveFirst\r\n         <span style=\"color:blue;\">Next<\/span> i\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     rst.Close\r\n     <span style=\"color:blue;\">Set<\/span> rst = Nothing\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 2: Markieren der Listenfeldeintr&auml;ge entsprechend den Schichtarten des aktuell im Formular angezeigten Mitarbeiters<\/span><\/b><\/p>\n<p>Die Prozedur deklariert zun&auml;chst die ben&ouml;tigten Variablen und hebt dann alle Markierungen im Listenfeld auf. Dazu durchl&auml;uft sie eine <b>For&#8230;Next<\/b>-Schleife von <b>0 <\/b>bis zur Anzahl der enthaltenen Listeneintr&auml;ge minus <b>1<\/b>. Das Einstellen der Eigenschaft <b>Selected <\/b>f&uuml;r den entsprechenden Indexwert auf den Wert <b>False <\/b>hebt die Markierung, die eventuell durch den vorherigen Datensatz vorgenommen wurde, auf.<\/p>\n<p>Dann pr&uuml;ft die Prozedur, ob der Prim&auml;rschl&uuml;sselwert des im Formular angezeigten Datensatzes &uuml;berhaupt einen Wert enth&auml;lt. Dazu verwendet sie den Ausdruck <b>IsNull(m_Form(m_mField))<\/b>, was den Wert des in <b>m_mField <\/b>angegebenen Feldes des mit <b>m_Form <\/b>referenzierten Formulars mit der Funktion <b>IsNull <\/b>pr&uuml;ft.<\/p>\n<p>Danach beginnt die Markierung der dem aktuellen Datensatz des Formulars zugeordneten Eintr&auml;ge des Listenfeldes. Dazu stellt die Prozedur zun&auml;chst eine SQL-Abfrage zusammen, welche die zu dem Datensatz des Formulars passenden Eintr&auml;ge im Listenfeld ermittelt &#8211; sprich: alle Datens&auml;tze der in <b>m_mnTable <\/b>gespeicherten Tabelle, deren Wert im Feld <b>m_mField <\/b>dem Wert des Feldes <b>m_mField <\/b>im Formular <b>m_Form <\/b>entsprechen. Und zu den gefundenen Datens&auml;tzen soll die Abfrage die Werte der mit <b>m_mField <\/b>und <b>m_nField <\/b>angegebenen Felder ermitteln:<\/p>\n<pre>\"SELECT \" & m_mField & \", \" & m_nField & \" FROM \" & m_mnTable & \" WHERE \" & m_mField & \" = \" & m_Form(m_mField)<\/pre>\n<p>Die Prozedur erstellt dann ein Recordset auf Basis dieser SQL-Abfrage.<\/p>\n<p>Nun kann es vorkommen, dass f&uuml;r den aktuellen Datensatz des Formulars noch gar kein Datensatz in der m:n-Verkn&uuml;pfungstabelle angelegt wurde. Dies pr&uuml;ft die Prozedur mit der folgenden Bedingung:<\/p>\n<pre><span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> rst.EOF<span style=\"color:blue;\"> Then<\/span><\/pre>\n<p>Liefert dies den Wert <b>True<\/b>, kann es losgehen: Die Prozedur durchl&auml;uft in einer <b>For&#8230;Next<\/b>-Schleife wiederum alle Eintr&auml;ge des Listenfeldes.<\/p>\n<p>F&uuml;r jeden Eintrag durchl&auml;uft sie wiede-rum alle Datens&auml;tze des mit <b>rst <\/b>referenzierten <b>Recordset<\/b>-Objekts. Stimmen die Werte des mit <b>m_nField <\/b>angegebenen Feldes des Recordsets und der gebundenen Spalte des aktuellen Listenfeldeintrags &uuml;berein, markiert die Prozedur diesen Listenfeldeintrag.<\/p>\n<p>Dies erledigt sie, indem sie die <b>Selected<\/b>-Eigenschaft f&uuml;r den Eintrag mit dem aktuell durchlaufenen und in der Variablen <b>i <\/b>gespeicherten Indexwert auf den Wert <b>True <\/b>einstellt. An dieser Stelle verl&auml;sst die Prozedur die <b>Do While<\/b>-Schleife, da der aktuelle Listenfeldeintrag ja bereits markiert wurde.<\/p>\n<p>Passt der aktuelle Datensatz aus <b>rst <\/b>nicht zum aktuellen Listenfeldeintrag, setzt die Prozedur die Suche mit dem n&auml;chsten Durchlauf der <b>Do While<\/b>-Schleife fort. Nach dem Beenden der Schleife muss die Prozedur den Datensatzzeiger f&uuml;r das Recordset mit <b>MoveFirst <\/b>zur&uuml;cksetzen, damit dieses f&uuml;r den folgenden Listenfeldeintrag erneut von vorn durchlaufen werden kann.<\/p>\n<p><b>Auswahl speichern<\/b><\/p>\n<p>Fehlt noch die zweite Ereignisprozedur, die durch einen Mausklick auf einen der Eintr&auml;ge des Listenfeldes ausgel&ouml;st werden soll. Die Prozedur sieht im &uuml;berblick wie in Listing 3 aus.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>m_Listbox_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>lngID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSQL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">If <\/span>IsNull(m_Form(m_mField))<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Bitte bearbeiten Sie zun&auml;chst den Hauptdatensatz.\"\r\n         m_Listbox.Selected(m_Listbox.ListIndex) = <span style=\"color:blue;\">False<\/span>\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     DoCmd.RunCommand acCmdSaveRecord\r\n     lngID = m_Listbox.ItemData(m_Listbox.ListIndex)\r\n     <span style=\"color:blue;\">If <\/span>m_Listbox.Selected(m_Listbox.ListIndex) = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         strSQL = \"INSERT INTO \" & m_mnTable & \"(\" & m_mField & \", \" & m_nField & \") VALUES(\" & m_Form(m_mField) & \", \" _\r\n             & lngID & \")\"\r\n         db.Execute strSQL, dbFailOnError\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         strSQL = \"DELETE FROM \" & m_mnTable & \" WHERE \" & m_mField & \" = \" & m_Form(m_mField) & \" AND \" & m_nField & \" = \" _\r\n             & lngID\r\n         db.Execute strSQL, dbFailOnError\r\n     <span style=\"color:blue;\">End If<\/span>\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 3: Speichern des Markiert-Zustands nach dem Anklicken eines der Eintr&auml;ge des Listenfeldes<\/span><\/b><\/p>\n<p>Nach der Deklaration pr&uuml;ft die Ereignisprozedur zun&auml;chst, ob das mit <b>m_mField <\/b>bezeichnete Feld im Formular <b>m_Form <\/b>nicht m&ouml;glicherweise den Wert <b>Null <\/b>enth&auml;lt.<\/p>\n<p>Dies kann nur geschehen, wenn der Benutzer im Formular gerade einen neuen Datensatz angelegt hat. In diesem Fall zeigt das Formular eine entsprechende Meldung an und setzt die Markierung im Listenfeld zur&uuml;ck.<\/p>\n<p>Der Index des zur&uuml;ckzusetzenden Feldes wird dabei &uuml;ber die Eigenschaft <b>ListIndex <\/b>des Listenfeldes gewonnen und die Prozedur mit <b>Exit Sub <\/b>verlassen.<\/p>\n<p>Die Prozedur speichert den Datensatz des Formulars sicherheitshalber und ermittelt mit der Eigenschaft <b>ItemData <\/b>des Eintrags mit dem in <b>ListIndex <\/b>enthaltenen Indexwert den Wert der gebundenen Spalte des Listenfeldes. Dieser Wert, der dem Wert der n-Seite der Beziehung zwischen den verkn&uuml;pften Tabellen entspricht, landet in der Variablen <b>lngID<\/b>.<\/p>\n<p>Dann pr&uuml;ft die Prozedur, ob der Benutzer den angeklickten Eintrag soeben aktiviert oder deaktiviert hat. Dies ermittelt sie wiederum &uuml;ber die <b>Selected<\/b>-Eigenschaft f&uuml;r den Eintrag mit dem entsprechenden Index.<\/p>\n<p>Liefert <b>Selected <\/b>den Wert <b>True<\/b>, wurde der Eintrag soeben ausgew&auml;hlt und es muss ein entsprechender Datensatz in der Verkn&uuml;pfungstabelle angelegt werden. Dies erledigt die Prozedur mit einer <b>INSERT INTO<\/b>-Abfrage, die wiederum fast komplett dynamisch zusammengesetzt wird:<\/p>\n<pre>\"INSERT INTO \" & m_mnTable & \"(\" & m_mField & \", \" & m_nField & \") VALUES(\" & m_Form(m_mField) & \", \" & lngID & \")\"<\/pre>\n<p>Die Aktionsabfrage f&uuml;gt der in <b>m_mnTable <\/b>angegebenen Tabelle f&uuml;r die beiden Felder aus <b>m_mField <\/b>und <b>m_nField <\/b>den aktuellen Wert des Prim&auml;rschl&uuml;sselfeldes des Formulars und den Wert der gebundenen Spalte des Listenfeldes f&uuml;r den aktuellen Eintrag hinzu.<\/p>\n<p>Die <b>Execute<\/b>-Methode des <b>Database<\/b>-Objekts f&uuml;hrt die Abfrage schlie&szlig;lich aus.<\/p>\n<p>Sollte der soeben angeklickte Eintrag abgew&auml;hlt worden sein, verwendet die Prozedur eine <b>DELETE<\/b>-Abfrage:<\/p>\n<pre>\"DELETE FROM \" & m_mnTable & \" WHERE \" & m_mField & \" = \" & m_Form(m_mField) & \" AND \" & m_nField & \" = \" & lngID<\/pre>\n<p>Diese l&ouml;scht den Datensatz aus der in <b>m_mnTable <\/b>angegebenen Tabelle, dessen Felder aus <b>m_mField <\/b>und <b>m_nField <\/b>dem Prim&auml;rschl&uuml;sselwert des aktuellen Datensatzes des Formulars und der gebundenen Spalte des angeklickten Listenfeldeintrages entsprechen.<\/p>\n<p><b>Variante mit erweiterter Auswahl<\/b><\/p>\n<p>Man k&ouml;nnte die Prozedur zum Speichern der aktivierten oder deaktivierten Eintr&auml;ge noch so anpassen, dass sie auch mit Listenfeldern zusammenarbeitet.<\/p>\n<p>Dazu m&uuml;sste man dann bei jedem Mausklick alle Eintr&auml;ge durchlaufen und diese dahingehend pr&uuml;fen, ob sie markiert sind. Sie finden den ge&auml;nderten Code f&uuml;r diesen Anwendungsfall in der Klasse <b>clsPersistenteMehrfachauswahl_Erweitert<\/b>. <\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Mit der L&ouml;sung aus diesem Beitrag k&ouml;nnen Sie Listenfeldern ganz einfach die Funktionalit&auml;t zum Aktivieren und Speichern der ausgew&auml;hlten Eintr&auml;ge hinzuf&uuml;gen. Voraussetzung ist, dass das Listenfeld eine Mehrfachauswahl auf Basis zweier per m:n-Beziehung verkn&uuml;pfter Tabellen darstellt.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>PersistenteMehrfachauswahlMitKlasse.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{CA60B763-58CB-499D-ACED-3D34D116F653}\/aiu_902.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn Sie Listenfelder f&uuml;r die Anzeige von Daten aus m:n-Beziehungen nutzen, m&uuml;ssen Sie die &Auml;nderungen an der Auswahl jeweils in der zugrunde liegenden m:n-Verkn&uuml;pfungstabelle speichern und diese beim Anzeigen eines Datensatzes wiederherstellen. Das ist kein Hexenwerk, wie der Beitrag Persistente Mehrfachauswahl in Listenfeldern (www.access-im-unternehmen.de\/479) zeigt. Wenn Sie diese Technik h&auml;ufiger verwenden, artet das Anlegen der entsprechenden Ereignisprozeduren jedoch in echte Arbeit aus. Warum also die Funktionalit&auml;t nicht einfach in eine Klasse auslagern und diese wiederverwenden<\/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":[662013,66052013,44000023],"tags":[],"class_list":["post-55000902","post","type-post","status-publish","format-standard","hentry","category-662013","category-66052013","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>Persistente Mehrfachauswahl mit Klasse - 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\/Persistente_Mehrfachauswahl_mit_Klasse\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Persistente Mehrfachauswahl mit Klasse\" \/>\n<meta property=\"og:description\" content=\"Wenn Sie Listenfelder f&uuml;r die Anzeige von Daten aus m:n-Beziehungen nutzen, m&uuml;ssen Sie die &Auml;nderungen an der Auswahl jeweils in der zugrunde liegenden m:n-Verkn&uuml;pfungstabelle speichern und diese beim Anzeigen eines Datensatzes wiederherstellen. Das ist kein Hexenwerk, wie der Beitrag Persistente Mehrfachauswahl in Listenfeldern (www.access-im-unternehmen.de\/479) zeigt. Wenn Sie diese Technik h&auml;ufiger verwenden, artet das Anlegen der entsprechenden Ereignisprozeduren jedoch in echte Arbeit aus. Warum also die Funktionalit&auml;t nicht einfach in eine Klasse auslagern und diese wiederverwenden\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Persistente_Mehrfachauswahl_mit_Klasse\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:30:31+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg05.met.vgwort.de\/na\/565bb03f53b841d1b58060818e51c818\" \/>\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=\"14\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Persistente_Mehrfachauswahl_mit_Klasse\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Persistente_Mehrfachauswahl_mit_Klasse\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Persistente Mehrfachauswahl mit Klasse\",\"datePublished\":\"2020-05-22T21:30:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Persistente_Mehrfachauswahl_mit_Klasse\\\/\"},\"wordCount\":2348,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Persistente_Mehrfachauswahl_mit_Klasse\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/565bb03f53b841d1b58060818e51c818\",\"articleSection\":[\"2013\",\"5\\\/2013\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Persistente_Mehrfachauswahl_mit_Klasse\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Persistente_Mehrfachauswahl_mit_Klasse\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Persistente_Mehrfachauswahl_mit_Klasse\\\/\",\"name\":\"Persistente Mehrfachauswahl mit Klasse - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Persistente_Mehrfachauswahl_mit_Klasse\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Persistente_Mehrfachauswahl_mit_Klasse\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/565bb03f53b841d1b58060818e51c818\",\"datePublished\":\"2020-05-22T21:30:31+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Persistente_Mehrfachauswahl_mit_Klasse\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Persistente_Mehrfachauswahl_mit_Klasse\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Persistente_Mehrfachauswahl_mit_Klasse\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/565bb03f53b841d1b58060818e51c818\",\"contentUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/565bb03f53b841d1b58060818e51c818\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Persistente_Mehrfachauswahl_mit_Klasse\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Persistente Mehrfachauswahl mit Klasse\"}]},{\"@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":"Persistente Mehrfachauswahl mit Klasse - 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\/Persistente_Mehrfachauswahl_mit_Klasse\/","og_locale":"de_DE","og_type":"article","og_title":"Persistente Mehrfachauswahl mit Klasse","og_description":"Wenn Sie Listenfelder f&uuml;r die Anzeige von Daten aus m:n-Beziehungen nutzen, m&uuml;ssen Sie die &Auml;nderungen an der Auswahl jeweils in der zugrunde liegenden m:n-Verkn&uuml;pfungstabelle speichern und diese beim Anzeigen eines Datensatzes wiederherstellen. Das ist kein Hexenwerk, wie der Beitrag Persistente Mehrfachauswahl in Listenfeldern (www.access-im-unternehmen.de\/479) zeigt. Wenn Sie diese Technik h&auml;ufiger verwenden, artet das Anlegen der entsprechenden Ereignisprozeduren jedoch in echte Arbeit aus. Warum also die Funktionalit&auml;t nicht einfach in eine Klasse auslagern und diese wiederverwenden","og_url":"https:\/\/access-im-unternehmen.de\/Persistente_Mehrfachauswahl_mit_Klasse\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:30:31+00:00","og_image":[{"url":"http:\/\/vg05.met.vgwort.de\/na\/565bb03f53b841d1b58060818e51c818","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"14\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Persistente_Mehrfachauswahl_mit_Klasse\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Persistente_Mehrfachauswahl_mit_Klasse\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Persistente Mehrfachauswahl mit Klasse","datePublished":"2020-05-22T21:30:31+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Persistente_Mehrfachauswahl_mit_Klasse\/"},"wordCount":2348,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Persistente_Mehrfachauswahl_mit_Klasse\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/565bb03f53b841d1b58060818e51c818","articleSection":["2013","5\/2013","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Persistente_Mehrfachauswahl_mit_Klasse\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Persistente_Mehrfachauswahl_mit_Klasse\/","url":"https:\/\/access-im-unternehmen.de\/Persistente_Mehrfachauswahl_mit_Klasse\/","name":"Persistente Mehrfachauswahl mit Klasse - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Persistente_Mehrfachauswahl_mit_Klasse\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Persistente_Mehrfachauswahl_mit_Klasse\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/565bb03f53b841d1b58060818e51c818","datePublished":"2020-05-22T21:30:31+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Persistente_Mehrfachauswahl_mit_Klasse\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Persistente_Mehrfachauswahl_mit_Klasse\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Persistente_Mehrfachauswahl_mit_Klasse\/#primaryimage","url":"http:\/\/vg05.met.vgwort.de\/na\/565bb03f53b841d1b58060818e51c818","contentUrl":"http:\/\/vg05.met.vgwort.de\/na\/565bb03f53b841d1b58060818e51c818"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Persistente_Mehrfachauswahl_mit_Klasse\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Persistente Mehrfachauswahl mit Klasse"}]},{"@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\/55000902","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=55000902"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000902\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000902"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000902"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000902"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}