{"id":55000917,"date":"2014-02-01T00:00:00","date_gmt":"2020-05-22T21:18:30","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=917"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Kombinationsfeld_mit_Bearbeitungsfunktion","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Kombinationsfeld_mit_Bearbeitungsfunktion\/","title":{"rendered":"Kombinationsfeld mit Bearbeitungsfunktion"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/e511379823de4b079744af1785df386e\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Kombinationsfelder dienen in der Regel der Auswahl eines Eintrags aus einer Lookup-Tabelle.  In manchen F&auml;llen programmiert man noch Funktionen hinzu, mit denen ein noch nicht vorhandener Eintrag in der zugrunde liegenden Tabelle gespeichert werden kann. Wir gehen noch einen Schritt weiter und erlauben dem Benutzer, Eintr&auml;ge zu l&ouml;schen oder zu bearbeiten. Das Ganze nat&uuml;rlich unter Ber&uuml;cksichtigung dessen, dass bereits verwendete Eintr&auml;ge nicht gel&ouml;scht werden k&ouml;nnen.<\/b><\/p>\n<p>Kombinationsfelder sind sehr flexible Steuerelemente, sind sie doch grunds&auml;tzlich bereits dazu ausgelegt, Daten per Auswahl oder per Eingabe anzunehmen &#8211; oder auch beides in Kombination.<\/p>\n<p>Wenn Sie ein Kombinationfeld dazu verwenden, die Daten einer Lookup-Tabelle anzuzeigen, also einer Tabelle, die lediglich die normalerweise in ein Textfeld einer anderen Tabelle einzutragenden Werte aufnimmt und zum Zwecke der Vermeidung von Redundanzen und Inkonsistenzen speichert, k&ouml;nnen Sie noch mehr aus diesem Steuerelement herausholen. Dazu wollen wir drei Funktionen zum TreeView hinzuf&uuml;gen:<\/p>\n<ul>\n<li>Anlegen eines neuen Datensatzes<\/li>\n<li>&auml;ndern eines bestehenden Datensatzes<\/li>\n<li>L&ouml;schen eines Datensatzes<\/li>\n<\/ul>\n<p>Dazu wollen wir nicht viel mehr nutzen als das Kombinationsfeld und drei zus&auml;tzliche Schaltfl&auml;chen beziehungsweise Kontextmen&uuml;-Eintr&auml;ge (s. Bild 1). Die drei Schaltfl&auml;chen hei&szlig;en <b>cmdNeu<\/b>, <b>cmdAendern <\/b>und <b>cmdLoeschen<\/b>. Die erste soll eine <b>Inputbox <\/b>anzeigen, die den Wert f&uuml;r den neuen Datensatz entgegennimmt. Wenn der Benutzer einen Wert eingetragen hat, soll dieser in der zugrunde liegenden Tabelle gespeichert und im Kombinationsfeld ausgew&auml;hlt werden. Die gleiche Funktion soll der Benutzer noch &uuml;ber zwei weitere Wege aufrufen k&ouml;nnen: erstens &uuml;ber den Kontextmen&uuml;-Eintrag namens <b>Neuer Eintrag <\/b>und zweitens, indem er den neuen Wert direkt in das Kombinationsfeld eintr&auml;gt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_01\/pic_917_002.png\" alt=\"So soll das Formular sp&auml;ter aussehen.\" width=\"575\" height=\"272,3214\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: So soll das Formular sp&auml;ter aussehen.<\/span><\/b><\/p>\n<p>Dieses soll dann nach R&uuml;ckfrage ebenfalls in der Tabelle gespeichert und gleich im Kombinationsfeld ausgew&auml;hlt werden.<\/p>\n<p>Die zweite Aktion, das Bearbeiten des aktuellen Datensatzes, wird &uuml;ber die Schaltfl&auml;che <b>cmdBearbeiten <\/b>oder &uuml;ber den Kontextmen&uuml;-Eintrag <b>Eintrag bearbeiten <\/b>aufgerufen. Dies kann nicht durch direktes Bearbeiten des aktuellen Eintrags im Kombinationsfeld erfolgen, da so ja schon neue Datens&auml;tze angelegt werden sollen.<\/p>\n<p>Die dritte Aktion ist das L&ouml;schen des aktuell angezeigten Eintrags. Diese Aktion ist mit gro&szlig;er Vorsicht zu behandeln: Schlie&szlig;lich kann es ja sein, dass bereits Datens&auml;tze des Formulars mit dem aktuellen Eintrag im Kombinationsfeld verkn&uuml;pft sind. In diesem Fall geschieht nichts (wenn keine L&ouml;schweitergabe definiert ist) oder der Datensatz im Formular wird gleich mit dem Eintrag des Kombinationsfeldes mit gel&ouml;scht &#8211; mehr dazu weiter unten.<\/p>\n<p>Wir m&uuml;ssen also auf irgendeine Weise daf&uuml;r sorgen, dass ein bereits verkn&uuml;pfter Eintrag der Lookup-Tabelle nicht gel&ouml;scht werden kann &#8211; entweder durch  Deaktivieren des entsprechenden Kontextmen&uuml;-Eintrags beziehungsweise der Schaltfl&auml;che oder durch Ausgabe einer passenden Meldung, wenn der Benutzer es versucht. Der erste Ansatz ist hier vorzuziehen, weil er ergonomischer ist &#8211; der Benutzer wei&szlig; so direkt, dass er den aktuellen Eintrag nicht l&ouml;schen kann.<\/p>\n<p><b>Datenmodell-Voraussetzungen<\/b><\/p>\n<p>F&uuml;r die betroffenen Tabellen der hier vorgestellten Technik gibt es die eine oder andere Voraussetzung. Zum Ersten ben&ouml;tigen Sie nat&uuml;rlich eine Tabelle mit den im Formular angezeigten Werten sowie eine weitere Tabelle mit Lookupdaten.<\/p>\n<p>Die erste Tabelle enth&auml;lt ein Fremdschl&uuml;sselfeld, mit dem ein Datensatz der Lookup-Tabelle ausgew&auml;hlt werden kann. In unserem Beispiel sind dies die Tabellen <b>tblEinzelteile <\/b>und <b>tblEinzelteilkategorien <\/b>(siehe auch den Beitrag <b>St&uuml;cklisten<\/b>, <b>www.access-im-unternehmen.de\/923<\/b>). Bild 2 zeigt die beiden Tabellen im Beziehungen-Fenster.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_01\/pic_917_001.png\" alt=\"Tabellen f&uuml;r das Beispiel zu diesem Beitrag\" width=\"450\" height=\"232,7922\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Tabellen f&uuml;r das Beispiel zu diesem Beitrag<\/span><\/b><\/p>\n<p>Damit das L&ouml;schen eines Eintrags der Tabelle <b>tblEinzelteilkategorien <\/b>im Kombinationsfeld, was ja sonst nicht so einfach m&ouml;glich ist, nicht zum L&ouml;schen eines Datensatzes in der verkn&uuml;pften Tabelle <b>tblEinzelteile <\/b>f&uuml;hrt, d&uuml;rfen Sie in diesem Fall auf keinen Fall die <b>L&ouml;schweitergabe an verwandte Datens&auml;tze <\/b>aktivieren (s. Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_01\/pic_917_003.png\" alt=\"Eigenschaften der Beziehung\" width=\"350\" height=\"212,1212\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Eigenschaften der Beziehung<\/span><\/b><\/p>\n<p>Desweiteren m&uuml;ssen Sie aber auf jeden Fall die referenzielle Integrit&auml;t aktivieren. Anderenfalls k&ouml;nnte man problemlos auch Datens&auml;tze aus der Lookup-Tabelle <b>tblEinzelteilkategorien <\/b>l&ouml;schen, die bereits einem oder mehreren Datens&auml;tzen der Tabelle <b>tblEinzelteile <\/b>zugewiesen sind.<\/p>\n<p>Schlie&szlig;lich sollten Sie f&uuml;r das Feld <b>Einzelteilkategorie <\/b>der Tabelle <b>tblEinzelteilkategorien <\/b>einen eindeutigen Index anlegen, damit jede Kategorie nur einmal in der Tabelle gespeichert werden kann.<\/p>\n<p><b>Beispielformular erstellen<\/b><\/p>\n<p>Das Beispielformular <b>frmEinzelteile <\/b>enth&auml;lt die Tabelle <b>tblEinzelteile <\/b>als Datenherkunft und zeigt all ihre Felder an (s. Bild 4). Das Feld <b>EinzelteilkategorieID <\/b>haben wir als Kombinationsfeld ausgef&uuml;hrt und diesem den Namen <b>cboEinzelteilkategorieID <\/b>gegeben.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_01\/pic_917_004.png\" alt=\"Entwurf des Formulars\" width=\"575\" height=\"233,9285\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Entwurf des Formulars<\/span><\/b><\/p>\n<p>Das Feld verwendet die folgende SQL-Abfrage als Datensatzherkunft:<\/p>\n<pre>SELECT -EinzelteilkategorieID, -Einzelteilkategorie -FROM -tblEinzelteilkategorien \r\n-ORDER BY Einzelteilkategorie;<\/pre>\n<p>Die beiden Eigenschaften <b>Spaltenanzahl <\/b>und <b>Spaltenbreiten <\/b>sind auf die Werte <b>2 <\/b>und <b>0cm <\/b>eingestellt, damit nur die Werte der zweiten Spalte angezeigt werden.<\/p>\n<p>Nebem dem Kombinationsfeld platzieren Sie drei Schaltfl&auml;chen namens <b>cmdLoeschen<\/b>, <b>cmdBearbeiten <\/b>und <b>cmdNeu<\/b>. Diese versehen Sie, wenn vorhanden, am besten mit entsprechenden Icons &#8211; mit diesen sparen Sie eine Menge Platz gegen&uuml;ber Schaltlf&auml;chen mit Beschriftungen.<\/p>\n<p><b>Eintrag l&ouml;schen per Schaltfl&auml;che<\/b><\/p>\n<p>Die Schaltfl&auml;che <b>cmdLoeschen <\/b>soll eine Prozedur ausl&ouml;sen, die den aktuellen Eintrag im Kombinationsfeld l&ouml;scht.<\/p>\n<p>Moment mal: Soll man denn nicht nur solche Eintr&auml;ge der Tabelle <b>tblEinzelteilkategorien <\/b>l&ouml;schen k&ouml;nnen, die mit keinem Datensatz der Tabelle <b>tblEinzelteile <\/b>verkn&uuml;pft sind Und sollte nicht der aktuelle Eintrag des Kombinationfeldes <b>cboEinzelteilkategorieID <\/b>auch dem aktuellen Datensatz im Hauptformular zugeordnet sein Das ist zu einigen Gelegenheiten der Fall &#8211; zum Beispiel beim &ouml;ffnen des Formulars, beim Wechseln des Datensatzes oder auch nach dem Ausw&auml;hlen eines Eintrags im Kombinationsfeld und dem anschlie&szlig;enden Speichern des Datensatzes.<\/p>\n<p>In dem Moment aber, in dem Sie gerade einen neuen Eintrag aus dem Kombinationsfeld ausgew&auml;hlt, den Datensatz aber noch nicht gespeichert haben, ist dieser nicht dem aktuellen Datensatz zugeordnet. Sie k&ouml;nnen also einen Eintrag ausw&auml;hlen und diesen l&ouml;schen, sofern er auch keinem anderem Datensatz der Datenherkunft des Formulars zugeordnet ist.<\/p>\n<p>Kommen wir nun zu der Funktion, die durch die Schaltfl&auml;che <b>cmdLoeschen<\/b> ausgel&ouml;st wird. Diese sieht wie in Listing 1 aus und und ruft lediglich eine weitere Funktion namens <b>EintragLoeschen<\/b> auf. Dabei &uuml;bergibt sie zwei Werte als Parameter:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdLoeschen_Click()\r\n     EintragLoeschen Me!cboEinzelteilkategorieID, Me!cboEinzelteilkategorieID.Column(1)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Aufruf der Prozedur zum L&ouml;schen des Datensatzes zum aktuellen Eintrag des Kombinationsfeldes cboEinzelteilkategorieI<\/span><\/b><\/p>\n<ul>\n<li>den aktuellen Wert des Kombinationsfeldes und<\/li>\n<li>den aktuell angezeigten Eintrag.<\/li>\n<\/ul>\n<p>Die Prozedur <b>EintragLoeschen<\/b> finden Sie in Listing 2. Sie verarbeitet zun&auml;chst den zweiten &uuml;bergebenen Parameter, der in einem Meldungsfenster angezeigt wird, das den Benutzer fragt, ob der Eintrag wirklich gel&ouml;scht werden soll. Ist dies der Fall, f&uuml;hrt die Prozedur mit der <b>Execute<\/b>-Methode eine <b>DELETE<\/b>-Abfrage aus, die den entsprechenden Datensatz l&ouml;scht. Als Vergleichswert des Kriteriums verwendet sie dabei den mit dem ersten Parameter &uuml;bergebenen Wert. Nach dem L&ouml;schen aktualisiert die Prozedur die Daten des Kombinationsfeldes mit der <b>Requery<\/b>-Methode. Das Kombinationsfeld ist nach diesem Aufruf leer, da der zuletzt gespeicherte Wert gel&ouml;scht wurde. Man k&ouml;nnte hier auch einen anderen Wert eintragen &#8211; zum Beispiel eine Aufforderung wie <b><Eintrag ausw&auml;hlen><\/b>. Dies w&uuml;rde jedoch voraussetzen, dass wir diesen Eintrag in der Datensatzherkunft des Kombinationsfeldes ber&uuml;cksichtigen.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>EintragLoeschen(lngID<span style=\"color:blue;\"> As Long<\/span>, strEintrag<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     If <span style=\"color:blue;\">MsgBox<\/span>(\"M&ouml;chten Sie den Eintrag ''\" & strEintrag & \"'' wirklich l&ouml;schen\", _\r\n             vbYesNo + vbExclamation, \"Eintrag l&ouml;schen\") _\r\n             = vbYes Then\r\n         <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n         db.Execute \"DELETE FROM tblEinzelteilkategorien WHERE EinzelteilkategorieID = \" & lngID\r\n         Me!cboEinzelteilkategorieID.Requery\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Prozedur zum L&ouml;schen des aktuellen Kombinationsfeld-Eintrags<\/span><\/b><\/p>\n<p>Also passen wir die Datensatzherkunft wie folgt an:-<\/p>\n<pre>SELECT 0 AS -EinzelteilkategorieID, -\"&lt;Kategorie -ausw&auml;hlen&gt;\" -AS -Einzelteilkategorie \r\nFROM -tblEinzelteilkategorien\r\nUNION\r\nSELECT EinzelteilkategorieID, -Einzelteilkategorie\r\nFROM tblEinzelteilkategorien\r\nORDER BY Einzelteilkategorie;<\/pre>\n<p>F&uuml;r das Feld <b>EinzelteilkategorieID<\/b> der Tabelle <b>tblEinzelteile <\/b>stellen wir au&szlig;erdem als <b>Standardwert <\/b>den Wert <b>0 <\/b>ein. Auf diese Weise zeigt das Formular bei einem neuen Datensatz gleich den Eintrag <b><Eintrag ausw&auml;hlen><\/b> an (s. Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_01\/pic_917_005.png\" alt=\"Standardeintrag f&uuml;r das Kombinationsfeld anzeigen\" width=\"575\" height=\"191,0715\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Standardeintrag f&uuml;r das Kombinationsfeld anzeigen<\/span><\/b><\/p>\n<p>Damit dieser Eintrag nach dem L&ouml;schen eines vorhandenen Eintrags angezeigt wird, erg&auml;nzen Sie die Routine um die folgende Zeile, die Sie als letzte Anweisung innerhalb der <b>If&#8230;Then<\/b>-Bedingung einf&uuml;gen:<\/p>\n<pre>Me!cboEinzelteilkategorieID = 0<\/pre>\n<p><b>Bearbeiten eines Eintrags<\/b><\/p>\n<p>Das Kombinationsfeld l&auml;dt praktisch dazu ein, einen Eintrag direkt im Kombinationsfeld zu bearbeiten. Dies lie&szlig;e sich auch realisieren, allerdings f&uuml;hrt das &auml;ndern eines vorhandenen Eintrags in einen Eintrag, der noch nicht vorhanden ist, zum Ausl&ouml;sen des Ereignisses <b>Bei nicht in Liste <\/b>&#8211; und damit legt das Formular einen neuen Datensatz in der Tabelle <b>tblEinzelteileKategorien <\/b>an (siehe weiter unten unter <b>Neuen Eintrag anlegen<\/b>).<\/p>\n<p><!--30percent--><\/p>\n<p>Also bieten wir rechts neben dem Kombinationsfeld die Schaltfl&auml;che <b>cmdBearbeiten<\/b> an. Diese soll eine Inputbox &ouml;ffnen, die den vorhandenen Eintrag anzeigt und dem Benutzer die M&ouml;glichkeit gibt, diesen zu &auml;ndern.<\/p>\n<p>Dabei ist zumindest ein Punkt zu beachten: Wir m&uuml;ssen eine Spezialbehandlung f&uuml;r den Fall vorsehen, dass der Benutzer den Eintrag in einen bereits vorhandenen Eintrag &auml;ndert. Daf&uuml;r gibt es zwei M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Wir versuchen, den neuen Eintrag zu speichern. Dies l&ouml;st wegen des eindeutigen Indexes auf dem Feld <b>Einzelpreiskategorie <\/b>Fehler <b>3022 <\/b>aus. Darauf k&ouml;nnen wir reagieren, indem wir den Benutzer darauf hinweisen, dass ein solcher Eintrag bereits vorhanden ist.<\/li>\n<li>Wir k&ouml;nnen auch eine M&ouml;glichkeit vorsehen, die daf&uuml;r sorgt, dass der ge&auml;nderte und nun doppelt vorhandene Eintrag gel&ouml;scht und alle Datens&auml;tze der Tabelle <b>tblEinzelteile <\/b>im Feld <b>EinzelteilkategorieID <\/b>den Prim&auml;rschl&uuml;sselwert des Datensatzes der Tabelle <b>tblEinzelteilkategorien <\/b>erhalten, in den der Benutzer den vorhandenen Eintrag &auml;ndern wollte.<\/li>\n<\/ul>\n<p>Um Letzteres zu verstehen, brauchen wir vielleicht ein Beispiel: Angenommen, es gibt in der Tabelle <b>tblEinzelteilkategorien <\/b>einen Eintrag <b>Kategorie 1 <\/b>und einen Eintrag <b>Kategorie 2<\/b>. Beide sind bereits mit Datens&auml;tzen der Tabelle <b>tblEinzelteile <\/b>verkn&uuml;pft. Nun m&ouml;chte der Benutzer den Namen der Kategorie <b>Kategorie 1 <\/b>in <b>Kategorie 2 <\/b>&auml;ndern. Wenn wir dies per <b>UPDATE<\/b>-Anweisung versuchen, l&ouml;st dies den Fehler <b>3022 <\/b>aus, weil <b>Kategorie 2 <\/b>ja schon vorhanden ist. An dieser Stelle k&ouml;nnen wir dem Benutzer eine Meldung anzeigen, dass die &auml;nderung nicht m&ouml;glich ist. Wir k&ouml;nnen aber auch fragen, ob er vielleicht alle Einzelteile, die der <b>Kategorie 1 <\/b>zugeordnet waren, der <b>Kategorie 2 <\/b>zuordnen m&ouml;chte. Wenn man es sich recht &uuml;berlegt, kann man darauf aber auch verzichten: Davon ausgehend, dass der Benutzer die <b>Kategorie 1 <\/b>durch die <b>Kategorie 2 <\/b>ersetzen m&ouml;chte, l&ouml;schen wir einfach <b>Kategorie 1 <\/b>und weisen allen Datens&auml;tzen der Tabelle <b>tblEinzelteile<\/b>, die der <b>Kategorie 1 <\/b>zugeordnet waren, der <b>Kategorie 2 <\/b>zu. Gut: Wer mag, kann nat&uuml;rlich auch hier noch eine R&uuml;ckfrage einbauen, um auf Nummer sicher zu gehen. Wir erledigen dies allerdings ohne eine R&uuml;ckfrage.<\/p>\n<p>Die Schaltfl&auml;che <b>cmdBearbeiten <\/b>l&ouml;st beim Anklicken schlie&szlig;lich die Prozedur aus Listing 3 aus. Dabei &uuml;bergibt sie als Parameter den Wert der gebundenen Spalte des Kombinationsfeldes sowie auch den angezeigten Wert, den sie &uuml;ber die Eigenschaft <b>Column(1) <\/b>ermittelt.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdEdit_Click()\r\n     EintragBearbeiten Me!cboEinzelteilkategorieID, Me!cboEinzelteilkategorieID.Column(1)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Aufruf der Routine zum &auml;ndern eines Eintrags<\/span><\/b><\/p>\n<p>Die Prozedur <b>EintragBearbeiten <\/b>finden Sie in Listing 4. Sie erwartet die beiden bereits genannten Parameter und speichert diese in den Variablen <b>lngID <\/b>und <b>strEintrag<\/b>. Sie fragt zun&auml;chst per <b>InputBox <\/b>den ge&auml;nderten Wert f&uuml;r den Eintrag ab. Dabei soll die <b>InputBox <\/b>den bisher verwendeten Wert als Vorschlag anzeigen (s. Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_01\/pic_917_006.png\" alt=\"Anbieten des vorhandenen Werts als Vorgabe\" width=\"575\" height=\"206,3438\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Anbieten des vorhandenen Werts als Vorgabe<\/span><\/b><\/p>\n<p>Gibt der Benutzer einen Wert ein, dessen L&auml;nge gr&ouml;&szlig;er als <b>0 <\/b>ist, und klickt dann auf die <b>OK<\/b>-Schaltfl&auml;che, f&uuml;hrt die Prozedur die folgenden Anweisungen aus. Das Anklicken der Schaltfl&auml;che <b>Abbrechen <\/b>liefert hingegen eine leere Zeichenkette, die Prozedur wird daraufhin ohne weitere Aktionen beendet.<\/p>\n<p>Bei Vorliegen eines Wertes f&uuml;r <b>strEintrag <\/b>versucht die Prozedur zun&auml;chst, einen neuen Datensatz mit der angegebenen <b>Einzelteilkategorie <\/b>in der Tabelle <b>tblEinzelteilkategorien <\/b>anzulegen. Dabei deaktiviert sie zuvor die Fehlerbehandlung. Einen beim Aufruf der <b>DELETE<\/b>-Anweisung auftretenden Fehler registriert die Prozedur, indem sie die Fehlernummer in die Variable <b>lngError <\/b>schreibt. So k&ouml;nnen wir direkt im Anschluss die Fehlerbehandlung mit <b>On Error Goto 0 <\/b>wieder aktivieren und den Fehler in Ruhe auswerten.<\/p>\n<p>Die folgende <b>If&#8230;Then<\/b>-Bedingung pr&uuml;ft, ob ein Fehler mit der Nummer <b>3022 <\/b>aufgetreten ist. Ist das der Fall, ist der Eintrag bereits in der Tabelle <b>tblEinzelteilkategorien <\/b>vorhanden. Also soll die Prozedur den zuvor ausgew&auml;hlten Eintrag des Kombinationsfeldes l&ouml;schen und alle damit verkn&uuml;pften Datens&auml;tze der Tabelle <b>tblEinzelteile <\/b>mit der bereits vorhandenen Kategorie gleichen Namens verkn&uuml;pfen.<\/p>\n<p>Dazu fragt die Prozedur zun&auml;chst per <b>DLookup<\/b>-Funktion den Prim&auml;rschl&uuml;sselwert des Datensatzes der Tabelle <b>tblEinzelteilkategorien <\/b>ab, dessen Feld <b>Einzelteilkategorie <\/b>den bereits vorhandenen Wert enth&auml;lt, und speichert diesen in der Variablen <b>lngIDNeu<\/b>.<\/p>\n<p>Dann aktualisiert sie alle Datens&auml;tze der Tabelle <b>tblEinzelteile<\/b>, deren Feld <b>EinzelteilkategorieID <\/b>die ID des zu &auml;ndernden Eintrags der Tabelle <b>tblEinzelteilkategorien <\/b>referenziert, in den Wert aus <b>lngIDNeu <\/b>ab.<\/p>\n<p>Somit d&uuml;rfte es nun keinen Datensatz mehr geben, der mit der zu &uuml;bertragenden Kategorie verkn&uuml;pft ist. Also kann die Prozedur den Datensatz der Tabelle <b>tblEinzelteilkategorien <\/b>mit dem Wert <b>lngID <\/b>im Feld <b>EinzelteilkategorieID <\/b>per <b>DELETE<\/b>-Aktionsabfrage l&ouml;schen.<\/p>\n<p>F&uuml;r den Fall, dass die zuerst ausgef&uuml;hrte <b>UPDATE<\/b>-Abfrage keinen Fehler ausgel&ouml;st hat, f&uuml;hrt die Prozedur den zweiten Teil der <b>If&#8230;Then<\/b>-Bedingung aus. Hier tragen wir einfach nur den Wert von <b>lngID <\/b>in <b>lngIDNeu <\/b>ein.<\/p>\n<p>Damit kann die Prozedur im Anschluss an die <b>If&#8230;Then<\/b>-Bedingung weiterarbeiten &#8211; und zwar, indem sie das Kombinationsfeld <b>cboEinzelteilkategorien <\/b>aktualisiert und dieser f&uuml;r den aktuell angezeigten Datensatz im Hauptformular den Wert aus <b>lngIDNeu <\/b>zuweist, der zuvor ermittelt wurde.<\/p>\n<p><b>Neuen Eintrag anlegen<\/b><\/p>\n<p>Zum Anlegen eines neuen Eintrags wollen wir nicht nur die Schaltfl&auml;che und den Kontextmen&uuml;-Eintrag, sondern auch noch die direkte Eingabe eines neuen Eintrags im Kombinationsfeld anbieten.<\/p>\n<p>Diese schauen wir uns zuerst an. Das Hinzuf&uuml;gen eines noch nicht vorhandenen Eintrags in ein Kombinationsfeld l&ouml;st das Ereignis <b>Bei nicht in Liste <\/b>aus, auf das wir mit der Prozedur aus Listing 5 reagieren wollen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboEinzelteilkategorieID_NotInList(NewData<span style=\"color:blue;\"> As String<\/span>, Response<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">MsgBox<\/span>(\"Kategorie ''\" & NewData & \"'' anlegen\", vbYesNo) = vbYes<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n         db.Execute \"INSERT INTO tblEinzelteilkategorien(Einzelteilkategorie) VALUES(''\" _\r\n             & NewData & \"'')\", dbFailOnError\r\n         Response = acDataErrAdded\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Routine zum Hinzuf&uuml;gen eines Eintrags<\/span><\/b><\/p>\n<p>Die Prozedur erh&auml;lt den neuen Eintrag mit dem Parameter <b>NewData<\/b>, Sie m&uuml;ssen diesen also nicht erst noch aus dem Kombinationsfeld auslesen. Sie fragt den Benutzer per Meldungsfenster, ob dieser einen neuen Eintrag f&uuml;r die neue Kategorie anlegen m&ouml;chte.<\/p>\n<p>Falls ja, legt die Prozeduren diesen per <b>INSERT INTO<\/b>-Anweisung an und gibt mit dem Parameter Response den Wert <b>acDataErrAdded <\/b>zur&uuml;ck. Dies sorgt daf&uuml;r, dass das Kombinationsfeld direkt auf den richtigen Wert eingestellt wird.<\/p>\n<p>Wenn wir dies per Schaltfl&auml;che erreichen wollen, ist der Weg etwas anders. Die Schaltfl&auml;che <b>cmdNeu <\/b>ruft zun&auml;chst die folgende Prozedur auf:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdNeu_Click()\r\n     EintragHinzufuegen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Funktion <b>EintragHinzufuegen<\/b> sieht wie in Listing 6 aus. Die Funktion erwartet in diesem Fall keine Parameter, da sie den Wert des hinzuzuf&uuml;genden Eintrags noch selbst abfragt. Dies erledigt sie wiederum per <b>InputBox <\/b>und speichert das Ergebnis in der Variablen <b>strEintrag<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>EintragHinzufuegen()\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>strEintrag<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngError<span style=\"color:blue;\"> As Long<\/span>\r\n     strEintrag = InputBox(\"Geben Sie den Wert des neuen Eintrag an.\", \"Neuer Eintrag\", _\r\n          \"[Neuer Eintrag]\")\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strEintrag) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         db.Execute \"INSERT INTO tblEinzelteilkategorien(Einzelteilkategorie) VALUES(''\" _\r\n             & strEintrag & \"'')\", dbFailOnError\r\n         lngError = Err.Number\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n         Select Case lngError\r\n             <span style=\"color:blue;\">Case <\/span>0\r\n                 lngID = db.OpenRecordset(\"SELECT @@IDENTITY\").Fields(0)\r\n                 Me!cboEinzelteilkategorieID.Requery\r\n                 Me!cboEinzelteilkategorieID = lngID\r\n             <span style=\"color:blue;\">Case <\/span>3022\r\n                 <span style=\"color:blue;\">MsgBox<\/span> \"Der Eintrag ist bereits vorhanden und wird nun f&uuml;r dieses Einzelteil festgelegt.\"\r\n                 lngID = DLookup(\"EinzelteilkategorieID\", \"tblEinzelteilkategorien\", _\r\n                     \"Einzelteilkategorie = ''\" & strEintrag & \"''\")\r\n                 Me!cboEinzelteilkategorieID = lngID\r\n             <span style=\"color:blue;\">Case Else<\/span>\r\n                 <span style=\"color:blue;\">MsgBox<\/span> \"Fehler \" & lngError & \" \" & AccessError(lngError)\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Routine zum Hinzuf&uuml;gen eines Eintrags per Schaltfl&auml;che oder Kontextmen&uuml;<\/span><\/b><\/p>\n<p>Hat der Benutzer einen Wert eingegeben (ist die L&auml;nge von <b>strEintrag <\/b>also gr&ouml;&szlig;er <b>0<\/b>), versucht die Funktion, einen neuen Datensatz mit dem Wert aus <b>strEintrag <\/b>im Feld <b>Einzelteilkategorie <\/b>mit einer <b>INSERT INTO<\/b>-Anweisung zur Tabelle <b>tblEinzelteilkategorien <\/b>hinzuzuf&uuml;gen. Die Fehlerbehandlung deaktivieren wir f&uuml;r diesen Zeitraum erneut und speichern den Wert aus <b>Err.Number <\/b>in der Variablen <b>lngError<\/b>, bevor wir die Fehlerbehandlung wieder aktivieren.<\/p>\n<p>Dann untersucht die Funktion innerhalb einer <b>Select Case<\/b>-Anweisung, welchen Wert <b>lngError <\/b>hat, und reagiert entsprechend darauf. Im Falle des Wertes <b>0 <\/b>(kein Fehler aufgetreten) liest die Funktion mit <b>SELECT @@IDENTITY <\/b>den Wert des zuletzt innerhalb der aktuellen Sitzung hinzugef&uuml;gten Autowert-Feldes aus und speichert diesen in <b>lngID<\/b>. Sie aktualisiert den Inhalt des Kombinationsfeldes <b>cboEinzelteilkategorieID <\/b>und stellt dieses auf den neu hinzugef&uuml;gten Eintrag ein.<\/p>\n<p>Im Falle der Fehlernummer <b>3022 <\/b>ist der Eintrag schon vorhanden. Im Gegensatz zur Ereignisprozedur, die durch das Ereignis <b>Bei nicht in Liste <\/b>ausgel&ouml;st wird, kann dies hier nat&uuml;rlich passieren.<\/p>\n<p>Der Benutzer erh&auml;lt dann eine entsprechende Meldung. Damit der Benutzer dennoch etwas von der vergeblichen Eingabe des neuen Eintrags hat, soll die Funktion zumindest den bestehenden Eintrag gleichen Namens im Kombinationsfeld ausw&auml;hlen.<\/p>\n<p>Dazu muss die Funktion jedoch zun&auml;chst den Prim&auml;rschl&uuml;sselwert dieses Eintrags in der Tabelle <b>tblEinzelteilkategorien <\/b>ausfindig machen.<\/p>\n<p>Dies erledigt sie mit einer entsprechenden <b>DLookup<\/b>-Abfrage und weist den gefundenen Wert dem Kombinationsfeld zu.<\/p>\n<p>Tritt ein anderer Fehlerwert als <b>0 <\/b>oder <b>3022 <\/b>auf, gibt die Funktion eine Fehlermeldung mit der Fehlernummer und der Fehlerbeschreibung aus.<\/p>\n<p><b>Funktionen per Kontextmen&uuml; aufrufen<\/b><\/p>\n<p>Nachdem wir uns die drei Routinen angesehen haben, mit denen Sie per Schaltfl&auml;che oder durch direkte Eingabe Eintr&auml;ge zur Tabelle <b>tblEinzelteilkategorien <\/b>hinzuf&uuml;gen oder vorhandene Eintr&auml;ge l&ouml;schen oder bearbeiten k&ouml;nnen, wollen wir nun noch ein Kontextmen&uuml; hinzuf&uuml;gen, um diese drei Vorg&auml;nge auf andere Art und Weise aufzurufen.<\/p>\n<p>Wenn Sie bereits Schaltfl&auml;chen verwenden, ben&ouml;tigen Sie nat&uuml;rlich nicht zwingend ein Kontextmen&uuml;. Wenn das betroffene Formular jedoch nur wenig Platz bietet, ist der Einsatz eines Kontextmen&uuml;s durchaus sinnvoll. Schauen wir uns also an, wie Sie ein solches Kontextmen&uuml; beim Rechtsklick auf das Kombinationfeld hervorzaubern und wie die gew&uuml;nschten Aktionen ausgef&uuml;hrt werden. Die Anzeige des Kontextmen&uuml;s soll erfolgen, wenn der Benutzer mit der rechten Maustaste auf das Kontextmen&uuml; klickt. Dies l&ouml;st das Ereignis <b>Bei Maustaste ab <\/b>des Kontextmen&uuml;s aus, was wir durch Implementierung der Ereignisprozedur <b>cboEinzelteilkategorieID_MouseDown <\/b>ausnutzen (s. Listing 7).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboEinzelteilkategorieID_MouseDown(Button<span style=\"color:blue;\"> As Integer<\/span>, Shift<span style=\"color:blue;\"> As Integer<\/span>, X<span style=\"color:blue;\"> As Single<\/span>, Y<span style=\"color:blue;\"> As Single<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>cbr<span style=\"color:blue;\"> As <\/span>CommandBar\r\n     <span style=\"color:blue;\">Dim <\/span>cbc<span style=\"color:blue;\"> As <\/span>CommandBarButton\r\n     <span style=\"color:blue;\">If <\/span>Button = acRightButton<span style=\"color:blue;\"> Then<\/span>\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         CommandBars(\"Kombifeldmenue\").Delete\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n         <span style=\"color:blue;\">Set<\/span> cbr = CommandBars.Add(\"Kombifeldmenue\", msoBarPopup, False, <span style=\"color:blue;\">True<\/span>)\r\n         <span style=\"color:blue;\">Set<\/span> cbc = cbr.Controls.Add(msoControlButton)\r\n         <span style=\"color:blue;\">With<\/span> cbc\r\n             .Caption = \"Eintrag bearbeiten\"\r\n             .OnAction = \"=EintragBearbeiten(\" & Me!cboEinzelteilkategorieID & \", ''\" _\r\n                 & Me!cboEinzelteilkategorieID.Column(1) & \"'')\"\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> cbc = cbr.Controls.Add(msoControlButton)\r\n         <span style=\"color:blue;\">With<\/span> cbc\r\n             .Caption = \"Eintrag hinzuf&uuml;gen\"\r\n             .OnAction = \"EintragHinzufuegen()\"\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> cbc = cbr.Controls.Add(msoControlButton)\r\n         <span style=\"color:blue;\">With<\/span> cbc\r\n             .Caption = \"Eintrag l&ouml;schen\"\r\n             .OnAction = \"=EintragLoeschen(\" & Me!cboEinzelteilkategorieID & \", ''\" _\r\n                 & Me!cboEinzelteilkategorieID.Column(1) & \"'')\"\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         Me.ShortcutMenu = <span style=\"color:blue;\">False<\/span>\r\n         cbr.ShowPopup\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Diese Ereignisprozedur zeigt das Kontextmen&uuml; zum Hinzuf&uuml;gen, L&ouml;schen oder Editieren eines Kombinationsfeldeintrags an.<\/span><\/b><\/p>\n<p>Die Prozedur wird beim Dr&uuml;cken beliebiger Maustasten ausgel&ouml;st, also pr&uuml;ft diese zun&auml;chst, welche Maustaste der Benutzer verwendet hat. Im Falle der rechten Maustaste liefert der Parameter Button daf&uuml;r die Konstante <b>acRightButton<\/b>, was wir mittels <b>If&#8230;Then<\/b>-Bedingung pr&uuml;fen. Dann deaktiviert die Prozedur die Fehlerbehandlung, um ohne Fehlermeldung ein eventuell bereits vorhandenes Kontextmen&uuml; gleichen Namens zu entfernen. Anschlie&szlig;end erstellt sie das Kontextmen&uuml; erneut und vergibt dabei den Namen <b>Kombifeldmenue<\/b>. Das neue <b>CommandBar<\/b>-Objekt wird mit <b>msoBarPopup <\/b>als Kontextmen&uuml; gekennzeichnet und soll nur tempor&auml;r erzeugt werden, also mit dem Schlie&szlig;en von Access wieder verschwinden.<\/p>\n<p>F&uuml;r das mit <b>cbr <\/b>referenzierte <b>CommandBar<\/b>-Objekt erstellt die Funktion alsdann die erste Schaltfl&auml;che (festgelegt durch den Typ <b>msoControlButton<\/b>) und stellt die Beschriftung auf <b>Eintrag bearbeiten <\/b>sowie die beim Ausw&auml;hlen auszuf&uuml;hrende Funktion auf <b>=EintragBearbeiten(&#8230;) <\/b>ein. F&uuml;r diesen Funktionsaufruf legt die Prozedur noch zwei Parameter fest. Der erste ist der Wert der gebundenen Spalte des Kombinationfeldes, der zweite der angezeigte Wert. Zusammen ergibt sich also etwa ein Aufruf wie der folgende:<\/p>\n<pre>=EintragBearbeiten(1, ''Kategorie 1'')<\/pre>\n<p>Auf &auml;hnliche Art f&uuml;gt die Prozedur den zweiten Eintrag hinzu. Diesmal soll dieser <b>Eintrag hinzuf&uuml;gen <\/b>hei&szlig;en. Der Aufbau der Funktion ist diesmal einfacher: Er besteht schlicht und einfach aus dem Gleichheitszeichen, dem Funktionsnamen und einem Klammernpaar:<\/p>\n<pre>=EintragHinzufuegen()<\/pre>\n<p>Der Eintrag zum L&ouml;schen eines Eintrags erwartet wiederum die gleichen Parameter wie der zum &auml;ndern eines Eintrags, zum Beispiel:<\/p>\n<pre>=EintragLoeschen(1, ''Kapitel 1'')<\/pre>\n<p>Damit nach dem Ausw&auml;hlen eines Eintrags des Kontextmen&uuml;s nicht noch das eingebaute Kontextmen&uuml; angezeigt wird, deaktivieren wir dies formularweit durch Einstellen der Eigenschaft <b>ShortcutMenu <\/b>auf den Wert <b>False<\/b>. Schlie&szlig;lich sorgt die Methode <b>ShopPopup <\/b>des <b>CommandBar<\/b>-Objekts f&uuml;r die Anzeige des Kontextmen&uuml;s.<\/p>\n<p><b>Funktionen des Kontextmen&uuml;s<\/b><\/p>\n<p>Dadurch, dass wir f&uuml;r die durch die Schaltfl&auml;chen ausgel&ouml;sten Ereignisse angelegten Prozeduren bereits so angelegt haben, dass diese die ben&ouml;tigen Informationen ermitteln und dann weitere Funktionen mit &uuml;bergabe entsprechender Parameter aufrufen, liegen die f&uuml;r die f&uuml;r die Kontextmen&uuml;-Eintr&auml;ge definierten Funktionen bereits vor: <b>EintragLoeschen<\/b>, <b>EintragHinzufuegen <\/b>und <b>EintragBearbeiten<\/b>.<\/p>\n<p><b>L&ouml;schen-Schaltfl&auml;che aktivieren\/deaktivieren<\/b><\/p>\n<p>Fehlt noch ein Aspekt, den wir bisher nicht ber&uuml;cksichtigt haben: Je nachdem, ob der aktuell angezeigte Eintrag im Kombinationsfeld bereits mit einem der Eintr&auml;ge der Haupttabelle <b>tblEinzelteile <\/b>verkn&uuml;pft ist, soll die Schaltfl&auml;che <b>cmdLoeschen <\/b>deaktiviert werden. Auch der Kontextmen&uuml;-Eintrag <b>Eintrag l&ouml;schen <\/b>soll nicht verwendet werden k&ouml;nnen.<\/p>\n<p>Zu welchen Gelegenheiten m&uuml;ssen wir pr&uuml;fen, ob die L&ouml;schen-Schaltfl&auml;che zu aktivieren oder deaktivieren ist<\/p>\n<p>Zun&auml;chst einmal beim Wechseln des Datensatzes des Formulars. Dies erledigen wir durch eine Ereignisprozedur, die durch das Ereignis <b>Beim Anzeigen <\/b>des Formulars ausgel&ouml;st wird:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Current()\r\n     LoeschenAktivieren\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Den Rest der Arbeit, n&auml;mlich die Erstellung der Funktion <b>LoeschenAktivieren<\/b>, erledigen wie gleich im Anschluss. Wir wollen aber noch eine weitere Prozedur erstellen, n&auml;mlich eine Ereignisprozedur, die nach dem Ausw&auml;hlen des Kontextmen&uuml;-Eintrags ausgel&ouml;st wird. Diese sieht so aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboEinzelteilkategorieID_ AfterUpdate()\r\n     LoeschenAktivieren\r\n<span style=\"color:blue;\">End Sub<\/span> <\/pre>\n<p>Die Funktion <b>LoeschenAktivieren <\/b>sieht wie in Listing 8 aus. Sie pr&uuml;ft, ob der aktuell ausgew&auml;hlte Eintrag im Kombinationsfeld bereits einem Datensatz der Tabelle <b>tblEinzelteile <\/b>zugeordnet ist. Dies ist nur dann nicht der Fall, wenn der Benutzer soeben einen neuen Eintrag ausgew&auml;hlt und den Datensatz noch nicht gespeichert hat &#8211; und der neue Eintrag auch noch keinem anderen Datensatz zugeordnet ist.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>LoeschenAktivieren()<span style=\"color:blue;\"> As Boolean<\/span>\r\n     If DLookup(\"EinzelteilID\", \"tblEinzelteile\", \"EinzelteilkategorieID = \" _\r\n             & Me!cboEinzelteilkategorieID) _\r\n             Or Nz(Me!cboEinzelteilkategorieID, 0) = 0 Then\r\n         Me!cmdLoeschen.Enabled = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me!cmdLoeschen.Enabled = <span style=\"color:blue;\">True<\/span>\r\n         LoeschenAktivieren = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Funktion zum Aktivieren oder Deaktivieren der L&ouml;schen-Schaltfl&auml;che<\/span><\/b><\/p>\n<p>Die Funktion setzen wir auch noch in der Prozedur <b>cboEinzelteilkategorienID_MouseDown <\/b>ein, um den Kontextmen&uuml;-Eintrag <b>Eintrag l&ouml;schen <\/b>gegebenenfalls zu deaktivieren:<\/p>\n<pre><span style=\"color:blue;\">If <\/span>LoeschenAktivieren = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n     .Enabled = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Wenn Sie die in Kombinationsfeldern verwendeten Lookup-Tabellen wie in diesem Beitrag ausstatten, ben&ouml;tigen Sie kein eigenes Formular mehr f&uuml;r die grundlegende Verwaltung der Eintr&auml;ge der Lookup-Tabelle.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>KombifeldMitBearbeitungsfunktion.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{3F3D9A95-316E-4343-A04B-9A7B07CCA853}\/aiu_917.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kombinationsfelder dienen in der Regel der Auswahl eines Eintrags aus einer Lookup-Tabelle.  In manchen F&auml;llen programmiert man noch Funktionen hinzu, mit denen ein noch nicht vorhandener Eintrag in der zugrunde liegenden Tabelle gespeichert werden kann. Wir gehen noch einen Schritt weiter und erlauben dem Benutzer, Eintr&auml;ge zu l&ouml;schen oder zu bearbeiten. Das Ganze nat&uuml;rlich unter Ber&uuml;cksichtigung dessen, dass bereits verwendete Eintr&auml;ge nicht gel&ouml;scht werden 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":[66012014,662014,44000023],"tags":[],"class_list":["post-55000917","post","type-post","status-publish","format-standard","hentry","category-66012014","category-662014","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Kombinationsfeld mit Bearbeitungsfunktion - 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\/Kombinationsfeld_mit_Bearbeitungsfunktion\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kombinationsfeld mit Bearbeitungsfunktion\" \/>\n<meta property=\"og:description\" content=\"Kombinationsfelder dienen in der Regel der Auswahl eines Eintrags aus einer Lookup-Tabelle. In manchen F&auml;llen programmiert man noch Funktionen hinzu, mit denen ein noch nicht vorhandener Eintrag in der zugrunde liegenden Tabelle gespeichert werden kann. Wir gehen noch einen Schritt weiter und erlauben dem Benutzer, Eintr&auml;ge zu l&ouml;schen oder zu bearbeiten. Das Ganze nat&uuml;rlich unter Ber&uuml;cksichtigung dessen, dass bereits verwendete Eintr&auml;ge nicht gel&ouml;scht werden k&ouml;nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Kombinationsfeld_mit_Bearbeitungsfunktion\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:18:30+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/e511379823de4b079744af1785df386e\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"21\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kombinationsfeld_mit_Bearbeitungsfunktion\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kombinationsfeld_mit_Bearbeitungsfunktion\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Kombinationsfeld mit Bearbeitungsfunktion\",\"datePublished\":\"2020-05-22T21:18:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kombinationsfeld_mit_Bearbeitungsfunktion\\\/\"},\"wordCount\":3682,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kombinationsfeld_mit_Bearbeitungsfunktion\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/e511379823de4b079744af1785df386e\",\"articleSection\":[\"1\\\/2014\",\"2014\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Kombinationsfeld_mit_Bearbeitungsfunktion\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kombinationsfeld_mit_Bearbeitungsfunktion\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kombinationsfeld_mit_Bearbeitungsfunktion\\\/\",\"name\":\"Kombinationsfeld mit Bearbeitungsfunktion - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kombinationsfeld_mit_Bearbeitungsfunktion\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kombinationsfeld_mit_Bearbeitungsfunktion\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/e511379823de4b079744af1785df386e\",\"datePublished\":\"2020-05-22T21:18:30+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kombinationsfeld_mit_Bearbeitungsfunktion\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Kombinationsfeld_mit_Bearbeitungsfunktion\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kombinationsfeld_mit_Bearbeitungsfunktion\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/e511379823de4b079744af1785df386e\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/e511379823de4b079744af1785df386e\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kombinationsfeld_mit_Bearbeitungsfunktion\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kombinationsfeld mit Bearbeitungsfunktion\"}]},{\"@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":"Kombinationsfeld mit Bearbeitungsfunktion - 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\/Kombinationsfeld_mit_Bearbeitungsfunktion\/","og_locale":"de_DE","og_type":"article","og_title":"Kombinationsfeld mit Bearbeitungsfunktion","og_description":"Kombinationsfelder dienen in der Regel der Auswahl eines Eintrags aus einer Lookup-Tabelle. In manchen F&auml;llen programmiert man noch Funktionen hinzu, mit denen ein noch nicht vorhandener Eintrag in der zugrunde liegenden Tabelle gespeichert werden kann. Wir gehen noch einen Schritt weiter und erlauben dem Benutzer, Eintr&auml;ge zu l&ouml;schen oder zu bearbeiten. Das Ganze nat&uuml;rlich unter Ber&uuml;cksichtigung dessen, dass bereits verwendete Eintr&auml;ge nicht gel&ouml;scht werden k&ouml;nnen.","og_url":"https:\/\/access-im-unternehmen.de\/Kombinationsfeld_mit_Bearbeitungsfunktion\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:18:30+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/e511379823de4b079744af1785df386e","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"21\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Kombinationsfeld_mit_Bearbeitungsfunktion\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Kombinationsfeld_mit_Bearbeitungsfunktion\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Kombinationsfeld mit Bearbeitungsfunktion","datePublished":"2020-05-22T21:18:30+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Kombinationsfeld_mit_Bearbeitungsfunktion\/"},"wordCount":3682,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Kombinationsfeld_mit_Bearbeitungsfunktion\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/e511379823de4b079744af1785df386e","articleSection":["1\/2014","2014","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Kombinationsfeld_mit_Bearbeitungsfunktion\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Kombinationsfeld_mit_Bearbeitungsfunktion\/","url":"https:\/\/access-im-unternehmen.de\/Kombinationsfeld_mit_Bearbeitungsfunktion\/","name":"Kombinationsfeld mit Bearbeitungsfunktion - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Kombinationsfeld_mit_Bearbeitungsfunktion\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Kombinationsfeld_mit_Bearbeitungsfunktion\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/e511379823de4b079744af1785df386e","datePublished":"2020-05-22T21:18:30+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Kombinationsfeld_mit_Bearbeitungsfunktion\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Kombinationsfeld_mit_Bearbeitungsfunktion\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Kombinationsfeld_mit_Bearbeitungsfunktion\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/e511379823de4b079744af1785df386e","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/e511379823de4b079744af1785df386e"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Kombinationsfeld_mit_Bearbeitungsfunktion\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Kombinationsfeld mit Bearbeitungsfunktion"}]},{"@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\/55000917","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=55000917"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000917\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000917"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000917"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000917"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}