{"id":55001397,"date":"2022-12-01T00:00:00","date_gmt":"2022-12-01T11:16:01","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1397"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Rechnungsverwaltung_Kundenuebersicht_mit_Suche","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenuebersicht_mit_Suche\/","title":{"rendered":"Rechnungsverwaltung: Kunden&uuml;bersicht mit Suche"},"content":{"rendered":"<p><b>Wenn der Kunde anruft, m&ouml;chten Sie schnell den entsprechenden Kundendatensatz auf dem Bildschirm haben. Dazu stellen wir im vorliegenden Beitrag ein Formular samt Unterformular zusammen, mit denen die gew&uuml;nschten Daten schnell ermittelt werden k&ouml;nnen. Im Hauptformular bieten wir einige Suchfunktionen an, im Unterformular liefern wir die den Suchkriterien entsprechenden Daten in der Datenblattansicht. Au&szlig;erdem soll das Formular die M&ouml;glichkeit bieten, den gefundenen Kundendatensatz im Detailformular zu &ouml;ffnen, damit wir auch noch die Bestellungen des Kunden einsehen k&ouml;nnen.<\/b><\/p>\n<h2>Unterformular f&uuml;r die Kundenliste<\/h2>\n<p>Bevor wir beginnen, das Hauptformular zu programmieren, legen wir zun&auml;chst das Unterformular an. Dann k&ouml;nnen wir dieses gleich im Anschluss direkt zum Hauptformular hinzuf&uuml;gen.<\/p>\n<p>Das neue Unterformular soll <b>sfmKundenuebersicht <\/b>hei&szlig;en und standardm&auml;&szlig;ig die Daten der Tabelle <b>tblKunden <\/b>anzeigen. Deshalb stellen wir seine Eigenschaft <b>Datensatzquelle <\/b>auf diese Tabelle ein. Anschlie&szlig;end k&ouml;nnen wir alle Felder der Feldliste in den Detailbereich des Formulars ziehen. Gegebenenfalls lassen wir das Prim&auml;rschl&uuml;sselfeld <b>ID <\/b>weg, da dieses nur zum Herstellen von Beziehungen dient und keine gesch&auml;ftliche Funktion hat.<\/p>\n<p>Damit das Formular die Daten in der Datenblattansicht anzeigt, legen wir f&uuml;r die Eigenschaft <b>Standardansicht <\/b>noch den Wert <b>Datenblatt <\/b>fest (siehe Bild 1). Damit k&ouml;nnen wir die Arbeiten am Unterformular bereits beenden und dieses schlie&szlig;en.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_06\/pic_1397_001.png\" alt=\"Entwurf des Unterformulars sfmKundenuebersicht\" width=\"649,559\" height=\"475,1403\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Entwurf des Unterformulars sfmKundenuebersicht<\/span><\/b><\/p>\n<h2>Hauptformular erstellen<\/h2>\n<p>Anschlie&szlig;end erstellen wir das Hauptformular und speichern dieses direkt unter dem Namen <b>frmKundenuebersicht<\/b>. Diesem weisen wir keine Datensatzquelle zu, weil es selbst keine Daten anzeigen soll &#8211; diese liefert allein das Unterformular. Im Hauptformular wollen wir nur Steuerelemente zum Durchsuchen der Kundendaten und zum &Ouml;ffnen von Detaildatens&auml;tzen bereitstellen. Daher ben&ouml;tigen wir im Hauptformular auch nicht die Steuerelemente zum Navigieren in Datens&auml;tzen und stellen daher einige Eigenschaften ein. Die Eigenschaften <b>Navigationsschaltfl&auml;chen<\/b>, <b>Datensatzmarkierer<\/b>, <b>Bildlaufleisten <\/b>und <b>Trennlinien <\/b>setzen wir auf den Wert <b>Nein<\/b>, die Eigenschaft <b>Automatisch zentrieren <\/b>auf <b>Ja<\/b>.<\/p>\n<p>Dann ziehen wir aus dem Navigationsbereich das Unterformular <b>sfmKundenuebersicht <\/b>in den Detailbereich des Formularentwurfs von <b>frmKundenuebersicht<\/b>. Das Bezeichnungsfeld des Unterformular-Steuerelements entfernen wir, da wir ja wissen, dass dieses Kundendaten anzeigt.<\/p>\n<p>Damit das Unterformular beim Vergr&ouml;&szlig;ern des Hauptformulars ebenfalls vergr&ouml;&szlig;ert wird, stellen wir seine Eigenschaften <b>Horizontaler Anker <\/b>und <b>Vertikaler Anker <\/b>jeweils auf <b>Beide <\/b>ein.<\/p>\n<p>Wenn wir oben und unten ein wenig Platz f&uuml;r die Steuerelemente zum Suchen und zum Aufrufen der Anzeige der Kundendetails lassen, sieht der Entwurf nun wie in Bild 2 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_06\/pic_1397_002.png\" alt=\"Haupt- und Unterformular im Entwurf\" width=\"574,559\" height=\"512,128\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Haupt- und Unterformular im Entwurf<\/span><\/b><\/p>\n<h2>Steuerelemente zum Filtern der Kunden hinzuf&uuml;gen<\/h2>\n<p>Damit kommen wir zu den Steuerelementen, mit denen wir die Filterkriterien f&uuml;r die anzuzeigenden Kunden eingeben wollen. Diese platzieren wir wie in Bild 3 im Bereich &uuml;ber dem Unterformular. Die Steuerelemente hei&szlig;en:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_06\/pic_1397_003.png\" alt=\"Hinzuf&uuml;gen der Steuerelemente zum Filtern der Kundendatens&auml;tze\" width=\"574,559\" height=\"304,402\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Hinzuf&uuml;gen der Steuerelemente zum Filtern der Kundendatens&auml;tze<\/span><\/b><\/p>\n<ul>\n<li><b>txtFilterKundennummer<\/b><\/li>\n<li><b>txtFilterFirma<\/b><\/li>\n<li><b>txtFilterVorname<\/b><\/li>\n<li><b>txtFilterNachname<\/b><\/li>\n<li><b>txtFilterStrasse<\/b><\/li>\n<li><b>txtFilterPLZ<\/b><\/li>\n<li><b>txtFilterOrt<\/b><\/li>\n<li><b>txtFilterEMail<\/b><\/li>\n<\/ul>\n<p>Das Filtern wollen wir einfach und schnell realisieren: Jede Eingabe in eines der Filterfelder soll unmittelbar die gefilterten Daten anzeigen. Au&szlig;erdem soll immer im kompletten zu filternden Feld nach dem im jeweiligen Filterfeld eingegebenen Text gesucht werden. Sprich: Wenn der Benutzer im Feld <b>txtFilterKundennummer <\/b>den Wert <b>1 <\/b>eingibt, sollen alle Datens&auml;tze angezeigt werden, die an beliebiger Stelle im Feld <b>Kundennummer <\/b>den Wert <b>1 <\/b>enthalten.<\/p>\n<p>Das hei&szlig;t auch, dass wir f&uuml;r jedes der Steuerelemente zur Eingabe der Filterkriterien das Ereignis <b>Bei &Auml;nderung <\/b>implementieren m&uuml;ssen. Mit diesem rufen wir dann jeweils eine weitere Prozedur auf, welche die jeweiligen Werte der Filter-Textfelder ausliest und ein entsprechendes SQL-Kriterium zusammenstellt.<\/p>\n<h2>Unterschiedliche Eigenschaften zum Ermitteln der Vergleichskriterien<\/h2>\n<p>Das Problem dabei ist, dass wir f&uuml;r die Inhalte der Filter-Textfelder auf unterschiedliche Eigenschaften zugreifen m&uuml;ssen. Normalerweise greifen wir einfach auf die <b>Value<\/b>-Eigenschaft zu. Diese k&ouml;nnen wir allerdings nicht nutzen, wenn wir w&auml;hrend der Eingabe auf den Inhalt im aktuellen Textfeld zugreifen wollen. Der Grund ist, dass die <b>Value<\/b>-Eigenschaft erst mit dem aktuell im Textfeld enthaltenen Wert gef&uuml;llt wird, wenn der Benutzer die Eingabe best&auml;tigt &#8211; beispielsweise, indem er das Textfeld verl&auml;sst und den Fokus auf das n&auml;chste Textfeld verschiebt. In diesem Fall l&auml;sst sich der aktuell im Textfeld dargestellte Text nur mit der Eigenschaft <b>Text <\/b>auslesen.<\/p>\n<p>Wir m&uuml;ssen also zumindest f&uuml;r das aktuelle Textfeld auf die <b>Text<\/b>-Eigenschaft zugreifen und k&ouml;nnen nicht die <b>Value<\/b>-Eigenschaft nutzen. Aber warum ist das &uuml;berhaupt ein Problem? K&ouml;nnen wir nicht einfach auf den Inhalt aller Felder &uuml;ber die <b>Text<\/b>-Eigenschaft zugreifen? Das wiederum gelingt nicht, weil man nur f&uuml;r das Textfeld auf die <b>Text<\/b>-Eigenschaft zugreifen kann, das aktuell den Fokus hat.<\/p>\n<p>Wir m&uuml;ssen also den Inhalt des aktuell bearbeiteten Textfeldes mit der <b>Text<\/b>&#8211; und den der &uuml;brigen Textfelder mit der <b>Value<\/b>-Eigenschaft abfragen und pr&uuml;fen, ob diese Kriteriumsausdr&uuml;cke enthalten. Wobei die <b>Value<\/b>-Eigenschaft wiederum die Standardeigenschaft der <b>TextBox<\/b>-Klasse ist, weshalb wir diese gar nicht angeben m&uuml;ssen. Statt <b>Me!txtFilterKundennummer.Value <\/b>k&ouml;nnen wir einfach <b>Me!txtFilterKundennummer <\/b>schreiben.<\/p>\n<h2>Prozedur zum Ermitteln des Filterkriteriums f&uuml;r das Unterformular<\/h2>\n<p>Wir legen also zun&auml;chst f&uuml;r jedes der Filter-Textfelder eine Ereignisprozedur f&uuml;r das Ereignis <b>Bei &Auml;nderung <\/b>an. Diese enth&auml;lt f&uuml;r alle Filter-Textfelder den Aufruf einer weiteren Prozedur namens <b>KundenFiltern <\/b>&#8211; wie hier am Beispiel der Prozedur <b>txtFilterEMail <\/b>zu sehen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtFilterEMail_Change()\r\n     KundenFiltern\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Einfache Variante zum Zusammensetzen des Filterkriterums<\/h2>\n<p>Die Prozedur zum Zusammenstellen eines Filterausdrucks f&uuml;r das Unterformular k&ouml;nnen wir geradlinig und einfach aufbauen oder auch auf den ersten Blick etwas komplizierter, daf&uuml;r aber flexibler. Wir schauen uns beide Varianten an. Die erste finden Sie in Listing 1.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>KundenFiltern()\r\n     <span style=\"color:blue;\">Dim <\/span>strFilter<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span>Me!txtFilterKundennummer Is Me.ActiveControl<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(Me!txtFilterKundennummer.Text) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             strFilter = strFilter & \" AND Kundennummer LIKE ''*\" & Me!txtFilterKundennummer.Text & \"*''\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(Me!txtFilterKundennummer.Value) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             strFilter = strFilter & \" AND Kundennummer LIKE ''*\" & Me!txtFilterKundennummer.Value & \"*''\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span>Me!txtFilterFirma Is Me.ActiveControl<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(Me!txtFilterFirma.Text) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             strFilter = strFilter & \" AND Firma LIKE ''*\" & Me!txtFilterFirma.Text & \"*''\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(Me!txtFilterFirma.Value) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             strFilter = strFilter & \" AND txtFilterFirma LIKE ''*\" & Me!txtFilterFirma.Value & \"*''\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     ''...\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strFilter) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = <span style=\"color:blue;\">Mid<\/span>(strFilter, 5)\r\n         <span style=\"color:blue;\">With<\/span> Me!sfmKundenuebersicht.Form\r\n             .Filter = strFilter\r\n             .FilterOn = <span style=\"color:blue;\">True<\/span>\r\n         End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me!sfmKundenuebersicht.Form.Filter = \"\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Prozedur zum Einstellen des Filters f&uuml;r das Unterformular, einfache Version<\/span><\/b><\/p>\n<p>Diese Version verwendet eine Variable namens <b>strFilter<\/b>, um den Filterausdruck darin zusammenzustellen. Sie pr&uuml;ft f&uuml;r jedes der Filter-Textfelder, ob es sich dabei um das aktuelle Steuerelement handelt, also das Steuerelement, das aktuell den Fokus enth&auml;lt.  Das dient der Unterscheidung, ob wir die <b>Text<\/b>&#8211; oder die <b>Value<\/b>-Eigenschaft zum Ermitteln des jeweils in dem Steuerelement enthaltenen Textes verwenden m&uuml;ssen.<\/p>\n<p>Um herauszufinden, ob wir es bei dem aktuellen Steuerelement mit dem aktiven Steuerelement zu tun haben, vergleichen wir dieses mit dem Verweis auf das Steuerelement, das wir mit der Eigenschaft <b>ActiveControl <\/b>des Formulars ermitteln k&ouml;nnen. Sind beide gleich, handelt es sich um das aktive Steuerelement, sonst nicht. Ist das Steuerelement das aktive Steuerelement und ist dieses nicht leer, lesen wir den Inhalt mit der <b>Text<\/b>-Eigenschaft und stellen damit einen Ausdruck wie den folgenden zusammen:<\/p>\n<pre>  AND Kundennummer LIKE ''*Vergleichsausdruck*''<\/pre>\n<p><b>Vergleichsausdruck <\/b>entspricht dabei dem Inhalt des jeweiligen Textfeldes. Falls es sich bei dem aktuell untersuchten Steuerelement nicht um das aktive Steuerelement handelt, verwenden wir f&uuml;r den gleichen Ausdruck den Inhalt der <b>Value<\/b>-Eigenschaft des Textfeldes.<\/p>\n<p><!--30percent--><\/p>\n<p>Das Problem ist, dass wir in dieser Version f&uuml;r jedes Textfeld die folgenden Zeilen, hier beispielhaft am Textfeld <b>txtFilterKundennummer <\/b>gezeigt, in der Prozedur anlegen m&uuml;ssen:<\/p>\n<pre><span style=\"color:blue;\">If <\/span>Me!txtFilterKundennummer Is Me.ActiveControl<span style=\"color:blue;\"> Then<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(Me!txtFilterKundennummer.Text) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = strFilter & \" AND Kundennummer  LIKE ''*\" & Me!txtFilterKundennummer.Text & \"*''\"\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         strFilter = strFilter & \" AND Kundennummer  LIKE ''*\" & Me!txtFilterKundennummer.Value & \"*''\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>In der Beispielprozedur haben wir aus Platzgr&uuml;nden nur zwei dieser Konstrukte abgebildet. <b>strFilter <\/b>wird nur gef&uuml;llt, wenn &uuml;berhaupt irgendeins der Filter-Textfelder einen Wert enth&auml;lt. Dies pr&uuml;ft die folgende <b>If&#8230;Then<\/b>-Bedingung. Entdeckt diese in <b>strFilter <\/b>eine Zeichenfolge mit einer L&auml;nge gr&ouml;&szlig;er als <b>0<\/b>, dann trennt sie das f&uuml;hrende <b>AND <\/b>ab und stellt den Filter f&uuml;r die Eigenschaft <b>Filter <\/b>des Formulars im Unterformular-Steuerelement ein.<\/p>\n<p>Au&szlig;erdem aktiviert sie diesen, indem sie die Eigenschaft <b>FilterOn <\/b>auf den Wert <b>True <\/b>setzt. Enth&auml;lt <b>strFilter <\/b>eine leere Zeichenkette, stellt die Prozedur auch die <b>Filter<\/b>-Eigenschaft auf eine leere Zeichenkette ein. Die Eigenschaft <b>FilterOn <\/b>muss dann nicht auf <b>False <\/b>gesetzt werden.<\/p>\n<h2>Alternative Programmierung des Filters<\/h2>\n<p>Es gibt eine Alternative zur vorherigen Variante der Einstellung des Filters im Unterformular. In dieser ersetzen wir die Untersuchung des Inhalts der Textfelder in jeweils einem eigenen verschachtelten <b>If&#8230;Then<\/b>-Konstrukt durch eine Schleife, mit der wir die Filter-Textfelder durchlaufen.<\/p>\n<p>Das ist m&ouml;glich, weil wir die Benennung dieser Textfelder geschickt durchgef&uuml;hrt haben. All diese Textfelder beginnen n&auml;mlich mit der Zeichenkette <b>txtFilter <\/b>und enden mit dem Namen des Feldes, f&uuml;r welches das Textfeld den Vergleichswert liefern soll. Auf diese Weise k&ouml;nnen wir die Anweisungen, die wir oben in acht einzelnen verschachtelten <b>If&#8230;Then<\/b>-Konstrukten erledigt haben, innerhalb einer  Schleife &uuml;ber alle Steuerelemente abhandeln.<\/p>\n<p>Dazu deklarieren wir in der Prozedur aus Listing 2 zwei Objektvariablen. Die erste namens <b>ctl <\/b>dient zum Durchlaufen aller Steuerelemente des Hauptformulars in einer <b>For Each<\/b>-Schleife. Die zweite hei&szlig;t <b>txt <\/b>und hat den Datentyp <b>TextBox<\/b>. Mit ihr referenzieren wir alle Textfelder unter den durchlaufenen Steuerelementen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>KundenFiltern()\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Control\r\n     <span style=\"color:blue;\">Dim <\/span>txt<span style=\"color:blue;\"> As <\/span>TextBox\r\n     <span style=\"color:blue;\">Dim <\/span>strFilter<span style=\"color:blue;\"> As String<\/span>\r\n     For Each ctl In Me.Controls\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Left<\/span>(ctl.Name, 9) = \"txtFilter\"<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Set<\/span> txt = ctl\r\n             <span style=\"color:blue;\">If <\/span>txt Is Me.ActiveControl<span style=\"color:blue;\"> Then<\/span>\r\n                 <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(txt.Text) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                     strFilter = strFilter & \" AND \" & <span style=\"color:blue;\">Mid<\/span>(txt.Name, 10) & \" LIKE ''*\" & txt.Text & \"*''\"\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(Nz(txt.Value, \"\")) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                     strFilter = strFilter & \" AND \" & <span style=\"color:blue;\">Mid<\/span>(txt.Name, 10) & \" LIKE ''*\" & txt.Value & \"*''\"\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> ctl\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strFilter) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = <span style=\"color:blue;\">Mid<\/span>(strFilter, 5)\r\n         <span style=\"color:blue;\">With<\/span> Me!sfmKundenuebersicht.Form\r\n             .Filter = strFilter\r\n             .FilterOn = <span style=\"color:blue;\">True<\/span>\r\n         End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me!sfmKundenuebersicht.Form.Filter = \"\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Prozedur zum Einstellen des Filters f&uuml;r das Unterformular per Schleife<\/span><\/b><\/p>\n<p>Die <b>For Each<\/b>-Schleife verwendet die Auflistung <b>Me.Controls<\/b>, um alle Steuerelemente zu durchlaufen, und die Variable <b>ctl <\/b>zum Referenzieren des jeweiligen Steuerelements. Die erste <b>If&#8230;Then<\/b>-Bedingung innerhalb der Schleife pr&uuml;ft, ob die ersten neun Zeichen des Steuerelementnamens <b>txtFilter <\/b>lauten.<\/p>\n<p>Ist das der Fall, referenzieren wir das Steuerelement mit der Variablen <b>txt<\/b>. Das machen wir eigentlich nur, um IntelliSense zu nutzen. Wir k&ouml;nnten auch einfach mit der Variablen <b>ctl <\/b>weiterarbeiten.<\/p>\n<p>Die zweite <b>If&#8230;Then<\/b>-Bedingung pr&uuml;ft, ob es sich bei dem mit <b>txt <\/b>referenzierten Steuerelement um das Steuerelement handelt, das aktuell den Fokus hat. Das dient wie im obigen Beispiel dazu, den Inhalt des Textfeldes entweder &uuml;ber die <b>Text<\/b>&#8211; oder die <b>Value<\/b>-Eigenschaft auszulesen.<\/p>\n<p>Wenn dann noch die Eigenschaft <b>Text <\/b>beziehungsweise <b>Value <\/b>des Textfeldes nicht leer ist, f&uuml;gt die Prozedur ein Kriterium zur Variablen <b>strFilter <\/b>hinzu. Hier ermitteln wir mit <b>Mid(txt.Name, 10) <\/b>aus einem Textfeld wie <b>txtFilterKundennummer <\/b>den Wert <b>Kundennummer<\/b>, welcher dem Namen des im Filterausdruck zu verwendenden Feldes entspricht.<\/p>\n<p>Auf diese Weise durchlaufen wir alle Steuerelemente und setzen die Informationen aus den Feldern, deren Name mit <b>txtFilter <\/b>beginnt, als Filterausdruck in der Variablen <b>strFilter <\/b>zusammen. Die Zuweisung des Filterausdrucks zum Unterformular erfolgt analog zu der im zuvor beschriebenen Beispiel.<\/p>\n<h2>Vorteil beim Filtern per Schleife<\/h2>\n<p>Die Programmierung der hier vorgestellten Schleife ist zwar etwas aufwendiger, als wenn wir die betroffenen Filter-Textfelder nacheinander untersuchen. Allerdings sparen wir eine Menge Code und, was noch wichtiger ist: Wir k&ouml;nnen nun weitere Filter-Textfelder hinzuf&uuml;gen oder vorhandene Entfernen und brauchen den Code nicht mehr zu &auml;ndern.<\/p>\n<p>Die neuen Textfelder werden automatisch einbezogen. Die einzige Voraussetzung f&uuml;r ein Funktionieren des Filters ist, dass der Name der Filter-Textfelder mit <b>txtFilter <\/b>beginnt und anschlie&szlig;end den Namen des zu filternden Feldes enth&auml;lt.<\/p>\n<p>Der Filter funktioniert nun wie gew&uuml;nscht &#8211; wenn wir beispielsweise den Filter <b>9900000 <\/b>f&uuml;r die Kundennummer eingeben, erscheinen nur noch die Kundendatens&auml;tze, deren Kundennummer mit diesem Wert beginnt (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_06\/pic_1397_004.png\" alt=\"Filtern der Kundendatens&auml;tze nach der Kundennummer\" width=\"700\" height=\"353,1111\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Filtern der Kundendatens&auml;tze nach der Kundennummer<\/span><\/b><\/p>\n<h2>Schaltfl&auml;chen f&uuml;r weitere Funktionen<\/h2>\n<p>Neben dem Filtern der angezeigten Kunden im Unterformular wollen wir noch einige Funktionen zum Formular hinzuf&uuml;gen. Die meisten davon sollen per Schaltfl&auml;che ausgel&ouml;st werden, eine jedoch wollen wir auch per Doppelklick auf den gew&uuml;nschten Eintrag erledigen:<\/p>\n<ul>\n<li>Schaltfl&auml;che <b>cmdKundendetails<\/b>: Soll das Formular <b>frmKundeDetails <\/b>mit den Details zum aktuell markierten Kunden &ouml;ffnen.<\/li>\n<li>Schaltfl&auml;che <b>cmdNeuerKunde<\/b>: Soll das Formular <b>frmKundeDetails <\/b>mit einem neuen, leeren Datensatz &ouml;ffnen.<\/li>\n<li>Schaltfl&auml;che <b>cmdKundeLoeschen<\/b>: Soll den aktuell markierten Kunden l&ouml;schen, sofern f&uuml;r diesen nicht bereits Bestellungen angelegt wurden.<\/li>\n<li>Doppelklick auf einen der Datens&auml;tze im Unterformular: Soll das Formular <b>frmKundeDetails <\/b>mit den Details zum aktuell markierten Kunden &ouml;ffnen.<\/li>\n<\/ul>\n<p>Die Schaltfl&auml;chen legen wir unterhalb des Unterformular-Steuerelements an.<\/p>\n<p>Da wir f&uuml;r dieses die Eigenschaft <b>Vertikaler Anker <\/b>auf <b>Beide <\/b>eingestellt haben und dieses sich beim Vergr&ouml;&szlig;ern der H&ouml;he des Formulars nach unten ausdehnt, m&uuml;ssen wir diese Eigenschaft f&uuml;r die Schaltfl&auml;chen auf <b>Unten <\/b>einstellen.<\/p>\n<p>Sonst werden diese beim Vergr&ouml;&szlig;ern des Unterformulars von diesem verdeckt.<\/p>\n<h2>Umgang mit ge&auml;nderten Daten aus dem Formular frmKundeDetails<\/h2>\n<p>Immer wenn wir aus einer &Uuml;bersicht heraus ein Detailformular &ouml;ffnen, um einen bestehenden Datensatz zu bearbeiten oder einen neuen Datensatz anzulegen, k&ouml;nnen &Auml;nderungen am Datenbestand entstehen, die nach dem Schlie&szlig;en des jeweiligen Detailformulars direkt im aufrufenden &Uuml;bersichtsformular abgebildet werden sollen.<\/p>\n<p>Hier stellt sich die Frage, wie wir dies abbilden wollen. Wir haben zwei M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Wir &ouml;ffnen das Formular <b>frmKundeDetails<\/b> als modalen Dialog. Dann l&auml;uft der aufrufende Code erst weiter, wenn der Benutzer das Formular schlie&szlig;t und wir k&ouml;nnen dann die Daten im Unterformular aktualisieren.<\/li>\n<li>Wir referenzieren das ge&ouml;ffnete Formular und implementieren das Ereignis <b>Beim Entladen<\/b>, um nach dem Entladen des Formulars die Daten im Unterformular zu aktualisieren.<\/li>\n<\/ul>\n<p>Da der Benutzer vielleicht andere Aktionen durchf&uuml;hren m&ouml;chte, w&auml;hrend das Formular <b>frmKundeDetails <\/b>ge&ouml;ffnet ist, wollen wir in diesem Fall die zweite Methode nutzen. Dazu deklarieren wir im Klassenmodul des Formulars <b>frmKundenuebersicht <\/b>die folgende Objektvariable:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>WithEvents m_frmKundeDetails<span style=\"color:blue;\"> As <\/span>Form<\/pre>\n<p>In der Prozedur, die durch einen Klick auf die Schaltfl&auml;che <b>cmdKundendetails <\/b>ausgel&ouml;st wird, lesen wir zuerst die ID des aktuell im Unterformular ausgew&auml;hlten Kunden in die Variable <b>lngKundeID <\/b>ein. Hat der Benutzer keinen Eintrag markiert, erh&auml;lt <b>lngKundeID <\/b>den Wert <b>0 <\/b>und die folgenden Schritte werden nicht ausgef&uuml;hrt.<\/p>\n<p>Anderenfalls &ouml;ffnet die Prozedur das Formular <b>frmKundeDetails <\/b>mit der <b>DoCmd.OpenForm<\/b>-Anweisung und &uuml;bergibt mit dem <b>WhereCondition<\/b>-Parameter den Filterausdruck f&uuml;r das zu &ouml;ffnende Formular. Dieses sorgt daf&uuml;r, dass das Formular den zu bearbeitenden Datensatz anzeigt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdKundendetails_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>lngKundeID<span style=\"color:blue;\"> As Long<\/span>\r\n     lngKundeID = Nz(Me!sfmKundenuebersicht.Form.ID, 0)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> lngKundeID = 0<span style=\"color:blue;\"> Then<\/span>\r\n         DoCmd.OpenForm \"frmKundeDetails\",  WhereCondition:=\"ID = \" & lngKundeID<\/pre>\n<p>Direkt im Anschluss referenziert die Prozedur das soeben ge&ouml;ffnete Formular mit der Variablen <b>m_frmKundeDetails <\/b>und stellt seine Eigenschaft <b>OnUnload <\/b>auf den Wert <b>[Event Procedure] <\/b>ein.<\/p>\n<p>Das ist gleichbedeutend mit dem Einstellen der Eigenschaft <b>Beim Entladen <\/b>des Formulars auf den Wert <b>[Ereignisprozedur] <\/b>und sorgt daf&uuml;r, dass Access im eigenen Klassenmodul des Formulars (hier explizit) und in anderen Klassenmodulen, in denen eine Objektvariable mit einem Verweis auf das Formular erstellt wurde, nach einer entsprechenden Implementierung des Ereignisses gesucht wird:<\/p>\n<pre>         <span style=\"color:blue;\">Set<\/span> m_frmKundeDetails = Forms!frmKundeDetails\r\n         <span style=\"color:blue;\">With<\/span> m_frmKundeDetails\r\n             .OnUnload = \"[Event Procedure]\"\r\n         End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Nun ben&ouml;tigen wir noch die Implementierung des Ereignisses im Klassenmodul des aufrufenden Formulars, also in <b>Form_frmKundenuebersicht<\/b>.<\/p>\n<p>Diese erstellen wir durch Auswahl des Eintrags <b>m_frmKundeDetails <\/b>im linken Kombinationsfeld des Codefensters und der anschlie&szlig;enden Auswahl des Eintrags <b>Unload <\/b>im rechten Kombinationsfeld. Danach f&uuml;gen wir einen Aufruf der Prozedur <b>KundenFiltern <\/b>hinzu:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>m_frmKundeDetails_Unload(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     KundenFiltern\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies sorgt nun daf&uuml;r, dass das Unterformular nach dem Aufruf des Formulars <b>frmKundeDetails <\/b>und dem Schlie&szlig;en des Formulars neu gefiltert wird. So werden eventuelle &Auml;nderungen am Kundendatensatz direkt in das Unterformular &uuml;bernommen.<\/p>\n<h2>Anlegen eines neuen Kunden<\/h2>\n<p>Beim Anlegen eines neuen Kunden verfahren wir analog. Hier rufen wir das Formular <b>frmKundeDetails <\/b>allerdings mit dem Wert <b>acFormAdd <\/b>f&uuml;r den Parameter <b>DataMode <\/b>auf.<\/p>\n<p>Danach setzen wir wieder die Variable <b>m_frmKundeDetails <\/b>auf das entsprechende Formular und legen die Ereigniseigenschaft auf <b>[Event Procedure] <\/b>fest:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdNeuerKunde_Click()\r\n     DoCmd.OpenForm \"frmKundeDetails\", DataMode:=acFormAdd\r\n     <span style=\"color:blue;\">Set<\/span> m_frmKundeDetails = Forms!frmKundeDetails\r\n     <span style=\"color:blue;\">With<\/span> m_frmKundeDetails\r\n         .OnUnload = \"[Event Procedure]\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Nach dem Anlegen eines neuen Datensatzes und dem Schlie&szlig;en des Formulars <b>frmKundeDetails <\/b>aktualisiert die Prozedur <b>m_frmKundeDetails_Unload <\/b>den Inhalt des Unterformulars in <b>frmKundenuebersicht<\/b>.<\/p>\n<h2>L&ouml;schen eines Kundendatensatzes<\/h2>\n<p>Zum L&ouml;schen ermitteln wir wieder die ID des markierten Kunden im Unterformular und speichern diesen in der Variablen <b>lngKundeID<\/b> (siehe Listing 3). Hat <b>lngKundeID <\/b>den Wert <b>0<\/b>, ist kein Datensatz markiert und die Prozedur wird beendet.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdKundeLoeschen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>lngKundeID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     lngKundeID = Me!sfmKundenuebersicht.Form.ID\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> lngKundeID = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">MsgBox<\/span>(\"Soll der Kunde wirklich gel&ouml;scht werden?\", vbYesNo + vbExclamation, \"Kunde l&ouml;schen\") = vbYes<span style=\"color:blue;\"> Then<\/span>\r\n             On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n             <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n             db.Execute \"DELETE FROM tblKunden WHERE ID = \" & lngKundeID, dbFailOnError\r\n             Select Case Err.Number\r\n                 <span style=\"color:blue;\">Case <\/span>3200\r\n                     <span style=\"color:blue;\">MsgBox<\/span> \"Der Kunde kann nicht gel&ouml;scht werden, da f&uuml;r diesen bereits Bestellungen angelegt wurden.\", _\r\n                          vbExclamation, \"L&ouml;schen abgebrochen\"\r\n                 <span style=\"color:blue;\">Case <\/span>0\r\n                     KundenFiltern\r\n                 <span style=\"color:blue;\">Case Else<\/span>\r\n                     <span style=\"color:blue;\">MsgBox<\/span> Err.Number & \" \" & Err.Description\r\n             <span style=\"color:blue;\">End Select<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Prozedur zum L&ouml;schen eines Kunden per Mausklick<\/span><\/b><\/p>\n<p>Anderenfalls erfolgt eine R&uuml;ckfrage, ob der Kunde tats&auml;chlich gel&ouml;scht werden soll. Klickt der Benutzer nun auf die Schaltfl&auml;che <b>Ja<\/b>, erfolgt bei deaktivierter Fehlerbehandlung der Aufruf einer <b>DELETE<\/b>-Anweisung f&uuml;r den angegebenen Datensatz der Tabelle <b>tblKunden<\/b>.<\/p>\n<p>In den Beziehungseigenschaften haben wir festgelegt, dass Kunden nicht gel&ouml;scht werden k&ouml;nnen, wenn f&uuml;r diese bereits ein verkn&uuml;pfter Datensatz in der Tabelle <b>tblBestellungen <\/b>hinterlegt wurde. Versucht der Benutzer, einen solchen Datensatz zu l&ouml;schen, l&ouml;st dies den Fehler mit der Nummer <b>3200 <\/b>aus, den wir nachfolgend in Form einer benutzerdefinierten Fehlermeldung behandeln.<\/p>\n<p>Liefert das Err-Objekt anschlie&szlig;end den Wert 0 zur&uuml;ck, wird der Datensatz gel&ouml;scht und die Prozedur ruft die Routine <b>KundenFiltern <\/b>auf, um die im Unterformular angezeigten Daten zu aktualisieren. <\/p>\n<p>Alle anderen Werte von <b>Err.Number <\/b>f&uuml;hren zur Anzeige des jeweiligen Fehlers in einem Meldungsfenster.<\/p>\n<h2>&Ouml;ffnen eines Kundendatensatzes per Doppelklick auf den Eintrag im Unterformular<\/h2>\n<p>Wenn der Benutzer doppelt auf einen der Eintr&auml;ge im Unterformular klickt, soll der entsprechende Kundendatensatz ebenfalls im Formular <b>frmKundeDetails <\/b>erscheinen. Hier stehen wir vor der Aufgabe, f&uuml;r alle im Unterformular enthaltenen gebundenen Steuerelemente eine Ereignisprozedur anzulegen, die durch das Ereignis <b>Beim Doppelklicken <\/b>ausgel&ouml;st wird. Diese sollen wie die zuvor beschriebene Prozedur <b>cmdKundendetails_Click <\/b>das Formular <b>frmKundeDetails <\/b>aufrufen und den aktuell im Unterformular markierten Kundendatensatz anzeigen.<\/p>\n<p>Es ist allerdings nicht sinnvoll, die Funktion dieser Prozedur einfach nochmal im Klassenmodul des Unterformulars zu reproduzieren. Das erh&ouml;ht nur den Aufwand bei eventuellen &Uuml;berarbeitungen des VBA-Codes. Also wollen wir daf&uuml;r sorgen, dass ein Doppelklick auf ein gebundenes Feld im Unterformular direkt die Prozedur <b>cmdKundendetails_Click <\/b>aufruft.<\/p>\n<p>Dazu gibt es zwei M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Wir &auml;ndern die Sichtbarkeit der Prozedur <b>cmdKundendetails_Click <\/b>im Hauptformular auf <b>Public <\/b>und rufen diese wie folgt von den Ereignisprozeduren im Unterformular auf.<\/li>\n<li>Wir referenzieren die Steuerelemente aus dem Unterformular mit dem Schl&uuml;sselwort <b>WithEvents <\/b>im Klassenmodul des Hauptformulars und implementieren dort die Ereignisse dieser Steuerelemente.<\/li>\n<\/ul>\n<p>Letztere Variante ist mit deutlich gr&ouml;&szlig;erem Programmieraufwand verbunden, also w&auml;hlen wir die erste Variante. F&uuml;r die Prozedur <b>cmdKundendetails_Click <\/b>&auml;ndern wir lediglich das Schl&uuml;sselwort <b>Private <\/b>in <b>Public<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>cmdKundendetails_Click()\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Im Unterformular platzieren wir dann die folgende Ereignisprozedur f&uuml;r das Steuerelement <b>Kundennummer<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Kundennummer_DblClick(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Me.Parent.cmdKundendetails_Click\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Den Aufruf dieser Prozedur f&uuml;gen wir analog f&uuml;r alle &uuml;brigen gebundenen Steuerelemente hinzu. Genau genommen &uuml;bertragen wir den Aufruf der Prozedur <b>cmdKundendetails_Click <\/b>in eine neue Prozedur, die wie folgt aussieht:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>DblClick()\r\n     Me.Parent.cmdKundendetails_Click\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese Prozedur rufen wir dann in den <b>Beim Doppelklicken<\/b>-Ereignisprozeduren auf:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>AnredeID_DblClick(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     DblClick\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>EMail_DblClick(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     DblClick\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n...<\/pre>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Damit haben wir ein Formular erstellt, dass die Filterung der in der Datenbank enthaltenen Kunden erlaubt und mit der wir Kunden bearbeiten, neu anlegen oder l&ouml;schen k&ouml;nnen. Das Bearbeiten erfolgt dabei sowohl &uuml;ber die Auswahl und Bet&auml;tigen einer Schaltfl&auml;che als auch &uuml;ber einen Doppelklick auf den betroffenen Eintrag im Unterformular.<\/p>\n<p>Eine spannende Funktion haben wir uns noch f&uuml;r einen weiteren Artikel vorbehalten. In diesem zeigen wir, wie Sie die aktuelle Auswahl der Kunden im Unterformular als Textdatei im <b>.csv<\/b>-Format exportieren k&ouml;nnen.<\/p>\n<p>Diese L&ouml;sung finden Sie im Beitrag <b>Selektion aus Unterformular in Textdatei schreiben <\/b>(<b>www.access-im-unternehmen.de\/1411<\/b>).<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Rechnungsbericht_Kundenuebersicht.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/440BC82D-654E-4E66-AAD3-87FFC9016C57\/aiu_1397.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn der Kunde anruft, m&ouml;chten Sie schnell den entsprechenden Kundendatensatz auf dem Bildschirm haben. Dazu stellen wir im vorliegenden Beitrag ein Formular samt Unterformular zusammen, mit denen die gew&uuml;nschten Daten schnell ermittelt werden k&ouml;nnen. Im Hauptformular bieten wir einige Suchfunktionen an, im Unterformular liefern wir in die den Suchkriterien entsprechenden Daten in der Datenblattansicht. Au&szlig;erdem soll das Formular die M&ouml;glichkeit bieten, den gefundenen Kundendatensatz im Detailformular zu &ouml;ffnen, damit wir auch noch die Bestellungen des Kunden einsehen k&ouml;nnen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662022,66062022,44000023],"tags":[],"class_list":["post-55001397","post","type-post","status-publish","format-standard","hentry","category-662022","category-66062022","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Rechnungsverwaltung: Kunden&uuml;bersicht mit Suche - 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\/Rechnungsverwaltung_Kundenuebersicht_mit_Suche\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Rechnungsverwaltung: Kunden&uuml;bersicht mit Suche\" \/>\n<meta property=\"og:description\" content=\"Wenn der Kunde anruft, m&ouml;chten Sie schnell den entsprechenden Kundendatensatz auf dem Bildschirm haben. Dazu stellen wir im vorliegenden Beitrag ein Formular samt Unterformular zusammen, mit denen die gew&uuml;nschten Daten schnell ermittelt werden k&ouml;nnen. Im Hauptformular bieten wir einige Suchfunktionen an, im Unterformular liefern wir in die den Suchkriterien entsprechenden Daten in der Datenblattansicht. Au&szlig;erdem soll das Formular die M&ouml;glichkeit bieten, den gefundenen Kundendatensatz im Detailformular zu &ouml;ffnen, damit wir auch noch die Bestellungen des Kunden einsehen k&ouml;nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenuebersicht_mit_Suche\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2022-12-01T11:16:01+00:00\" \/>\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=\"19\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Kundenuebersicht_mit_Suche\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Kundenuebersicht_mit_Suche\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Rechnungsverwaltung: Kunden&uuml;bersicht mit Suche\",\"datePublished\":\"2022-12-01T11:16:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Kundenuebersicht_mit_Suche\\\/\"},\"wordCount\":3191,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"articleSection\":[\"2022\",\"6\\\/2022\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Kundenuebersicht_mit_Suche\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Kundenuebersicht_mit_Suche\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Kundenuebersicht_mit_Suche\\\/\",\"name\":\"Rechnungsverwaltung: Kunden&uuml;bersicht mit Suche - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"datePublished\":\"2022-12-01T11:16:01+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Kundenuebersicht_mit_Suche\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Kundenuebersicht_mit_Suche\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Kundenuebersicht_mit_Suche\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Rechnungsverwaltung: Kunden&uuml;bersicht mit Suche\"}]},{\"@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":"Rechnungsverwaltung: Kunden&uuml;bersicht mit Suche - 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\/Rechnungsverwaltung_Kundenuebersicht_mit_Suche\/","og_locale":"de_DE","og_type":"article","og_title":"Rechnungsverwaltung: Kunden&uuml;bersicht mit Suche","og_description":"Wenn der Kunde anruft, m&ouml;chten Sie schnell den entsprechenden Kundendatensatz auf dem Bildschirm haben. Dazu stellen wir im vorliegenden Beitrag ein Formular samt Unterformular zusammen, mit denen die gew&uuml;nschten Daten schnell ermittelt werden k&ouml;nnen. Im Hauptformular bieten wir einige Suchfunktionen an, im Unterformular liefern wir in die den Suchkriterien entsprechenden Daten in der Datenblattansicht. Au&szlig;erdem soll das Formular die M&ouml;glichkeit bieten, den gefundenen Kundendatensatz im Detailformular zu &ouml;ffnen, damit wir auch noch die Bestellungen des Kunden einsehen k&ouml;nnen.","og_url":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenuebersicht_mit_Suche\/","og_site_name":"Access im Unternehmen","article_published_time":"2022-12-01T11:16:01+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"19\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenuebersicht_mit_Suche\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenuebersicht_mit_Suche\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Rechnungsverwaltung: Kunden&uuml;bersicht mit Suche","datePublished":"2022-12-01T11:16:01+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenuebersicht_mit_Suche\/"},"wordCount":3191,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"articleSection":["2022","6\/2022","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenuebersicht_mit_Suche\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenuebersicht_mit_Suche\/","url":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenuebersicht_mit_Suche\/","name":"Rechnungsverwaltung: Kunden&uuml;bersicht mit Suche - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"datePublished":"2022-12-01T11:16:01+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenuebersicht_mit_Suche\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenuebersicht_mit_Suche\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenuebersicht_mit_Suche\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Rechnungsverwaltung: Kunden&uuml;bersicht mit Suche"}]},{"@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\/55001397","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=55001397"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001397\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001397"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001397"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001397"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}