{"id":55000742,"date":"2010-10-01T00:00:00","date_gmt":"2020-05-22T22:07:37","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=742"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Daten_in_Detailformularen_anzeigen_und_bearbeiten","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\/","title":{"rendered":"Daten in Detailformularen anzeigen und bearbeiten"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg01.met.vgwort.de\/na\/497c078b862b40138f6a250d8eded467\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Viele Anwendungen zeigen Daten in Haupt- und Unterformularen an, wobei das Unterformular Daten einfacher Tabellen enth&auml;lt (etwa Adressen) oder Haupt- und Unterformular verkn&uuml;pfte Daten darstellen (zum Beispiel Kunden und Projekte). Die Daten im Unterformular k&ouml;nnen dann zwar m&ouml;glicherweise direkt an Ort und Stelle bearbeitet werden, aber wenn das im Unterformular dargestellte Objekt viele Felder enth&auml;lt, sollten Sie daf&uuml;r ein spezielles Detailformular bereitstellen. Mit diesem kann der Benutzer dann neue Datens&auml;tze anlegen und bestehende bearbeiten. In diesem Beitrag erfahren Sie, wie Sie ein solches Detailformular aufbauen und es f&uuml;r die verschiedenen Bearbeitungsarten einsetzen.<\/b><\/p>\n<p>Das Zusammenspiel eines Formulars zur Anzeige der &Uuml;bersicht der Datens&auml;tze einer Tabelle und eines weiteren Formulars zum Anlegen eines neuen Datensatzes oder zum Bearbeiten des jeweils in der Liste ausgew&auml;hlten Datensatzes liefert eine Menge Herausforderungen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Wie &ouml;ffne ich das Detailformular<\/li>\n<li class=\"aufz-hlung\">Wie bringe ich es dazu, einen neuen Datensatz anzuzeigen<\/li>\n<li class=\"aufz-hlung\">Wie zeigt es gleich nach dem &Ouml;ffnen einen Datensatz an, der im aufrufenden Formular markiert ist<\/li>\n<li class=\"aufz-hlung\">Wie sorge ich daf&uuml;r, dass die Daten im aufrufenden Formular nach dem Schlie&szlig;en des Detailformulars aktualisiert werden<\/li>\n<li class=\"aufz-hlung\">Wie teile ich dem Detailformular den Wert des Fremdschl&uuml;sselfeldes mit, wenn ich einen neuen Datensatz anlegen m&ouml;chte, der mit dem aktuell im Hauptformular angezeigten Datensatz verkn&uuml;pft ist<\/li>\n<\/ul>\n<p>Diese und weitere Fragen beantwortet der vorliegende Beitrag.<\/p>\n<p><b>Beispiele dieses Beitrags<\/b><\/p>\n<p>In diesem Beitrag werden wir zwei verschiedene Beispiele betrachten: Im ersten zeigen Haupt- und Unterformular lediglich Adressdaten im Unterformular an, aber keine Daten im Hauptformular. Im zweiten Beispiel enth&auml;lt das Hauptformular ebenfalls Daten, die per 1:n-Beziehung mit denen im Unterformular verkn&uuml;pft sind. In diesem Fall kommt das gute, alte Beispiel der Projekte eines Kunden zum Einsatz: Das Hauptformular zeigt die Daten eines Kunden an, das Unterformular die der zu diesem Kunden geh&ouml;renden Projekte.<\/p>\n<p>Die grunds&auml;tzliche Technik ist bei beiden Varianten gleich, bei der Version mit 1:n-Beziehung und Daten im Hauptformular kommt noch eine Feinheit hinzu.<\/p>\n<p>Haupt- und Unterformular des ersten Beispiels hei&szlig;en <b>frmAdressenMitDetailformular <\/b>und <b>sfmAdressenMitDetailformular <\/b>und sehen wie in Bild 2 aus und bringt eine Kopfzeile im Kopfbereich sowie die Schaltfl&auml;chen <b>cmdOK <\/b>und <b>cmdAbbrechen <\/b>im Fu&szlig;bereich des Formulars unter.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/UnterformularDetailansicht-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: &Uuml;bersicht der Adressen, die per Detailformular neu angelegt und bearbeitet werden sollen<\/span><\/b><\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/UnterformularDetailansicht-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Formular zum Anlegen oder Bearbeiten einer Adresse<\/span><\/b><\/p>\n<p>Sp&auml;ter werden die Eigenschaften <b>Trennlinien<\/b>, <b>Datensatzmarkierer<\/b>, <b>Navigationsschaltfl&auml;chen <\/b>und <b>Bildlaufleisten <\/b>s&auml;mtlich auf den Wert <b>Nein <\/b>eingestellt, vorerst ben&ouml;tigen wir jedoch zumindest noch die Navigationsschaltfl&auml;chen, um Informationen &uuml;ber den beziehungsweise die aktuell angezeigten Datens&auml;tze zu erhalten.<\/p>\n<p>Das Bezeichnungsfeld im Formularkopf hei&szlig;t <b>lblTitel<\/b> und zeigt aktuell den Text <b>Adresse bearbeiten <\/b>an. Warum erh&auml;lt ein Bezeichnungsfeld einen richtigen Namen Normalerweise &auml;ndern wir diesen nie, weil wir kaum einmal per VBA auf Bezeichnungsfelder zugreifen. In diesem Fall soll das Bezeichnungsfeld jedoch je nach Art der Datenbearbeitung entweder den Titel <b>Neue Adresse <\/b>oder <b>Adresse bearbeiten <\/b>anzeigen.<\/p>\n<p><b>&Ouml;ffnen des Detailformulars zum Anlegen eines neuen Datensatzes<\/b><\/p>\n<p>Wenn Sie einen neuen Datensatz anlegen m&ouml;chten, klicken Sie im Formular <b>frmAdressenMitDetailformular <\/b>auf die Schaltfl&auml;che <b>cmdNeu <\/b>mit der Beschriftung <b>Neue Adresse<\/b>.<\/p>\n<p>Die Schaltfl&auml;che soll nun das Formular <b>frmAdresseDetail <\/b>aufrufen und einen leeren, neuen Datensatz anzeigen. Dazu statten wir die Prozedur <b>cmdNeu_Click<\/b>, die wir durch Ausw&auml;hlen des Wertes <b>[Ereignisprozedur] <\/b>f&uuml;r die Eigenschaft <b>Beim Klicken <\/b>und anschlie&szlig;endes Anklicken der Schaltfl&auml;che mit den drei Punkten erzeugen, wie folgt mit einer einzigen Anweisung aus:<\/p>\n<pre>Private Sub cmdNeu_Click()\r\n    DoCmd.OpenForm &quot;frmAdresseDetail&quot;,\r\n    WindowMode:=acDialog, DataMode:=acFormAdd\r\nEnd Sub<\/pre>\n<p>Normalerweise w&uuml;rde die Anweisung <b>DoCmd.OpenForm &quot;frmAdresseDetail&quot; <\/b>ausreichen, um das Formular zu &ouml;ffnen. In diesem Fall brauchen wir jedoch zwei weitere Parameter:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>WindowMode:=acDialog <\/b>legt fest, dass die Anweisung das Formular als modalen Dialog &ouml;ffnet. Das bedeutet, dass der aufrufende Code nicht weiterl&auml;uft, bevor das aufgerufene Formular geschlossen oder unsichtbar gemacht wird. Wir werden sp&auml;ter Code hinzuf&uuml;gen, der nach dem Schlie&szlig;en des Detailformulars die Adressenliste im aufrufenden Formular aktualisiert.<\/li>\n<li class=\"aufz-hlung\"><b>DataMode:=acFormAdd <\/b>sorgt daf&uuml;r, dass das Formular gleich nach dem &Ouml;ffnen einen neuen, leeren Datensatz anzeigt. Gleichzeitig wird ein Filter gesetzt, damit in der aktuellen Ansicht tats&auml;chlich nur ein neuer Datensatz angelegt und kein bestehender Datensatz bearbeitet werden kann.<\/li>\n<\/ul>\n<p>Bild 3 zeigt, wie dies aussieht. Der Datensatzmarkierer best&auml;tigt, dass das Formular neben dem neuen, leeren Datensatz keine weiteren Datens&auml;tze enth&auml;lt.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/UnterformularDetailansicht-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Anlegen eines neuen Datensatzes &uuml;ber das Detailformular frmAdresseDetail<\/span><\/b><\/p>\n<p>Sie k&ouml;nnen damit nun einen neuen Datensatz eingeben, aber was geschieht dann Wir m&uuml;ssen zun&auml;chst die beiden Schaltfl&auml;chen <b>cmdOK <\/b>und <b>cmdAbbrechen <\/b>mit Ereignisprozeduren ausstatten. Dies ist normalerweise sehr einfach. Die <b>OK<\/b>-Schaltfl&auml;che soll nur das Formular schlie&szlig;en, was die folgende Prozedur erledigt:<\/p>\n<pre>Private Sub cmdOK_Click()\r\n    DoCmd.Close acForm, Me.Name\r\nEnd Sub<\/pre>\n<p>Unter normalen Umst&auml;nden wird der neue Datensatz, sofern einer angelegt wurde, nun gespeichert und das Formular geschlossen.<\/p>\n<p>Die <b>Abbrechen<\/b>-Schaltfl&auml;che hingegen soll die &auml;nderungen verwerfen und das Formular daraufhin schlie&szlig;en. Das Verwerfen der &auml;nderungen erledigt die <b>Undo<\/b>-Methode des Formulars:<\/p>\n<pre>Private Sub cmdAbbrechen_Click()\r\n    Me.Undo\r\n    DoCmd.Close acForm, Me.Name\r\nEnd Sub<\/pre>\n<p>Dummerweise kann man &auml;nderungen nach dem erstmaligen Speichern des Datensatzes nicht mehr r&uuml;ckg&auml;ngig machen &#8211; mehr dazu erfahren Sie gleich.<\/p>\n<p><b>Beobachtungen im Detailformular<\/b><\/p>\n<p>Wenn Sie das Detailformular &uuml;ber die Schaltfl&auml;che <b>Neue Adresse <\/b>ge&ouml;ffnet haben, zeigt die Navigationsleiste <b>1 von 1 <\/b>an und die Schaltfl&auml;che zum Neuanlegen eines weiteren Datensatzes ist deaktiviert. Sofort nach dem Eingeben des ersten Zeichens in eines der Felder des Formulars &auml;ndert sich dies: Die Schaltfl&auml;che zum Anlegen eines neuen Datensatzes wird aktiviert. Sie k&ouml;nnen also nun einen neuen Datensatz anlegen, obwohl Sie den ersten noch gar nicht abgeschlossen haben.<\/p>\n<p>Man sollte meinen, dass man dies durch Einstellen der Eigenschaft <b>Anf&uuml;gen zulassen <\/b>des Formulars <b>frmAdresseDetail <\/b>auf den Wert <b>Nein <\/b>verhindern kann. Dies gelingt jedoch nur, wenn Sie das Formular ohne das Argument <b>DataMode <\/b>&ouml;ffnen oder durch einen Doppelklick auf seinen Namen im Datenbankfenster beziehungsweise im Navigationsbereich. <b>DataMode:=acFormAdd <\/b>stellt diese Eigenschaft automatisch auf <b>Ja <\/b>ein, was auch logisch ist.<\/p>\n<p>Wie aber k&ouml;nnen wir verhindern, dass der Benutzer mehr als einen Datensatz gleichzeitig eingibt, ohne das Formular erneut &ouml;ffnen zu m&uuml;ssen Wir nehmen ihm einfach die M&ouml;glichkeit, zu einem neuen Datensatz zu springen, indem wir die Navigationsleiste durch Einstellen der entsprechenden Eigenschaft auf den Wert <b>Nein <\/b>ausblenden.<\/p>\n<p>Nun kann der Benutzer aber immer noch durch wiederholtes Bet&auml;tigen der Tab- oder Eingabetaste durch die Steuerelemente navigieren. Wenn er sich auf dem letzten Steuerelement der Aktivierungsreihenfolge befindet und nochmals die Tab- oder Eingabetaste bet&auml;tigt, landet er ebenfalls in einem neuen Datensatz. Aber auch dies k&ouml;nnen Sie verhindern: Dazu stellen Sie einfach die Eigenschaft <b>Zyklus <\/b>des Formulars auf <b>Aktueller Datensatz <\/b>ein. Der Fokus landet dann zwar auch wieder beim ersten Steuerelement der Aktivierreihenfolge, jedoch ohne den Datensatz zu wechseln. Sie k&ouml;nnen dies am besten beobachten, wenn Sie die Navigationsschaltfl&auml;chen aktivieren und einmal alle Steuerelemente durchlaufen.<\/p>\n<p><b>Anzeige der richtigen &Uuml;berschrift<\/b><\/p>\n<p>Eine weitere Beobachtung ist, dass das Formular <b>frmAdresseDetail <\/b>nun nat&uuml;rlich den Text <b>Adresse bearbeiten <\/b>als Beschriftung des Bezeichnungsfeldes <b>lblTitle <\/b>anzeigt, obwohl Sie ja gerade einen neuen Datensatz anlegen. Wir m&uuml;ssen also herausfinden, ob die <b>DoCmd.OpenForm<\/b>-Methode den Wert <b>acFormAdd <\/b>oder <b>acFormEdit <\/b>f&uuml;r den Parameter <b>DataMode <\/b>verwendet hat.<\/p>\n<p>Es gibt sicher ein paar Workarounds, den direkten Weg liefert aber eine nicht dokumentierte und verborgene Eigenschaft namens <b>DefaultEditing<\/b>. Diese enth&auml;lt in direkter Abh&auml;ngigkeit vom Wert des Parameters <b>DataMode <\/b>einen der folgenden beiden Werte (es gibt noch weitere, die aber in diesem Zusammenhang irrelevant sind):<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>1<\/b>: Das Formular wurde mit <b>DataMode:=acFormAdd <\/b>ge&ouml;ffnet.<\/li>\n<li class=\"aufz-hlung\"><b>2<\/b>: Das Formular wurde mit <b>DataMode:=acFormEdit <\/b>ge&ouml;ffnet.<\/li>\n<\/ul>\n<p>Im Code k&ouml;nnen wir uns dies in einer Ereignisprozedur zunutze machen, die durch das Ereignis <b>Beim Laden <\/b>des Formulars ausgel&ouml;st wird. Diese wertet die Eigenschaft <b>DefaultEditing <\/b>aus und weist der <b>Caption<\/b>-Eigenschaft von <b>lblTitle <\/b>den entsprechenden Wert zu:<\/p>\n<pre>Private Sub Form_Load()\r\n    Select Case Me.DefaultEditing\r\n        Case 1\r\n            Me!lblTitel.Caption = &quot;Neue Adresse anlegen&quot;\r\n        Case 2\r\n            Me!lblTitel.Caption = &quot;Adresse bearbeiten&quot;\r\n    End Select\r\nEnd Sub<\/pre>\n<p><b>Gespeicherte &auml;nderungen abbrechen<\/b><\/p>\n<p>Schlie&szlig;lich f&auml;llt uns beim spielerischen Ausprobieren des Formulars noch auf, dass die <b>Abbrechen<\/b>-Schaltfl&auml;che sp&auml;testens dann keinen Sinn mehr macht, wenn der Benutzer einen neu angelegten Datensatz erstmalig gespeichert hat, was er normalerweise mit einem Klick auf den Datensatzmarkierer oder durch den Wechseln zu einem anderen Datensatz erledigen kann. Ersteres gelingt nicht, wenn wir den Datensatzmarkierer mit der entsprechenden Eigenschaft ausblenden, das Zweite unterbinden wir mit der <b>Zyklus<\/b>-Eigenschaft.<\/p>\n<p>Es bleibt allerdings noch die M&ouml;glichkeit, den Datensatz mit <b>Strg + S <\/b>zu speichern &#8211; da dies eine in vielen Anwendungen verbreitete Tastenkombination zum Speichern ist, werden manche Benutzer sie vielleicht automatisch hin und wieder einsetzen (der Autor spricht aus Erfahrung). Beim Speichern werden aber die beiden Ereignisse <b>Vor Aktualisierung <\/b>und <b>Nach Aktualisierung <\/b>ausgel&ouml;st. Hier k&ouml;nnten Sie schlicht daf&uuml;r sorgen, dass die <b>Abbrechen<\/b>-Schaltfl&auml;che deaktiviert wird:<\/p>\n<pre>Private Sub Form_AfterUpdate()\r\n    Me!cmdAbbrechen.Enabled = False\r\nEnd Sub<\/pre>\n<p>M&ouml;glicherweise wird der Benutzer nicht verstehen, warum die <b>Abbrechen<\/b>-Schaltfl&auml;che pl&ouml;tzlich inaktiv ist. Daher sollten Sie beim Ereignis <b>Vor Aktualisierung <\/b>eine entsprechende Meldung anzeigen (s. Bild 4):<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/UnterformularDetailansicht-web-images\/pic004.png\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Diese Meldung erscheint beim Versuch, einen Datensatz zu speichern.<\/span><\/b><\/p>\n<pre>Private Sub Form_BeforeUpdate(Cancel As Integer)\r\n    If MsgBox(&quot;&auml;nderungen k&ouml;nnen nach dem Speichern nicht mehr mit Abbrechen oder &quot; _\r\n              &amp; &quot;Escape verworfen werden. Fortsetzen&quot;, vbOKCancel + vbExclamation, _\r\n            &quot;Datensatz wird gespeichert&quot;) = vbCancel Then\r\n        Cancel = True\r\n    End If\r\nEnd Sub<\/pre>\n<p>Wenn der Benutzer nun die Tastenkombination <b>Strg + S <\/b>bet&auml;tigt, erscheint die Meldung. Beim Klicken auf <b>OK <\/b>wird der Datensatz gespeichert und in der Folge die <b>Abbrechen<\/b>-Schaltfl&auml;che des Formulars deaktiviert. Klickt der Benutzer auf die <b>Abbrechen<\/b>-Schaltfl&auml;che des Meldungsfensters, wird der Speichervorgang abgebrochen.<\/p>\n<p>Beim reinen Einsatz eines Formulars zum Anlegen neuer Datens&auml;tze w&auml;re es auch denkbar, dass man den Datensatz, wenn dieser bereits gespeichert wurde, beim Anklicken der <b>Abbrechen<\/b>-Schaltfl&auml;che einfach wieder l&ouml;scht. In diesem Falle brauchte man die <b>Abbrechen<\/b>-Schaltfl&auml;che nach dem vorzeitigen Speichern des neuen Datensatzes auch nicht zu deaktivieren, da sie ja die erwartete Aufgabe erf&uuml;llt. Die <b>Abbrechen<\/b>-Schaltfl&auml;che m&uuml;sste dann etwa folgende Prozedur ausf&uuml;hren (die Ereignisprozeduren f&uuml;r <b>Vor Aktualisierung <\/b>und <b>Nach Aktualisierung <\/b>m&uuml;ssten Sie dann verwerfen):<\/p>\n<pre>Private Sub cmdAbbrechen_Click()\r\n    Select Case Me.DefaultEditing\r\n        Case 1 ''Neuer Datensatz\r\n            If Me.Dirty Then\r\n                Me.Undo\r\n            Else\r\n                Me.Recordset.Delete\r\n            End If\r\n        Case 2 ''Datensatz bearbeiten\r\n            Me.Undo\r\n    End Select\r\n    DoCmd.Close acForm, Me.Name\r\nEnd Sub<\/pre>\n<p><!--30percent--><\/p>\n<p>Die Prozedur pr&uuml;ft zun&auml;chst den Datenmodus. Beim Anlegen eines neuen Datensatzes untersucht sie dann mit der <b>Dirty<\/b>-Eigenschaft, ob der Datensatz seit dem letzten Speichern ge&auml;ndert wurde. Wenn <b>Dirty <\/b>den Wert <b>True <\/b>aufweist, wurde der Datensatz offensichtlich noch nicht gespeichert und die &auml;nderungen k&ouml;nnen mit <b>Me.Undo <\/b>verworfen werden, bevor die Prozedur das Formular schlie&szlig;t. Hat <b>Me.Dirty <\/b>den Wert <b>False<\/b>, wurde der Datensatz gespeichert und muss gel&ouml;scht werden. Dies erledigt die <b>Delete<\/b>-Methode des <b>Recordset<\/b>-Objekts des Formulars.<\/p>\n<p>Eines haben wir jedoch &uuml;bersehen: Wenn man den Datensatz speichert und diesen danach erneut bearbeitet, ist er bereits in der Tabelle angelegt. Durch die erneute Bearbeitung ohne wiederholtes Speichern hat aber <b>Me.Dirty <\/b>den Wert <b>True<\/b>, was dazu f&uuml;hrt, dass die <b>Abbrechen<\/b>-Schaltfl&auml;che lediglich ein <b>Me.Undo <\/b>ausf&uuml;hrt und nicht den Datensatz l&ouml;scht. Wir m&uuml;ssten also eine Variable einsetzen, die beim ersten Speichern auf <b>True <\/b>gestellt wird und beim Ausf&uuml;hren der <b>Abbrechen<\/b>-Schaltfl&auml;che statt <b>Me.Dirty <\/b>abgefragt wird.<\/p>\n<p>Die Variable deklarieren Sie wie folgt im Kopf des Klassenmoduls des Formulars <b>frmAdresseDetail<\/b>:<\/p>\n<pre>Dim bolGespeichert As Boolean<\/pre>\n<p>Sie wird im Ereignis <b>Nach Aktualisierung<\/b>, das nach dem Speichern ausgel&ouml;st wird, gesetzt:<\/p>\n<pre>Private Sub Form_AfterUpdate()\r\n    bolGespeichert = True\r\nEnd Sub<\/pre>\n<p>Der entscheidende Teil der <b>Beim Klicken<\/b>-Ereignisprozedur der Schaltfl&auml;che <b>cmdAbbrechen <\/b>sieht dann so aus:<\/p>\n<pre>If Not bolGespeichert Then\r\n    Me.Undo\r\nElse\r\n    Me.Recordset.Delete\r\nEnd If<\/pre>\n<p>Alternativ k&ouml;nnen Sie nat&uuml;rlich auch die Tastenkombination <b>Strg + S <\/b>abfangen &#8211; aber auch dies ist nicht ganz trivial und soll an dieser Stelle nicht durchgespielt werden.<\/p>\n<p><b>Bestehende Datens&auml;tze bearbeiten<\/b><\/p>\n<p>Wenden wir uns lieber der Schaltfl&auml;che <b>Datensatz bearbeiten <\/b>des Formulars <b>frmAdressenMitDetailformular <\/b>zu. Diese soll ebenfalls das Formular <b>frmAdresseDetail <\/b>&ouml;ffnen &#8211; allerdings nicht zum Anlegen eines neuen, sondern zum Bearbeiten eines bestehenden Datensatzes. Hierzu verwenden wir ebenfalls die <b>DoCmd.OpenForm<\/b>-Methode, diesmal allerdings mit einem anderen Wert f&uuml;r den Parameter <b>DataMode<\/b> &#8211; n&auml;mlich <b>acFormEdit<\/b>. Das reicht allerdings noch nicht ganz: Wir m&uuml;ssen dem Detailformular n&auml;mlich auch noch mitteilen, welchen Datensatz es denn &uuml;berhaupt anzeigen soll. Dazu verwenden wir den Parameter <b>WhereCondition<\/b>: Er erwartet einen Ausdruck, der festlegt, welcher der Datens&auml;tze der Datenherkunft des zu &ouml;ffnenden Formulars angezeigt werden soll. Da die Tabelle <b>tblAdressen <\/b>das Feld <b>AdresseID <\/b>als Prim&auml;rschl&uuml;sselfeld verwendet, benutzen wir dieses logischerweise f&uuml;r die Angabe des Parameters. Das Formular <b>frmAdresseDetail <\/b>soll genau den Datensatz anzeigen, dessen Feld <b>AdresseID <\/b>den Wert des gleichen Feldes des aktuell im Unterformular <b>sfmAdressenMitDetailformular <\/b>markierten Datensatzes aufweist. Dies erreichen Sie mit dem Parameterwert <b>&quot;AdresseID = &quot; &amp; Me!sfmAdressen.Form!AdresseID<\/b>. Der letzte Teil wird beim Aufruf ausgewertet, sodass sich ein Ausdruck wie <b>AdresseID = 12 <\/b>ergibt. Insgesamt sieht die Prozedur, die durch einen Mausklick auf die Schaltfl&auml;che <b>Adresse bearbeiten <\/b>ausgel&ouml;st wird, so aus:<\/p>\n<pre>Private Sub cmdBearbeiten_Click()\r\n    DoCmd.OpenForm &quot;frmAdresseDetail&quot;, WindowMode:=acDialog, _\r\n        DataMode:=acFormEdit, WhereCondition:=&quot;AdresseID = &quot; &amp; Me!sfmAdressen.Form!AdresseID\r\nEnd Sub<\/pre>\n<p>Wenn Sie im Unterformular <b>sfmAdresseMitDetailformular <\/b>den zu bearbeitenden Datensatz markieren und dann auf <b>Adresse bearbeiten <\/b>klicken, &ouml;ffnet die Ereignisprozedur das Formular <b>frmAdresseDetail <\/b>wie in Bild 5.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/UnterformularDetailansicht-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Bearbeiten des aktuell ausgew&auml;hlten Datensatzes in der Detailansicht<\/span><\/b><\/p>\n<p><b>Kleinere Probleme<\/b><\/p>\n<p>Ohne weitere Nacharbeiten w&uuml;rde es hier und da haken. Wenn Sie zum Beispiel den Datensatzmarkierer im Unterformular auf den neuen Datensatz verschieben und dann auf die Schaltfl&auml;che <b>cmdBearbeiten <\/b>klicken, l&ouml;st Access einen Fehler aus (s. Bild 6). Das Problem ist, dass der hintere Teil des Ausdrucks f&uuml;r die <b>WhereCondition <\/b>(<b>Me!sfmAdressen.Form!AdresseID<\/b>) den Wert <b>Null <\/b>liefert, weil der markierte leere Datensatz nat&uuml;rlich noch keinen Wert im Feld <b>AdresseID <\/b>aufweist. Dies k&ouml;nnen Sie auf drei Arten umgehen:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/UnterformularDetailansicht-web-images\/pic006.png\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Dieser Fehler tritt auf, wenn beim Aufrufen des Detailformulars kein zu bearbeitender Datensatz markiert ist.<\/span><\/b><\/p>\n<ul>\n<li class=\"aufz-hlung\">Sie zeigen eine entsprechende Meldung an, wenn der Benutzer auf die Schaltfl&auml;che <b>cmdBearbeiten <\/b>klickt und kein Datensatz im Unterformular markiert ist.<\/li>\n<li class=\"aufz-hlung\">Sie deaktivieren die Schaltfl&auml;che <b>cmdBearbeiten<\/b>, wenn der Datensatzzeiger im Unterformular auf einem neuen, leeren Datensatz landet.<\/li>\n<li class=\"aufz-hlung\">Sie stellen das Unterformular so ein, dass es erst gar keinen neuen, leeren Datensatz anzeigt, den der Benutzer anklicken kann. Das macht Sinn, wenn Sie ohnehin ein Detailformular zum Bearbeiten der Daten anbieten.<\/li>\n<\/ul>\n<p>Die erste Variante fragt ab, ob das Unterformular gerade einen neuen, nicht gespeicherten Datensatz anzeigt. Falls ja, &ouml;ffnet die Prozedur nicht das Detailformular, sondern zeigt eine entsprechende Meldung an:<\/p>\n<pre>Private Sub cmdBearbeiten_Click()\r\n    If Not Me!sfmAdressen.Form.NewRecord Then\r\n        DoCmd.OpenForm &quot;frmAdresseDetail&quot;, ...\r\n    Else\r\n        MsgBox &quot;Bitte markieren Sie den anzuzeigenden Datensatz.&quot;, _\r\n            vbOKOnly + vbExclamation, &quot;Kein Datensatz ausgew&auml;hlt&quot;\r\n    End If\r\nEnd Sub<\/pre>\n<p>Bei der zweiten Variante soll die Schaltfl&auml;che <b>cmdBearbeiten <\/b>einfach deaktiviert werden, wenn das Unterformular einen neuen, leeren Datensatz anzeigt.<\/p>\n<p>Dazu m&uuml;ssen wir bei jedem Datensatzwechsel im Unterformular pr&uuml;fen, ob dieses gerade auf einem neuen Datensatz steht oder vielleicht sogar gar keinen Datensatz anzeigt (dies geschieht, wenn die Datenherkunft tats&auml;chlich keine Daten enth&auml;lt oder wenn diese durch Setzen eines entsprechenden Filters herausgefiltert wurden). Legen Sie daher f&uuml;r die Ereigniseigenschaft <b>Beim Anzeigen <\/b>des Unterformulars <b>sfmAdressenMitDetailformular <\/b>die folgende Ereignisprozedur an:<\/p>\n<pre>Private Sub Form_Current()\r\n    Dim bolNewRecord As Boolean\r\n    Dim bolNoRecord As Boolean\r\n    bolNewRecord = Me.NewRecord\r\n    bolNoRecord = Me.Recordset.EOF\r\n    Me.Parent!cmdBearbeiten.Enabled = Not bolNewRecord And Not bolNoRecord\r\n    Me.Parent!cmdLoeschen.Enabled = Not bolNewRecord And Not bolNoRecord\r\nEnd Sub<\/pre>\n<p>Diese Prozedur wird zumindest einmal beim &Ouml;ffnen des Formulars und anschlie&szlig;end bei jedem Datensatzwechsel ausgel&ouml;st. Sie pr&uuml;ft, ob das Formular gerade einen neuen Datensatz anzeigt oder ob das <b>Recordset<\/b>-Objekt des Formulars keine Datens&auml;tze enth&auml;lt, und aktiviert oder deaktiviert in Abh&auml;ngigkeit davon die beiden Schaltfl&auml;chen <b>cmdBearbeiten <\/b>und auch <b>cmdLoeschen<\/b>.<\/p>\n<p>Dies ist eine ergonomisch sehr runde L&ouml;sung, da sie dem Benutzer gleich durch Deaktivieren der entsprechenden Schaltfl&auml;chen zeigt, welche M&ouml;glichkeiten sich f&uuml;r die aktuelle Auswahl bieten.<\/p>\n<p>Die dritte M&ouml;glichkeit ist das Sperren des Formulars f&uuml;r das Neuanlegen von Datens&auml;tzen &#8211; dies kann ja bequem durch einen Klick auf die Schaltfl&auml;che <b>Neue Adresse <\/b>und anschlie&szlig;endes Eingeben des neuen Datensatzes im Formular <b>frmAdresseDetail <\/b>geschehen.<\/p>\n<p>Und auch das Bearbeiten bestehender Datens&auml;tze k&ouml;nnen wir eigentlich verhindern, denn auch dies kann der Benutzer im entsprechenden Formular viel komfortabler erledigen. Stellen Sie abh&auml;ngig von Ihren Anforderungen einfach eine oder mehrere der Eigenschaften <b>Anf&uuml;gen zulassen<\/b>, <b>L&ouml;schen zulassen <\/b>und <b>Bearbeiten zulassen <\/b>auf den Wert <b>Nein <\/b>ein. Wenn Sie generell keine Bearbeitung der enthaltenen Daten erlauben m&ouml;chten, k&ouml;nnen Sie auch einfach den Wert <b>Snapshot <\/b>f&uuml;r die Eigenschaft <b>Recordsettyp <\/b>ausw&auml;hlen.<\/p>\n<p>Leider werden die einzelnen Steuerelemente des Unterformulars auf diese Weise nicht gesperrt, sodass es immer noch m&ouml;glich ist, die Einf&uuml;gemarke beispielsweise in einem Textfeld zu platzieren &#8211; dies suggeriert dem Benutzer unn&ouml;tigerweise, dass die enthaltenen Daten noch ge&auml;ndert werden k&ouml;nnten. Beim Versuch, dies zu tun, ert&ouml;nt jedoch ein Warnton und die Statusleiste zeigt einen entsprechenden Hinweis an.<\/p>\n<p>Obwohl Sie den Datensatzmarkierer nun nicht mehr auf einen neuen Datensatz verschieben k&ouml;nnen, sollten Sie die oben beschriebene Technik zum Aktivieren und Deaktivieren der Schaltfl&auml;chen <b>cmdBearbeiten <\/b>und <b>cmdLoeschen <\/b>beibehalten &#8211; immerhin kann der Benutzer die Anzahl der angezeigten Datens&auml;tze immer noch durch das Setzen eines entsprechenden Filters auf <b>0 <\/b>herunterschrauben und dann sollen die Schaltfl&auml;chen zum Bearbeiten und L&ouml;schen eines Datensatzes nat&uuml;rlich gesperrt sein.<\/p>\n<p><b>Bearbeiten im Detailformular<\/b><\/p>\n<p>Damit gelangen wir zur eigentlichen Aufgabe: zum Bearbeiten des ausgew&auml;hlten Datensatzes im Detailformular. Da wir das gleiche Formular wie f&uuml;r das Anlegen eines neuen Adressdatensatzes verwenden wollen, findet der Benutzer auch die beiden Schaltfl&auml;chen <b>cmdOK <\/b>und <b>cmdAbbrechen <\/b>vor. Die Schaltfl&auml;che <b>cmdOK <\/b>soll das Formular einfach schlie&szlig;en, was den enthaltenen Datensatz immer automatisch speichert (zumindest fast immer &#8211; mehr dazu weiter unten). Die Schaltfl&auml;che <b>cmdAbbrechen <\/b>soll die seit dem &Ouml;ffnen vorgenommenen &auml;nderungen verwerfen, also das Formular ohne Speichern schlie&szlig;en. Dies ist, wie schon beim Anlegen eines Datensatzes angemerkt, nicht so einfach: Der Benutzer kann n&auml;mlich auch hier zwischenzeitlich die &auml;nderungen speichern, was die Funktion der <b>Abbrechen<\/b>-Schaltfl&auml;che eigentlich ad absurdum f&uuml;hrt.<\/p>\n<p>W&auml;hrend wir beim Anlegen eines Datensatzes aber ganz einfach die M&ouml;glichkeit haben, diesen Vorgang durch L&ouml;schen des Datensatzes wieder r&uuml;ckg&auml;ngig zu machen, ist dies beim &auml;ndern des Datensatzes nicht so leicht: Wir m&uuml;ssten dazu n&auml;mlich irgendwo die vor der &auml;nderung g&uuml;ltigen Werte der einzelnen Felder speichern. Jedes Feld besitzt zwar eine Eigenschaft namens <b>OldValue<\/b>, welche die beim Anzeigen des Datensatzes g&uuml;ltigen Werte enth&auml;lt, aber diese werden beim Speichern des Datensatzes mit den aktuellen Werten &uuml;berschrieben. <b>OldValue <\/b>kann nur dann die alten Werte liefern, solange der Datensatz nicht gespeichert wurde &#8211; also beispielsweise dann, wenn Sie den Datensatz zwar ge&auml;ndert, diese &auml;nderungen aber mit der <b>Undo<\/b>-Methode eines einzelnen Feldes oder des kompletten Formulars wieder r&uuml;ckg&auml;ngig gemacht haben. In diesem Fall schreibt Access f&uuml;r alle Felder die Werte von <b>OldValue <\/b>in die Eigenschaft <b>Value <\/b>zur&uuml;ck.<\/p>\n<p>Was also k&ouml;nnen wir tun, wenn wir den vorherigen Zustand wiederherstellen wollen, obwohl der Datensatz bereits gespeichert ist und somit die alten Feldwerte verworfen wurden Wir m&uuml;ssen diese einfach irgendwo zwischenspeichern und beim Anklicken der <b>Abbrechen<\/b>-Schaltfl&auml;che wiederherstellen.<\/p>\n<p>Unter Access besitzt fast jedes Objekt eine Eigenschaft namens <b>Tag<\/b>, die &uuml;blicherweise nicht genutzt wird &#8211; es sei denn f&uuml;r Spezialf&auml;lle wie diesen hier. Wir m&uuml;ssen also beim Anzeigen des Datensatzes die Werte aller gebundenen Steuerelemente in die <b>Tag<\/b>-Eigenschaft des jeweiligen Steuerelements schreiben und diese von dort beim Klick auf die <b>Abbrechen<\/b>-Schaltfl&auml;che wieder in die <b>Value<\/b>-Eigenschaft der betroffenen Steuerelemente zur&uuml;ckschreiben.<\/p>\n<p>Das &Uuml;bertragen in die <b>Tag<\/b>-Eigenschaft &uuml;bernimmt eine Prozedur, die durch das Ereignis <b>Beim Anzeigen <\/b>des Formulars <b>frmAdresseDetail <\/b>ausgel&ouml;st wird. Diese durchl&auml;uft alle Steuerelemente des Formulars und l&auml;sst diejenigen aus, deren Eigenschaft <b>ControlType <\/b>den Wert <b>100 <\/b>(Bezeichnungsfeld) oder <b>104 <\/b>(Schaltfl&auml;che) besitzt (wir k&ouml;nnten noch weitere Steuerelementtypen ausschlie&szlig;en, aber in diesem Beispiel ist dies nicht n&ouml;tig). F&uuml;r die &uuml;brigen pr&uuml;ft die Prozedur, ob deren Eigenschaft <b>ControlSource <\/b>(<b>Steuerelementinhalt<\/b>) einen Wert enth&auml;lt, was auf ein gebundenes Steuerelement hinweist. Ist dies der Fall, schreibt die Prozedur den aktuellen Wert des Steuerelements in seine <b>Tag<\/b>-Eigenschaft:<\/p>\n<pre>Private Sub Form_Current()\r\n    Dim ctl As Control\r\n    For Each ctl In Me.Controls\r\n        Select Case ctl.ControlType\r\n            Case 100, 104\r\n            Case Else\r\n                If Len(ctl.ControlSource) &gt; 0 Then\r\n                    ctl.Tag = IsNull(ctl.Value)\r\n                End If\r\n        End Select\r\n    Next ctl\r\nEnd Sub<\/pre>\n<p>Passend dazu m&uuml;ssen Sie nat&uuml;rlich auch noch die Prozedur erweitern, die beim Anklicken der <b>Abbrechen<\/b>-Schaltfl&auml;che aufgerufen wird:<\/p>\n<pre>Private Sub cmdAbbrechen_Click()\r\n    Dim ctl As Control\r\n    Select Case Me.DefaultEditing\r\n        Case 1 ''Neuer Datensatz\r\n            If Not bolGespeichert Then\r\n                Me.Undo\r\n            Else\r\n                Me.Recordset.Delete\r\n            End If\r\n        Case 2 ''Datensatz bearbeiten\r\n            For Each ctl In Me.Controls\r\n                Select Case ctl.ControlType\r\n                    Case 104, 100\r\n                    Case Else\r\n                        If Len(ctl.ControlSource) &gt; 0 Then\r\n                            ctl.Value = ctl.Tag\r\n                        End If\r\n                End Select\r\n            Next ctl\r\n    End Select\r\n    DoCmd.Close acForm, Me.Name\r\nEnd Sub<\/pre>\n<p>Die Prozedur pr&uuml;ft, wie bereits weiter oben erw&auml;hnt, anhand der Eigenschaft <b>DefaultEditing<\/b>, ob das Formular zum Anlegen eines neuen oder zum Bearbeiten eines bestehenden Datensatzes ge&ouml;ffnet wurde. In unserem Fall enth&auml;lt diese den Wert <b>2<\/b>.<\/p>\n<p>Der betreffende Zweig der <b>Select Case<\/b>-Bedingung durchl&auml;uft wieder alle Steuerelemente au&szlig;er den Bezeichnungsfeldern und Schaltfl&auml;chen und weist ihrer Eigenschaft <b>Value <\/b>den in der Eigenschaft <b>Tag <\/b>gespeicherten alten Wert zu &#8211; dies aber auch nur f&uuml;r gebundene Steuerelemente.<\/p>\n<p>Diese Methode ist gut einsetzbar, wenn es sich um Daten aus einer einfachen Tabelle handelt. Sobald das Detailformular jedoch Daten aus verkn&uuml;pften Tabellen anzeigt und dabei einen Teil der Daten in einem Unterformular darstellt, wird es kompliziert &#8211; immerhin kann das Unterformular selbst mehrere mit dem Datensatz des Hauptformulars verkn&uuml;pfte Datens&auml;tze enthalten, und Sie m&uuml;ssten f&uuml;r all diese Datens&auml;tze die alten Werte vorhalten, um diese gegebenenfalls sp&auml;ter wiederherzustellen.<\/p>\n<p><b>Aktualisieren der Adressenliste nach Anf&uuml;gen oder Bearbeiten<\/b><\/p>\n<p>Nach dem Anf&uuml;gen eines neuen Datensatzes oder dem Bearbeiten eines bestehenden Datensatzes wird das Detailformular mit der <b>DoCmd.Close<\/b>-Methode geschlossen.<\/p>\n<p>Das bedeutet jedoch nicht, dass die Daten im Unterformular des aufrufenden Formulars automatisch aktualisiert werden: Weder erscheinen neu angelegte Datens&auml;tze umgehend, noch werden ge&auml;nderte Datens&auml;tze sofort aktualisiert.<\/p>\n<p>Und hier kommt der Parameter <b>WindowMode:=acDialog <\/b>ins Spiel, den Sie beim Aufrufen des Detailformulars angegeben haben. Dieser sorgt n&auml;mlich daf&uuml;r, dass die aufrufende Prozedur nach dem Ausf&uuml;hren von <b>DoCmd.OpenForm <\/b>angehalten wird und erst weiterl&auml;uft, wenn das ge&ouml;ffnete Formular wieder geschlossen wurde.<\/p>\n<p>Nat&uuml;rlich sorgt dieser Parameter erstmal daf&uuml;r, dass der Benutzer keine Daten in anderen Formularen bearbeiten kann, solange <b>frmAdresseDetail <\/b>ge&ouml;ffnet ist, aber es ist ebenso wichtig, dass wir unmittelbar auf das Schlie&szlig;en dieses Formulars reagieren k&ouml;nnen.<\/p>\n<p>Sie haben dann n&auml;mlich Gelegenheit, die Aktualisierung des Unterformulars <b>sfmAdressenMitDetailformular <\/b>gleich nach dem Schlie&szlig;en des Detailformulars per Code anzusto&szlig;en. Dies sieht dann zum Beispiel beim Anlegen eines neuen Datensatzes so aus:<\/p>\n<pre>Private Sub cmdNeu_Click()\r\n    DoCmd.OpenForm &quot;frmAdresseDetail&quot;, _\r\n        WindowMode:=acDialog, DataMode:=acFormAdd\r\n    Me!sfmAdressen.Form.Requery\r\nEnd Sub<\/pre>\n<p>Die <b>Requery<\/b>-Methode des im Unterformular befindlichen Formulars sorgt hier gleich nach dem Schlie&szlig;en des aufgerufenen Formulars f&uuml;r seine Aktualisierung.<\/p>\n<p><b>Schlie&szlig;en speichert Datensatz &#8211; oder doch nicht<\/b><\/p>\n<p>Gelegentlich kommt es beim Einsatz von Detailformularen zu dem Problem, dass ein frisch angelegter Datensatz nach dem Schlie&szlig;en des Detailformulars einfach nicht unter den gespeicherten Datens&auml;tzen auftaucht. Sie k&ouml;nnen dies ganz leicht nachvollziehen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Sie brauchen eine Tabelle, die ein Feld mit einer Restriktion besitzt &#8211; zum Beispiel die Tabelle <b>tblBeispiel <\/b>aus der Beispieldatenbank mit dem Textfeld <b>Beispieltext<\/b>, das einen eindeutigen Index besitzt (s. Bild 7).<\/li>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/UnterformularDetailansicht-web-images\/pic007.png\" alt=\"pic007.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Tabelle mit einem Feld, das keine Duplikate zul&auml;sst<\/span><\/b><\/p>\n<li class=\"aufz-hlung\">Erstellen Sie ein Formular namens <b>frmBeispiel<\/b>, das diese Tabelle als Datenherkunft verwendet und alle Felder der Tabelle anzeigt. Au&szlig;erdem soll es eine Schaltfl&auml;che enthalten, welche das Formular mit <b>DoCmd.Close acForm, Me.Name <\/b>schlie&szlig;t.<\/li>\n<li class=\"aufz-hlung\">Geben Sie einen ersten Datensatz ein, der im Feld <b>Beispieltext <\/b>den Wert <b>Beispieltext <\/b>enth&auml;lt. Schlie&szlig;en Sie dann das Formular.<\/li>\n<li class=\"aufz-hlung\">&Ouml;ffnen Sie das Formular mit <b>DoCmd.OpenForm &quot;frmBeispiel&quot;, DataMode:=acFormAdd<\/b>.<\/li>\n<li class=\"aufz-hlung\">Geben Sie erneut den Wert <b>Beispieltext <\/b>in das Feld <b>Beispiel <\/b>ein und schlie&szlig;en Sie das Formular mit der <b>OK<\/b>-Schaltfl&auml;che.<\/li>\n<\/ul>\n<p>Das Formular wird anstandslos geschlossen, obwohl Sie einen doppelten Wert in das Feld <b>Beispieltext <\/b>eingegeben haben. Normalerweise sollte eine Meldung erscheinen, die Sie auf die Eingabe eines doppelten Wertes hinweist. Dies geschieht aber nur, wenn Sie den Datensatz speichern, bevor Sie das Formular mit der <b>OK<\/b>-Schaltfl&auml;che schlie&szlig;en, oder wenn Sie das Formular auf einem anderen Wege, beispielsweise &uuml;ber die <b>Schlie&szlig;en<\/b>-Schaltfl&auml;che oben rechts, schlie&szlig;en. Dieses Problem besteht auch, wenn Sie Felder definieren, die keinen Nullwert enthalten d&uuml;rfen et cetera.<\/p>\n<p>Sie sollten daher in solchen F&auml;llen vor dem Schlie&szlig;en per <b>DoCmd.Close <\/b>eine Anweisung zum Speichern des aktuellen Datensatzes vorschalten. Wenn es Probleme mit dem Speichern des Datensatzes gibt, l&ouml;st dies einen Fehler aus &#8211; im Beispiel des eindeutigen Indexes beispielsweise den Fehler <b>3022<\/b>. Diesen fangen Sie entsprechend ab:<\/p>\n<pre>Private Sub cmdOK_Click()\r\n    On Error Resume Next\r\n    Application.RunCommand acCmdSaveRecord\r\n    If Err.Number = 3022 Then\r\n        MsgBox &quot;Das Formular enth&auml;lt fehlerhafte Daten.&quot;\r\n        Exit Sub\r\n    End If\r\n    On Error GoTo 0\r\n    DoCmd.Close acForm, Me.Name\r\nEnd Sub<\/pre>\n<p>Die Anweisung <b>Application.RunCommand <\/b>mit dem Parameter <b>acCmdSaveRecord <\/b>versucht, den Datensatz zu speichern. Wenn dies misslingt, f&auml;ngt die Prozedur den in unserem Beispiel auftretenden Fehler <b>3022 <\/b>ab und gibt eine entsprechende Meldung aus. Das Formular wird in diesem Fall nicht geschlossen.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Detailformular bei Daten aus 1:n-Beziehungen<\/p>\n<p>Etwas komplizierter wird es noch, wenn das Haupt- und das Unterformular Daten anzeigen, deren Herkunftstabellen in einer 1:n-Beziehung stehen.<\/p>\n<p>Dies ist beispielsweise bei den Formularen <b>frmKundenProjekte <\/b>und <b>sfmKundenProjekte <\/b>der Fall, wo das Hauptformular die Daten der Tabelle <b>tblKunden <\/b>anzeigt und das Unterformular die Datens&auml;tze der Tabelle <b>tblProjekte<\/b>, die mit den Kunden im Hauptformular verkn&uuml;pft sind. Bild 8 zeigt das Datenmodell dieser Beziehung.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/UnterformularDetailansicht-web-images\/pic008.png\" alt=\"pic008.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 9: Aufruf des Detailformulars f&uuml;r Daten in einer 1:n-Beziehung<\/span><\/b><\/p>\n<p>Das Detailformular, das wie in Bild 9 aufgerufen wird, bietet dabei &uuml;blicherweise die M&ouml;glichkeit, den betreffenden Kunden auszuw&auml;hlen. Da das Detailformular jedoch vom Formular <b>frmKundenProjekte<\/b> stets im Kontext eines bestimmten Kunden aufgerufen wird, k&ouml;nnen wir zwei Anforderungen festhalten:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/UnterformularDetailansicht-web-images\/pic009.png\" alt=\"pic009.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 8: Verkn&uuml;pfte Tabellen des zweiten Beispiels<\/span><\/b><\/p>\n<ul>\n<li class=\"aufz-hlung\">Das Feld <b>KundeID <\/b>soll gleich beim &Ouml;ffnen mit der ID des aktuell im aufrufenden Formular angezeigten Kunden gef&uuml;llt werden.<\/li>\n<li class=\"aufz-hlung\">Dieses Feld braucht eigentlich gar nicht angezeigt zu werden, da der Benutzer ja im aufrufenden Formular sieht, f&uuml;r welchen Kunden das neue Projekt angelegt wird. Au&szlig;erdem verhindern Sie so, dass der Benutzer dort einen anderen Kunden ausw&auml;hlt.<\/li>\n<\/ul>\n<p>Wie aber erf&auml;hrt das Detailformular, f&uuml;r welchen Kunden es das neue Projekt anlegen soll Hierzu verwenden wir einen weiteren Parameter der <b>DoCmd.OpenForm<\/b>-Methode. Der Aufruf, der durch das Ereignis <b>Beim Klicken <\/b>der Schaltfl&auml;che <b>cmdNeu <\/b>des Hauptformulars ausgel&ouml;st wird, sieht so aus:<\/p>\n<pre>Private Sub cmdNeu_Click()\r\n    DoCmd.OpenForm &quot;frmProjektDetail&quot;, WindowMode:=acDialog, _\r\n        DataMode:=acFormAdd, OpenArgs:=Me!KundeID\r\nEnd Sub<\/pre>\n<p>Der neue Parameter hei&szlig;t <b>OpenArgs <\/b>und soll den Wert des Feldes <b>KundeID <\/b>im Hauptformular enthalten. Im Detailformular k&ouml;nnen wir den &uuml;bergebenen Wert &uuml;ber die Eigenschaft <b>OpenArgs <\/b>des Formulars auslesen und dazu verwenden, den Wert des Kombinationsfeldes zur Auswahl auf diesen Kunden voreinzustellen.<\/p>\n<p>Die Betonung liegt hierbei auf &#8222;vor&quot;, denn wir d&uuml;rfen lediglich den Standardwert f&uuml;r dieses Feld auf den &uuml;bergebenen Wert einstellen und nicht den Wert selbst. Dies w&uuml;rde n&auml;mlich dazu f&uuml;hren, dass der Datensatz gleich als <b>Dirty <\/b>gekennzeichnet w&uuml;rde &#8211; und dies soll doch erst geschehen, wenn der Benutzer sich tats&auml;chlich an diesem zu schaffen gemacht hat.<\/p>\n<p>Wir bringen also im Klassenmodul des Detailformulars <b>frmProjektDetail <\/b>eine Ereignisprozedur unter, die durch das Ereignis <b>Beim Laden <\/b>ausgel&ouml;st wird:<\/p>\n<pre>Private Sub Form_Load()\r\n    If Not IsNull(Me.OpenArgs) Then\r\n        Me!KundeID.DefaultValue = Me.OpenArgs\r\n    End If\r\nEnd Sub<\/pre>\n<p>Die Prozedur pr&uuml;ft zun&auml;chst, ob <b>Me.OpenArgs <\/b>&uuml;berhaupt einen Wert enth&auml;lt. Falls ja, f&uuml;llt sie die Eigenschaft <b>DefaultValue <\/b>des Steuerelements <b>KundeID<\/b> mit dem dort enthaltenen Wert. Im ge&ouml;ffneten Formular wirkt sich dies wie in Bild 9 aus: Das Feld <b>KundeID <\/b>wird mit dem richtigen Eintrag vorbelegt.<\/p>\n<p>Wir k&ouml;nnen das Feld <b>KundeID <\/b>also entweder ausblenden oder zumindest deaktivieren, damit der Benutzer keinen anderen Kunden ausw&auml;hlen kann. Dies w&uuml;rde m&ouml;glicherweise zu Irritationen f&uuml;hren, wenn der Benutzer die Eingabe abschlie&szlig;t und dann im aufrufenden Formular <b>frmKundenProjekte <\/b>nicht gleich das neue Projekt sieht &#8211; dieses wurde schlie&szlig;lich einem anderen als dem voreingestellten Kunden zugewiesen.<\/p>\n<p><b>Bearbeiten von Daten aus 1:n-Beziehungen<\/b><\/p>\n<p>Das Bearbeiten eines vorhandenen Datensatzes verl&auml;uft wiederum genau wie beim Bearbeiten eines Datensatzes aus einer einfachen Tabelle. Es ist nicht n&ouml;tig, den Inhalt des Feldes <b>KundeID <\/b>des Kunden eigens per &Ouml;ffnungsargument an das Detailformular zu &uuml;bergeben, da diese ja bereits in dem zu bearbeitenden Datensatz gespeichert ist. Sie sollten das entsprechende Steuerelement jedoch im Formular <b>frmProjektDetail <\/b>ausblenden, damit der Benutzer die Zuordnung nicht &auml;ndern kann &#8211; auch dies w&uuml;rde nach dem Schlie&szlig;en des Formulars wiederum zu Fragen f&uuml;hren.<\/p>\n<p>Der Aufruf geschieht also in einer Ereignisprozedur wie dieser:<\/p>\n<pre>Private Sub cmdBearbeiten_Click()\r\n    DoCmd.OpenForm &quot;frmProjektDetail&quot;, WindowMode:=acDialog, _\r\n        DataMode:=acFormEdit, WhereCondition:=&quot;ProjektID = &quot; _\r\n        &amp; Me!sfmKundenProjekte.Form!ProjektID\r\n    Me!sfmKundenProjekte.Form.Requery\r\nEnd Sub<\/pre>\n<p>Die &uuml;brigen Techniken stimmen mit denen des ersten Beispiels zur Eingabe der Adressen &uuml;berein. <\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Die Eingabe von Daten mithilfe von Detailformularen ist grunds&auml;tzlich einfach zu bewerkstelligen, aber manchmal steckt der Teufel halt im Detail. Dieser Beitrag erl&auml;utert die grundlegenden Techniken, um Detailformulare f&uuml;r neue und zu bearbeitende Datens&auml;tze zu &ouml;ffnen und das aufrufende Formular nach dem Bearbeiten zu aktualisieren.<\/p>\n<p>Es bleiben jedoch noch eine Reihe Themen offen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Wie sperrt man das Unterformular zur Auswahl des zu bearbeitenden Datensatzes so, dass der Benutzer beim Anklicken eines Datensatzes nicht mehr den Eindruck erh&auml;lt, er k&ouml;nne den Datensatz gleich an Ort und Stelle bearbeiten<\/li>\n<li class=\"aufz-hlung\">Wie kann ich das Detailformular zu einem Datensatz gleich per Doppelklick auf den entsprechenden Eintrag im Unterformular &ouml;ffnen<\/li>\n<li class=\"aufz-hlung\">Wie bringe ich die hier vorgestellten Techniken mit einer Validierung im Detailformular zur Dateneingabe zusammen<\/li>\n<\/ul>\n<p>Mit diesen und weiteren Themen besch&auml;ftigen sich zuk&uuml;nftige Beitr&auml;ge in <b>Access im Unternehmen<\/b>.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>UnterformularDetailansicht.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{4F9D8ADF-44AA-4E1A-912E-57654FC9D8EE}\/aiu_742.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Viele Anwendungen zeigen Daten in Haupt- und Unterformularen an, wobei das Unterformular Daten einfacher Tabellen enth&auml;lt (etwa Adressen) oder Haupt- und Unterformular verkn&uuml;pfte Daten darstellen (zum Beispiel Kunden und Projekte). Die Daten im Unterformular k&ouml;nnen dann zwar m&ouml;glicherweise direkt an Ort und Stelle bearbeitet werden, aber wenn das im Unterformular dargestellte Objekt viele Felder enth&auml;lt, sollten Sie daf&uuml;r ein spezielles Detailformular bereitstellen. Mit diesem kann der Benutzer dann neue Datens&auml;tze anlegen und bestehende bearbeiten. In diesem Beitrag erfahren Sie, wie Sie ein solches Detailformular aufbauen und es f&uuml;r die verschiedenen Bearbeitungsarten einsetzen.<\/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-55000742","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>Daten in Detailformularen anzeigen und bearbeiten - 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\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Daten in Detailformularen anzeigen und bearbeiten\" \/>\n<meta property=\"og:description\" content=\"Viele Anwendungen zeigen Daten in Haupt- und Unterformularen an, wobei das Unterformular Daten einfacher Tabellen enth&auml;lt (etwa Adressen) oder Haupt- und Unterformular verkn&uuml;pfte Daten darstellen (zum Beispiel Kunden und Projekte). Die Daten im Unterformular k&ouml;nnen dann zwar m&ouml;glicherweise direkt an Ort und Stelle bearbeitet werden, aber wenn das im Unterformular dargestellte Objekt viele Felder enth&auml;lt, sollten Sie daf&uuml;r ein spezielles Detailformular bereitstellen. Mit diesem kann der Benutzer dann neue Datens&auml;tze anlegen und bestehende bearbeiten. In diesem Beitrag erfahren Sie, wie Sie ein solches Detailformular aufbauen und es f&uuml;r die verschiedenen Bearbeitungsarten einsetzen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:07:37+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg01.met.vgwort.de\/na\/497c078b862b40138f6a250d8eded467\" \/>\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=\"28\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Daten in Detailformularen anzeigen und bearbeiten\",\"datePublished\":\"2020-05-22T22:07:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\\\/\"},\"wordCount\":5002,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/497c078b862b40138f6a250d8eded467\",\"articleSection\":[\"2010\",\"5\\\/2010\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\\\/\",\"name\":\"Daten in Detailformularen anzeigen und bearbeiten - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/497c078b862b40138f6a250d8eded467\",\"datePublished\":\"2020-05-22T22:07:37+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/497c078b862b40138f6a250d8eded467\",\"contentUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/497c078b862b40138f6a250d8eded467\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Daten in Detailformularen anzeigen und bearbeiten\"}]},{\"@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":"Daten in Detailformularen anzeigen und bearbeiten - 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\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\/","og_locale":"de_DE","og_type":"article","og_title":"Daten in Detailformularen anzeigen und bearbeiten","og_description":"Viele Anwendungen zeigen Daten in Haupt- und Unterformularen an, wobei das Unterformular Daten einfacher Tabellen enth&auml;lt (etwa Adressen) oder Haupt- und Unterformular verkn&uuml;pfte Daten darstellen (zum Beispiel Kunden und Projekte). Die Daten im Unterformular k&ouml;nnen dann zwar m&ouml;glicherweise direkt an Ort und Stelle bearbeitet werden, aber wenn das im Unterformular dargestellte Objekt viele Felder enth&auml;lt, sollten Sie daf&uuml;r ein spezielles Detailformular bereitstellen. Mit diesem kann der Benutzer dann neue Datens&auml;tze anlegen und bestehende bearbeiten. In diesem Beitrag erfahren Sie, wie Sie ein solches Detailformular aufbauen und es f&uuml;r die verschiedenen Bearbeitungsarten einsetzen.","og_url":"https:\/\/access-im-unternehmen.de\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:07:37+00:00","og_image":[{"url":"http:\/\/vg01.met.vgwort.de\/na\/497c078b862b40138f6a250d8eded467","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"28\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Daten in Detailformularen anzeigen und bearbeiten","datePublished":"2020-05-22T22:07:37+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\/"},"wordCount":5002,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/497c078b862b40138f6a250d8eded467","articleSection":["2010","5\/2010","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\/","url":"https:\/\/access-im-unternehmen.de\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\/","name":"Daten in Detailformularen anzeigen und bearbeiten - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/497c078b862b40138f6a250d8eded467","datePublished":"2020-05-22T22:07:37+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\/#primaryimage","url":"http:\/\/vg01.met.vgwort.de\/na\/497c078b862b40138f6a250d8eded467","contentUrl":"http:\/\/vg01.met.vgwort.de\/na\/497c078b862b40138f6a250d8eded467"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Daten_in_Detailformularen_anzeigen_und_bearbeiten\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Daten in Detailformularen anzeigen und bearbeiten"}]},{"@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\/55000742","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=55000742"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000742\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000742"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000742"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000742"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}