{"id":55000739,"date":"2010-10-01T00:00:00","date_gmt":"2020-05-22T22:07:23","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=739"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Unterformulare_Daten_anlegen_und_loeschen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Unterformulare_Daten_anlegen_und_loeschen\/","title":{"rendered":"Unterformulare: Daten anlegen und l&ouml;schen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/b62091c51f6b4963ab3dbf8d4da6a610\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Unterformulare zeigen meist vom Hauptformular abh&auml;ngige Daten in der Datenblattansicht an &#8211; beispielsweise die Projekte eines Kunden oder die Artikel einer Kategorie. Manchmal dient das Hauptformular aber auch nur der Steuerung des Zugriffs auf die Daten im Unterformular und liefert etwa eine Einf&uuml;gen-, Detailansicht\/Bearbeiten- oder L&ouml;schen-Schaltfl&auml;che f&uuml;r die Bearbeitung der im Unterformular angezeigten Datens&auml;tze. In diesem Beitrag zeigen wir, wie Sie ein solches Formular anlegen und die Steuerelemente zum Steuern des Unterformulars ausstatten.<\/b><\/p>\n<p>Man kann nicht zwingend davon ausgehen, dass Benutzer wissen, wie sie mit den &uuml;blichen Navigationselementen eines Formulars in der Datenblattansicht umgehen m&uuml;ssen &#8211; also beispielsweise mit dem Datensatzmarkierer oder der Navigationsleiste. Manchmal macht man sich das Leben einfacher, wenn man lediglich entsprechende Schaltfl&auml;chen bereitstellt, um etwa einen Datensatz zu l&ouml;schen oder einen neuen anzulegen.<\/p>\n<p>Was das Bearbeiten von Daten in der Datenblattansicht angeht, kommt es sehr auf die Art der Bearbeitung an: Wenn man wirklich schnell Zugriff auf ein paar Werte haben m&ouml;chte, die &uuml;ber mehrere Datens&auml;tze verteilt sind, macht ein Bearbeiten in der Datenblattansicht durchaus Sinn. <\/p>\n<p>Oftmals tut man dem Benutzer damit jedoch keinen Gefallen: Es kann n&auml;mlich schnell passieren, dass man gerade in sehr breiten Datenblattansichten einen Feldinhalt &auml;ndert, der zum falschen Datensatz geh&ouml;rt &#8211; dies geschieht umso &ouml;fter, je weiter das zu bearbeitende Feld am rechten Rand des Unterformulars liegt.<\/p>\n<p>Was also tun Ganz einfach: Sie verwenden die Datenblattansicht einfach nur zum Betrachten, Durchsuchen und Sortieren der Daten und stellen f&uuml;r alle &uuml;brigen Aufgaben ein Detailformular zur Bearbeitung des jeweiligen Datensatzes zur Verf&uuml;gung. Dieses zeigt immer nur einen Datensatz an und enth&auml;lt eine <b>OK<\/b>&#8211; und eine <b>Abbrechen<\/b>-Schaltfl&auml;che, um &auml;nderungen im jeweils ge&ouml;ffneten Datensatz zu best&auml;tigen oder zu verwerfen.<\/p>\n<p>Um einen Datensatz der Datenblattansicht in diesem Detailformular anzuzeigen, f&uuml;gen Sie dem Hauptformular eine Schaltfl&auml;che zum Anf&uuml;gen eines neuen Datensatzes (dies &ouml;ffnet das Detailformular mit einem leeren, neuen Datensatz) und eine zum Bearbeiten des aktuell markierten Datensatzes hinzu. Um das Angebot abzurunden, k&ouml;nnen Sie die beiden Schaltfl&auml;chen noch um eine dritte erg&auml;nzen, die zum L&ouml;schen des aktuell markierten Datensatzes im Unterformular dient.<\/p>\n<p>Damit offensichtlich ist, dass sich diese drei Schaltfl&auml;chen auf die Daten im Unterformular beziehen, sollten Sie diese entsprechend positionieren. Nachdem Unterformulare meistens eher am unteren Rand des Hauptformulars landen und dieses noch darunter in der Regel die Schaltfl&auml;chen zum Schlie&szlig;en des Hauptformulars selbst unterbringt, f&auml;llt dieser Ort weg. Sinnvoll ist daher beispielsweise die Anordnung der Schaltfl&auml;chen zum Steuern des Unterformulars direkt &uuml;ber dem Unterformular.<\/p>\n<p>Im ersten Beispiel verwenden wie eine ganz einfache Adresstabelle als Datenquelle f&uuml;r das Unterformular in der Datenblattansicht (s. Bild 1). <b>AnredeID <\/b>ist ein Fremdschl&uuml;sselfeld, das als Nachschlagefeld ausgelegt ist und die Daten der Tabelle <b>tblAnreden <\/b>anzeigt, die lediglich aus den beiden Feldern <b>AnredeID <\/b>und <b>Anrede <\/b>besteht.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/UnterformularSteuern-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Entwurf der Beispieltabelle tblAdressen<\/span><\/b><\/p>\n<p><b>Haupt- und Unterformular erstellen<\/b><\/p>\n<p>Als Erstes erstellen Sie ein Unterformular, das Sie unter dem Namen <b>sfmAdressen <\/b>speichern und dem Sie als Datenherkunft die Tabelle <b>tblAdressen <\/b>zuweisen.<\/p>\n<p>Ziehen Sie dann alle Felder der Tabelle aus der Feldliste in den Detailbereich der Entwurfsansicht. Stellen Sie die Eigenschaft <b>Standardansicht <\/b>auf den Wert <b>Datenblatt <\/b>ein.<\/p>\n<p>Schlie&szlig;en Sie das Unterformular und legen Sie das Hauptformular an. Dieses erh&auml;lt den Namen <b>frmAdressen<\/b>. Ziehen Sie das Unterformular <b>sfmAdressen <\/b>in den Detailbereich der Entwurfsansicht des Formulars <b>frmAdressen<\/b>, sodass sich ein Bild wie in Bild 2 ergibt.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/UnterformularSteuern-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Entwurf des Hauptformulars mit eingebautem Unterformular<\/span><\/b><\/p>\n<p>Stellen Sie au&szlig;erdem die Eigenschaften <b>Trennlinien<\/b>, <b>Datensatzmarkierer<\/b>, <b>Navigationsschaltfl&auml;chen <\/b>und <b>Bildlaufleisten <\/b>auf <b>Nein <\/b>sowie die Eigenschaft <b>Automatisch zentrieren <\/b>auf <b>Ja <\/b>ein &#8211; das Hauptformular zeigt ja keine eigenen Daten an, daher brauchen wir daf&uuml;r auch keine Navigationselemente.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Neu und L&ouml;schen im Unterformular<\/p>\n<p>Wir legen nun zun&auml;chst zwei Schaltfl&auml;chen namens <b>cmdNeu<\/b> und <b>cmdLoeschen <\/b>mit den Beschriftungen <b>Neue Adresse <\/b>und <b>Adresse l&ouml;schen <\/b>im Hauptformular gleich oberhalb des Unterformulars an.<\/p>\n<p>Diese Schaltfl&auml;chen sollen die angegebene Aktion gleich im Unterformular durchf&uuml;hren, also den Datensatzmarkierer entweder auf einem neuen, leeren Datensatz positionieren oder den aktuell markierten Datensatz l&ouml;schen. Sp&auml;ter schauen wir uns die Variante an, bei der das Anlegen und zus&auml;tzlich das Bearbeiten &uuml;ber ein Detailformular erfolgen.<\/p>\n<p>Wenn der Benutzer auf die Schaltfl&auml;che <b>Neue Adresse <\/b>klickt, soll schlicht der Fokus auf einem neuen, leeren Datensatz landen. Legen Sie die folgende Ereignisprozedur f&uuml;r das Ereignis <b>Beim Klicken <\/b>der Schaltfl&auml;che <b>cmdNeu <\/b>an:<\/p>\n<pre>Private Sub cmdNeu_Click()\r\n    Me!sfmAdressen.SetFocus\r\n    DoCmd.GoToRecord Record:=acNewRec\r\nEnd Sub<\/pre>\n<p>Diese braucht zwei Schritte zum Erreichen des Ziels: Als Erstes setzt sie den Fokus auf das Unterformular-Steuerelement. Dies ist gleichbedeutend mit dem Setzen des Fokus auf das Formular im Unterformular-Steuerelement, was Sie mit dieser Anweisung erreichen w&uuml;rden (und was letztlich genauer ist):<\/p>\n<pre>Me!sfmAdressen.Form.SetFocus<\/pre>\n<p>Die zweite Anweisung springt zu einem neuen, leeren Datensatz &#8211; der Benutzer kann nun gleich mit dem Eingeben der Daten beginnen.<\/p>\n<p>Beim L&ouml;schen eines Datensatzes ist das Prinzip &auml;hnlich. Allerdings schalten wir hier noch eine Meldung vor, die sicherstellt, dass der Datensatz tats&auml;chlich gel&ouml;scht werden soll. Falls ja, setzen wir ebenfalls den Fokus auf das Unterformular-Steuerelement und l&ouml;schen den Datensatz dann mit der <b>RunCommand<\/b>-Methode des <b>Application<\/b>-Objekts unter Verwendung des Parameters <b>acDeleteRecord<\/b>:<\/p>\n<pre>Private Sub cmdLoeschen_Click()\r\n    If MsgBox(&quot;Wirklich l&ouml;schen&quot;, vbYesNo + vbExclamation, &quot;L&ouml;schvorgang&quot;) = vbYes Then\r\n        Me!sfmAdressen.SetFocus\r\n        Application.RunCommand acCmdDeleteRecord\r\n    End If\r\nEnd Sub<\/pre>\n<p><!--30percent--><\/p>\n<p>Sowohl beim Anlegen eines neuen als auch beim L&ouml;schen eines bestehenden Datensatzes kommen Methoden zum Einsatz, die das Bet&auml;tigen bestimmter Elemente der Benutzeroberfl&auml;che durch den Benutzer nachbilden. <b>SetFocus <\/b>bildet den Mausklick des Benutzers in das Unterformular nach und <b>GotoRecord <\/b>und <b>RunCommand DeleteRecord <\/b>sind prinzipiell das VBA-Pendant entsprechender Men&uuml;befehle.<\/p>\n<p>Wir wollen es etwas genauer machen und greifen nun direkt auf das Recordset-Objekt des Unterformulars zu. Die Prozedur zum Anlegen eines neuen Datensatzes sieht dann so aus:<\/p>\n<pre>Private Sub cmdNeu_Click()\r\n    Me!sfmAdressen.Form.Recordset.AddNew\r\nEnd Sub<\/pre>\n<p>Das <b>Recordset<\/b>-Objekt enth&auml;lt eine Referenz auf die Datensatzgruppe, die das Unterformular gerade anzeigt. Die <b>AddNew<\/b>-Methode springt zu einem neuen Datensatz dieser Datensatzgruppe.<\/p>\n<p>Auch beim L&ouml;schen wollen wir den direkten Weg w&auml;hlen:<\/p>\n<pre>Private Sub cmdLoeschen_Click()\r\n    If MsgBox(&quot;Wirklich l&ouml;schen&quot;, vbYesNo + vbExclamation, &quot;L&ouml;schvorgang&quot;) = vbYes Then\r\n        Me!sfmAdressen.Form.Recordset.Delete\r\n    End If\r\nEnd Sub<\/pre>\n<p>Genau wie <b>AddNew<\/b>-Methode einen neuen Datensatz anlegt, l&ouml;scht die <b>Delete<\/b>-Methode den aktuell markierten Datensatz.<\/p>\n<p>Wir m&uuml;ssen hier noch eine kleine Sicherung einbauen, denn es kann passieren, dass der Benutzer erst einen neuen Datensatz anlegt und diesen dann gleich l&ouml;schen m&ouml;chte &#8211; ohne ihn vorher durch Wechseln zu einem anderen Datensatz, Bet&auml;tigen von <b>Strg + S <\/b>oder eine andere Methode gespeichert zu haben.<\/p>\n<p>In diesem Fall versucht er, einen physisch noch gar nicht vorhandenen Datensatz zu l&ouml;schen, was zu einem Fehler f&uuml;hrt. Wir pr&uuml;fen also vor dem L&ouml;schen noch, ob &uuml;berhaupt ein Datensatz markiert ist beziehungsweise ob der Datensatzzeiger sich gerade auf einem frisch angelegten, aber noch nicht gespeicherten Datensatz befindet. Diese Information liefert die <b>NewRecord<\/b>-Eigenschaft des Unterformulars:<\/p>\n<pre>Private Sub cmdLoeschen_Click()\r\n    If Not Me!sfmAdressen.Form.NewRecord Then\r\n        ''... L&ouml;schvorgang\r\n    End If\r\nEnd Sub<\/pre>\n<p>Wenn der Benutzer nun auf die <b>L&ouml;schen<\/b>-Schaltfl&auml;che klickt, w&auml;hrend er gerade einen neuen Datensatz anlegt, geschieht schlicht gar nichts.<\/p>\n<p><b>Abh&auml;ngige L&ouml;schen-Schaltfl&auml;che<\/b><\/p>\n<p>Dies k&ouml;nnte den Benutzer irritieren: Immerhin ist die Schaltfl&auml;che aktiviert, l&ouml;st aber keine Aktion aus. Besser w&auml;re es, wenn eine Schaltfl&auml;che nur dann aktiviert ist, wenn sie auch etwas erledigt.<\/p>\n<p>Wir m&uuml;ssen also eine M&ouml;glichkeit finden, die <b>L&ouml;schen<\/b>-Schaltfl&auml;che (und genau genommen auch die <b>Neu<\/b>-Schaltfl&auml;che) zu deaktivieren, wenn der Datensatzzeiger des Unterformulars auf einem neuen, noch nicht gespeicherten Datensatz steht.<\/p>\n<p>Die einfachste M&ouml;glichkeit bietet das Ereignis <b>Beim Anzeigen<\/b> des Unterformulars, denn dieses wird immer dann ausgel&ouml;st, wenn der Datensatzzeiger zu einem anderen Datensatz springt.<\/p>\n<p>&Ouml;ffnen Sie also das Formular <b>sfmAdressen <\/b>in der Entwurfsansicht und f&uuml;gen Sie der Ereigniseigenschaft <b>Beim Anzeigen <\/b>die folgende Ereignisprozedur hinzu:<\/p>\n<pre>Private Sub Form_Current()\r\n    If Me.NewRecord Then\r\n        Me.Parent!cmdNeu.Enabled = False\r\n        Me.Parent!cmdLoeschen.Enabled = False\r\n    Else\r\n        Me.Parent!cmdNeu.Enabled = True\r\n        Me.Parent!cmdLoeschen.Enabled = True\r\n    End If\r\nEnd Sub<\/pre>\n<p>Die Prozedur pr&uuml;ft mit der Eigenschaft <b>NewRecord<\/b>, ob das Unterformular einen neuen Datensatz anzeigt, und stellt die Eigenschaft <b>Enabled <\/b>der beiden Schaltfl&auml;chen <b>cmdNeu <\/b>und <b>cmdLoeschen <\/b>je nach Ergebnis auf <b>False <\/b>oder <b>True <\/b>ein. Wenn wir den Inhalt dieser Prozedur ein wenig umformen, haben wir weniger Schreib- und somit auch weniger Wartungsaufwand:<\/p>\n<pre>Dim bolNewRecord As Boolean\r\nbolNewRecord = Me.NewRecord\r\nMe.Parent!cmdNeu.Enabled = Not bolNewRecord\r\nMe.Parent!cmdLoeschen.Enabled = Not bolNewRecord<\/pre>\n<p><b>bolNewRecord <\/b>speichert den Wert der Eigenschaft <b>NewRecord<\/b>, damit wir nicht zweimal darauf zugreifen m&uuml;ssen (in der vorherigen Variante sogar viermal). Die <b>Enabled<\/b>-Eigenschaft der beiden Schaltfl&auml;chen wird nun einfach auf das Gegenteil der <b>NewRecord<\/b>-Eigenschaft eingestellt. Bild 3 zeigt das Ergebnis dieser Prozedur.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/UnterformularSteuern-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Die Schaltfl&auml;chen zum Anlegen und L&ouml;schen von Datens&auml;tzen werden deaktiviert, wenn der Benutzer gerade einen neuen Datensatz bearbeitet. <\/span><\/b><\/p>\n<p><b>Abh&auml;ngigkeiten vermeiden<\/b><\/p>\n<p>Nun gibt es ein paar Regeln, die der eine als Erbsenz&auml;hlerei abtut und die der andere als wichtig erachtet. Eine davon besagt, dass zwei Objekte m&ouml;glichst wenige Abh&auml;ngigkeiten voneinander aufweisen sollten.<\/p>\n<p>In unserem Fall ist das Hauptformular vom Unterformular abh&auml;ngig und umgekehrt. Die Abh&auml;ngigkeit des Hauptformulars vom Unterformular ist gering: Es braucht nur irgendein Unterformular, das es mit seinen beiden Schaltfl&auml;chen <b>cmdNeu<\/b> und <b>cmdLoeschen <\/b>steuern kann.<\/p>\n<p>Noch nicht einmal der Name des Unterformulars ist relevant. Die folgende Anweisung etwa bezieht sich nur scheinbar auf ein Unterformular namens <b>sfmAdressen<\/b>:<\/p>\n<pre>Me!sfmAdressen.Form.Recordset.Delete<\/pre>\n<p><b>sfmAdressen <\/b>ist n&auml;mlich der Name des Unterformular-Steuerelements, und der k&ouml;nnte auch einfach <b>sfm <\/b>lauten. Das eigentlich im Unterformular-Steuerelement angezeigte Formular wird &uuml;ber die <b>Form<\/b>-Eigenschaft referenziert und ist beliebig austauschbar &#8211; Hauptsache, es enth&auml;lt eine Datenherkunft und erlaubt es, neue Datens&auml;tze anzulegen und bestehende zu l&ouml;schen.<\/p>\n<p>Andersherum ist das Unterformular daf&uuml;r verantwortlich, die beiden Schaltfl&auml;chen des Hauptformulars in Abh&auml;ngigkeit vom aktuell ausgew&auml;hlten Datensatz zu aktivieren oder zu deaktivieren.<\/p>\n<p>Das ist nicht gut, weil Sie das Formular so niemals in einem anderen Kontext nutzen k&ouml;nnen &#8211; es muss immer als Unterformular eines Formulars eingesetzt werden, das die beiden Schaltfl&auml;chen <b>cmdNeu <\/b>und <b>cmdLoeschen <\/b>enth&auml;lt.<\/p>\n<p>Versuchen Sie einmal, das Formular <b>sfmAdressen <\/b>einzeln zu &ouml;ffnen: Dies l&ouml;st einen Fehler aus, weil das Formular in der Ereignisprozedur <b>Form_Current <\/b>versucht, Eigenschaften von Schaltfl&auml;chen im &uuml;bergeordneten Formular einzustellen (s. Bild 4).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/UnterformularSteuern-web-images\/pic004.png\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Dieser Fehler tritt auf, wenn Sie das Unterformular sfmAdressen einzeln &ouml;ffnen.<\/span><\/b><\/p>\n<p>Der zweite Nachteil tritt auf, wenn ein Unterformularsteuerelement nicht nur dieses Formular anzeigen soll, sondern gegebenenfalls zur Laufzeit auch einmal ein anderes Formular aufnehmen soll.<\/p>\n<p>Sie m&uuml;ssten dann allen infrage kommenden Unterformularen den Code zum Einstellen der <b>Enabled<\/b>-Eigenschaft der Schaltfl&auml;chen <b>cmdNeu <\/b>und <b>cmdLoeschen <\/b>hinzuf&uuml;gen.<\/p>\n<p><b>Komplette Steuerung per Hauptformular<\/b><\/p>\n<p>Also kommt nun die optimale L&ouml;sung: Diese nimmt dem Unterformular jegliche Verantwortlichkeit und somit auch jegliche Abh&auml;ngigkeit vom Hauptformular (die hier beschriebenen Formulare finden Sie in der Beispieldatenbank unter den Namen <b>frmAdressen_1 <\/b>und <b>sfmAdressen_1<\/b>).<\/p>\n<p>Zun&auml;chst legen Sie im Klassenmodul des Hauptformulars eine Variable an, die einen Verweis auf das im Unterformular angezeigte Formular aufnehmen soll. Dies geschieht mit dem Schl&uuml;sselwort <b>WithEvents<\/b>, dessen Bedeutung wir gleich kl&auml;ren. Bringen Sie die folgende Zeile im Modulkopf au&szlig;erhalb der Prozeduren unter, damit sie modulweit verf&uuml;gbar ist:<\/p>\n<pre>Dim WithEvents sfm As Form<\/pre>\n<p>Das <b>WithEvents<\/b>-Schl&uuml;sselwort sorgt daf&uuml;r, dass wir in dem Klassenmodul, in dem sich die damit versehene Objektvariable befindet, auf die Ereignisse des referenzierten Objekts zugreifen k&ouml;nnen. Dazu m&uuml;ssen wir zun&auml;chst einen Verweis auf das Unterformular in <b>sfm <\/b>speichern, was wir in der Ereignisprozedur der Ereigniseigenschaft <b>Beim Laden <\/b>des Formulars erledigen:<\/p>\n<pre>Private Sub Form_Load()\r\n    Set sfm = Me.sfmAdressen.Form\r\n    sfm.OnCurrent = &quot;[Event Procedure]&quot;\r\nEnd Sub<\/pre>\n<p>Gleichzeitig weisen wir dort der Eigenschaft <b>OnCurrent <\/b>der Formular-Objektvariablen den Wert <b>[Event Procedure] <\/b>zu. Dies weist Access darauf hin, dass es beim Ausl&ouml;sen des <b>Beim Anzeigen<\/b>-Ereignisses (<b>OnCurrent<\/b>) im aktuellen Klassenmodul nach einer entsprechenden Ereignisprozedur suchen und diese ausf&uuml;hren soll.<\/p>\n<p>Nun gibt es bisher noch keine solche Ereignisprozedur, was wir aber schnell &auml;ndern k&ouml;nnen. W&auml;hlen Sie im linken Kombinationsfeld des Code-Fensters den Eintrag <b>sfm <\/b>(der Name unserer mit <b>WithEvents <\/b>versehenen Objektvariablen) und im rechten den Eintrag <b>OnCurrent <\/b>(f&uuml;r das Ereignis <b>Beim Anzeigen<\/b>) aus, damit der VBA-Editor die ben&ouml;tigte Prozedur anlegt (s. Bild 5).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/UnterformularSteuern-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Anlegen einer Ereignisprozedur f&uuml;r eine mit dem WithEvents-Schl&uuml;sselwort versehene Objektvariable<\/span><\/b><\/p>\n<p>Diese Prozedur f&uuml;llen Sie wie folgt auf:<\/p>\n<pre>Private Sub sfm_Current()\r\n    Dim bolNewRecord As Boolean\r\n    bolNewRecord = sfm.NewRecord\r\n    Me!cmdNeu.Enabled = Not bolNewRecord\r\n    Me!cmdLoeschen.Enabled = Not bolNewRecord\r\nEnd Sub<\/pre>\n<p>Sie erkennen vermutlich bereits, dass es sich fast um die gleiche Prozedur handelt, die wir weiter oben f&uuml;r das Ereignis <b>Beim Anzeigen<\/b> des Unterformulars <b>sfmAdressen <\/b>angelegt haben. Es gibt nur kleine Unterschiede:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Die Eigenschaft <b>NewRecord <\/b>wird nun f&uuml;r das Unterformular ausgelesen und nicht mehr &uuml;ber das <b>Me<\/b>-Schl&uuml;sselwort des Unterformulars.<\/li>\n<li class=\"aufz-hlung\">Die beiden Schaltfl&auml;chen <b>cmdNeu <\/b>und <b>cmdLoeschen <\/b>wiederum k&ouml;nnen direkt &uuml;ber das <b>Me<\/b>-Schl&uuml;sselwort referenziert werden statt umst&auml;ndlich &uuml;ber <b>Parent<\/b>.<\/li>\n<\/ul>\n<p>Es gibt jedoch eine wichtige Voraussetzung f&uuml;r das Funktionieren dieser L&ouml;sung: Das ferngesteuerte Formular muss unbedingt ein Modul enthalten. Dies stellen Sie mit der Eigenschaft <b>Enth&auml;lt Modul <\/b>ein (s. Bild 6). Alternativ k&ouml;nnen Sie auch einfach eine Ereignisprozedur f&uuml;r das betroffene Formular anlegen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/UnterformularSteuern-web-images\/pic006.png\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Ein Formular, dessen Ereignisse Sie fernsteuern m&ouml;chten, muss ein Modul besitzen.<\/span><\/b><\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>In diesem Beitrag haben Sie erfahren, wie Sie ein Hauptformular mit Elementen zum Steuern von Aktionen im Unterformular ausstatten. Dabei gibt es verschiedene M&ouml;glichkeiten, wobei kompliziertere Varianten scheinbar die Wartbarkeit einer Anwendung deutlich erh&ouml;hen k&ouml;nnen.<\/p>\n<p>In weiteren Beitr&auml;gen stellen wir zus&auml;tzliche M&ouml;glichkeiten zur Steigerung der Usability von Formularen und Unterformularen vor. Im Beitrag <b>Daten in Detailformularen anzeigen und bearbeiten <\/b>(<b>www.access-im-unternehmen.de\/741<\/b>) zeigen wir beispielsweise, wie Sie das Anlegen und Bearbeiten von Daten aus dem Unterformular herausnehmen und stattdessen ein Detailformular verwenden. Gerade bei Unterformularen, die in der Datenblattansicht viele Datens&auml;tze anzeigen, ist dies eine gute Alternative zum st&auml;ndigen Hin- und Herscrollen bei der Dateneingabe und -bearbeitung.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>UnterformularSteuern.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{90C687B5-D3F8-44FA-AB63-59A129D312DB}\/aiu_739.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Unterformulare zeigen meist vom Hauptformular abh&auml;ngige Daten in der Datenblattansicht an &#8211; beispielsweise die Projekte eines Kunden oder die Artikel einer Kategorie. Manchmal dient das Hauptformular aber auch nur der Steuerung des Zugriffs auf die Daten im Unterformular und liefert etwa eine Einf&uuml;gen-, Detailansicht\/Bearbeiten- oder L&ouml;schen-Schaltfl&auml;che f&uuml;r die Bearbeitung der im Unterformular angezeigten Datens&auml;tze. In diesem Beitrag zeigen wir, wie Sie ein solches Formular anlegen und die Steuerelemente zum Steuern des Unterformulars ausstatten.<\/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":[662010,66052010,44000023],"tags":[],"class_list":["post-55000739","post","type-post","status-publish","format-standard","hentry","category-662010","category-66052010","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>Unterformulare: Daten anlegen und l&ouml;schen - 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\/Unterformulare_Daten_anlegen_und_loeschen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Unterformulare: Daten anlegen und l&ouml;schen\" \/>\n<meta property=\"og:description\" content=\"Unterformulare zeigen meist vom Hauptformular abh&auml;ngige Daten in der Datenblattansicht an - beispielsweise die Projekte eines Kunden oder die Artikel einer Kategorie. Manchmal dient das Hauptformular aber auch nur der Steuerung des Zugriffs auf die Daten im Unterformular und liefert etwa eine Einf&uuml;gen-, Detailansicht\/Bearbeiten- oder L&ouml;schen-Schaltfl&auml;che f&uuml;r die Bearbeitung der im Unterformular angezeigten Datens&auml;tze. In diesem Beitrag zeigen wir, wie Sie ein solches Formular anlegen und die Steuerelemente zum Steuern des Unterformulars ausstatten.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Unterformulare_Daten_anlegen_und_loeschen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:07:23+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/b62091c51f6b4963ab3dbf8d4da6a610\" \/>\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=\"13\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Unterformulare_Daten_anlegen_und_loeschen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Unterformulare_Daten_anlegen_und_loeschen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Unterformulare: Daten anlegen und l&ouml;schen\",\"datePublished\":\"2020-05-22T22:07:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Unterformulare_Daten_anlegen_und_loeschen\\\/\"},\"wordCount\":2374,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Unterformulare_Daten_anlegen_und_loeschen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/b62091c51f6b4963ab3dbf8d4da6a610\",\"articleSection\":[\"2010\",\"5\\\/2010\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Unterformulare_Daten_anlegen_und_loeschen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Unterformulare_Daten_anlegen_und_loeschen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Unterformulare_Daten_anlegen_und_loeschen\\\/\",\"name\":\"Unterformulare: Daten anlegen und l&ouml;schen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Unterformulare_Daten_anlegen_und_loeschen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Unterformulare_Daten_anlegen_und_loeschen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/b62091c51f6b4963ab3dbf8d4da6a610\",\"datePublished\":\"2020-05-22T22:07:23+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Unterformulare_Daten_anlegen_und_loeschen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Unterformulare_Daten_anlegen_und_loeschen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Unterformulare_Daten_anlegen_und_loeschen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/b62091c51f6b4963ab3dbf8d4da6a610\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/b62091c51f6b4963ab3dbf8d4da6a610\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Unterformulare_Daten_anlegen_und_loeschen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Unterformulare: Daten anlegen und l&ouml;schen\"}]},{\"@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":"Unterformulare: Daten anlegen und l&ouml;schen - 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\/Unterformulare_Daten_anlegen_und_loeschen\/","og_locale":"de_DE","og_type":"article","og_title":"Unterformulare: Daten anlegen und l&ouml;schen","og_description":"Unterformulare zeigen meist vom Hauptformular abh&auml;ngige Daten in der Datenblattansicht an - beispielsweise die Projekte eines Kunden oder die Artikel einer Kategorie. Manchmal dient das Hauptformular aber auch nur der Steuerung des Zugriffs auf die Daten im Unterformular und liefert etwa eine Einf&uuml;gen-, Detailansicht\/Bearbeiten- oder L&ouml;schen-Schaltfl&auml;che f&uuml;r die Bearbeitung der im Unterformular angezeigten Datens&auml;tze. In diesem Beitrag zeigen wir, wie Sie ein solches Formular anlegen und die Steuerelemente zum Steuern des Unterformulars ausstatten.","og_url":"https:\/\/access-im-unternehmen.de\/Unterformulare_Daten_anlegen_und_loeschen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:07:23+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/b62091c51f6b4963ab3dbf8d4da6a610","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"13\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Unterformulare_Daten_anlegen_und_loeschen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Unterformulare_Daten_anlegen_und_loeschen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Unterformulare: Daten anlegen und l&ouml;schen","datePublished":"2020-05-22T22:07:23+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Unterformulare_Daten_anlegen_und_loeschen\/"},"wordCount":2374,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Unterformulare_Daten_anlegen_und_loeschen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/b62091c51f6b4963ab3dbf8d4da6a610","articleSection":["2010","5\/2010","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Unterformulare_Daten_anlegen_und_loeschen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Unterformulare_Daten_anlegen_und_loeschen\/","url":"https:\/\/access-im-unternehmen.de\/Unterformulare_Daten_anlegen_und_loeschen\/","name":"Unterformulare: Daten anlegen und l&ouml;schen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Unterformulare_Daten_anlegen_und_loeschen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Unterformulare_Daten_anlegen_und_loeschen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/b62091c51f6b4963ab3dbf8d4da6a610","datePublished":"2020-05-22T22:07:23+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Unterformulare_Daten_anlegen_und_loeschen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Unterformulare_Daten_anlegen_und_loeschen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Unterformulare_Daten_anlegen_und_loeschen\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/b62091c51f6b4963ab3dbf8d4da6a610","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/b62091c51f6b4963ab3dbf8d4da6a610"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Unterformulare_Daten_anlegen_und_loeschen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Unterformulare: Daten anlegen und l&ouml;schen"}]},{"@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\/55000739","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=55000739"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000739\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000739"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000739"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000739"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}