{"id":55001384,"date":"2022-08-01T00:00:00","date_gmt":"2022-08-04T18:15:06","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1384"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Rechnungsverwaltung_Bestelluebersicht","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Bestelluebersicht\/","title":{"rendered":"Rechnungsverwaltung: Bestell&uuml;bersicht"},"content":{"rendered":"<p><b>Im Beitrag &#8222;Rechnungsverwaltung: Bestellformular&#8220; (www.access-im-unternehmen.de\/1382) aus der kommenden Ausgabe 5\/2022 stellen wir ein Formular zur Eingabe neuer Bestellungen inklusive Bestellpositionen vor. Damit der Benutzer komfortabel auf bereits angelegte Bestellungen zugreifen und neue Bestellungen anlegen kann, stellen wir ihm ein &Uuml;bersichtsformular f&uuml;r die Bestellungen zur Seite. Wie Sie dieses erstellen, zeigen wir im vorliegenden Beitrag. Dabei wollen wir nicht nur die Bestellungen in der &Uuml;bersicht anzeigen, sondern auch M&ouml;glichkeiten zum Durchsuchen der Rechnungen sowie f&uuml;r die Anzeige der zuletzt verwendeten Rechnungen anbieten.<\/b><\/p>\n<h2>Listenfeld oder Unterformular in der Datenblattansicht?<\/h2>\n<p>Wenn man eine &Uuml;bersicht wie die hier geplante darstellen m&ouml;chte, stellt sich immer die Frage, ob man ein Listenfeld oder ein Datenblatt zur Auflistung der Eintr&auml;ge verwenden soll. Wenn der Benutzer in der Lage sein soll, auf einfache Weise selbst die Datens&auml;tze zu sortieren oder nach verschiedenen Kriterien zu filtern, bietet sich ein Unterformular in der Datenblattansicht an.<\/p>\n<p>Im Gegensatz zum Listenfeld kann der Benutzer hier jedoch standardm&auml;&szlig;ig die Daten bearbeiten, was Sie gegebenenfalls unterbinden m&uuml;ssen. Wie das gelingt, zeigen wir ebenfalls in diesem Beitrag. Die Datenblattansicht bietet noch weitere Vorteile: Der Benutzer kann die Anordnung der Spalten variieren und auch Spalten ein- und ausblenden.<\/p>\n<h2>Unterformular erstellen<\/h2>\n<p>Im Gegensatz zu &uuml;blichen Gepflogenheiten starten wir in diesem Beitrag einmal nicht mit dem Hauptformular, sondern legen direkt das Unterformular zur Anzeige der Bestellungen an. Dieses soll <b>sfmBestellungenUebersicht <\/b>hei&szlig;en und die Tabelle <b>tbl-Be-stel-lungen <\/b>als Datensatzquelle verwenden. Wir ziehen alle Felder aus dieser Tabelle mit Ausnahme des Feldes <b>ID <\/b>in den Detailbereich der Entwurfsansicht. Au&szlig;erdem stellen wir die Eigenschaft <b>Standardansicht <\/b>auf <b>Datenblatt <\/b>ein und schlie&szlig;en das Formular (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1384_001.png\" alt=\"Das Unterformular sfmBestellungenUebersicht\" width=\"524,559\" height=\"334,3837\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Das Unterformular sfmBestellungenUebersicht<\/span><\/b><\/p>\n<h2>Hauptformular erstellen<\/h2>\n<p>Das Hauptformular f&uuml;r die Bestell&uuml;bersicht soll <b>frmBe-stel-lun-gen-Uebersicht<\/b> hei&szlig;en. Wir f&uuml;gen ihm als Erstes das Unterformular <b>sfmBestellungenUebersicht <\/b>hinzu, indem wir dieses aus dem Navigationsbereich in den Detailbereich des Formularentwurfs ziehen.<\/p>\n<p>Damit erhalten wir die Anzeige der Bestellungen in der Datenblattansicht und k&ouml;nnen gleichzeitig im Hauptformular noch weitere Steuerelemente hinzuf&uuml;gen, was in einem Formular in der Datenblattansicht allein nicht m&ouml;glich gewesen w&auml;re.<\/p>\n<p>F&uuml;r das Unterformular-Steuerelement stellen wir die Eigenschaften <b>Horizontaler Anker <\/b>und <b>Vertikaler Anker <\/b>jeweils auf den Wert <b>Beide <\/b>ein. So wird das Unterformular gemeinsam mit dem Hauptformular vergr&ouml;&szlig;ert. Au&szlig;erdem l&ouml;schen wir das Bezeichnungsfeld des Unterformulars.<\/p>\n<p>Und wir wissen bereits, dass wir im Hauptformular selbst keine Daten anzeigen wollen. Daher k&ouml;nnen wir die Eigenschaften <b>Datensatzmarkierer<\/b>, <b>Navigationsschaltfl&auml;chen<\/b>, <b>Bildlaufleisten <\/b>und <b>Trennlinien <\/b>hier direkt auf den Wert <b>Nein <\/b>einstellen.<\/p>\n<p>Au&szlig;erdem soll das Formular, wenn es nicht ohnehin maximiert erscheint, zumindest mittig im Access-Fenster landen. Daher stellen wir <b>Automatisch zentrieren <\/b>auf <b>Ja <\/b>ein.<\/p>\n<h2>Verwalten von Bestellungen<\/h2>\n<p>Ausgehend von hier k&ouml;nnen wir uns nun &uuml;berlegen, welche Funktionen wir dem Formular hinzuf&uuml;gen wollen. Hier sind die Ideen, die wir in den folgenden Abschnitten umsetzen:<\/p>\n<ul>\n<li>Schaltfl&auml;che zum Hinzuf&uuml;gen einer neuen Bestellung &uuml;ber das Formular <b>frmBestellungDetails <\/b>mit anschlie&szlig;ender Anzeige dieser Bestellung im Unterformular <b>sfmBestellungenUebersicht<\/b><\/li>\n<li>Anzeigen der Details zu einer Bestellung im Formular <b>frmBestellungDetails<\/b>, entweder durch Auswahl und anschlie&szlig;endes Bet&auml;tigen einer Schaltfl&auml;che oder per Doppelklick<\/li>\n<li>L&ouml;schen der aktuell markierten Bestellung<\/li>\n<li>Verhindern von &Auml;nderungen der Daten im Unterformular<\/li>\n<li>Verschiedene Suchkriterien, zum Beispiel Schnellsuche nach Bestellnummer oder Kunde und nach den verschiedenen Datumsangaben<\/li>\n<\/ul>\n<h2>Hinzuf&uuml;gen einer neuen Bestellung<\/h2>\n<p>Das Hinzuf&uuml;gen einer neuen Bestellung erfolgt &uuml;ber eine Schaltfl&auml;che namens <b>cmdNeueBestellung<\/b>. Diese soll das Formular <b>frmBestellungDetails <\/b>zum Eingeben eines neuen Datensatzes &ouml;ffnen. Nach dem Hinzuf&uuml;gen soll der neue Datensatz direkt mit den &uuml;brigen Bestellungen im Unterformular angezeigt und auch markiert werden. Der notwendige Code lautet wie in Listing 1.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdNeueBestellung_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>lngNeueBestellungID<span style=\"color:blue;\"> As Long<\/span>\r\n     DoCmd.OpenForm \"frmBestellungDetails\", WindowMode:=acDialog, DataMode:=acFormAdd\r\n     <span style=\"color:blue;\">If <\/span>IstFormularGeoeffnet(\"frmBestellungDetails\")<span style=\"color:blue;\"> Then<\/span>\r\n         lngNeueBestellungID = Forms!frmBestellungDetails!ID\r\n         DoCmd.Close acForm, \"frmBestellungDetails\"\r\n         Me!sfmBestellungenUebersicht.Form.Requery\r\n         Me!sfmBestellungenUebersicht.Form.Recordset.FindFirst \"ID = \" & lngNeueBestellungID\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: Code zum &Ouml;ffnen einer neuen Bestellung<\/span><\/b><\/p>\n<p>Wir &ouml;ffnen das Formular <b>frmBestellungDetails <\/b>als modalen Dialog und im Modus zum Hinzuf&uuml;gen eines Datensatzes (siehe Bild 2). In diesem Formular gibt der Benutzer nun einen neuen Datensatz ein. Mit einem Klick auf die <b>OK<\/b>-Schaltfl&auml;che schlie&szlig;t er die Eingabe ab und macht das Formular unsichtbar, was den aufrufenden Code fortsetzt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1384_002.png\" alt=\"Anlegen einer neuen Bestellung vom Formular frmBestellungenUebersicht aus\" width=\"649,559\" height=\"519,8055\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Anlegen einer neuen Bestellung vom Formular frmBestellungenUebersicht aus<\/span><\/b><\/p>\n<p>Hier pr&uuml;fen wir mit der Hilfsfunktion <b>IstFormularGeoeffnet<\/b>, ob das Formular <b>frmBestellungDetails <\/b>noch ge&ouml;ffnet ist. Ist das der Fall, liest die Prozedur den Wert des dortigen Feldes <b>ID <\/b>in die Variable <b>lngNeueBestellungID <\/b>ein und schlie&szlig;t das Formular endg&uuml;ltig. Danach aktualisiert die Prozedur den Inhalt des Unterformulars <b>sfmBestellungenUebersicht <\/b>und stellt dieses auf den neu angelegten Datensatz ein.<\/p>\n<p>Hier kommt es noch zu einem Problem, wenn die durch den Benutzer eingegebenen Daten nicht erfolgreich validiert werden k&ouml;nnen. Bisher blendet die Schaltfl&auml;che <b>cmdOK <\/b>im Formular <b>frmBestellungDetails <\/b>das Formular nur aus, aber die Validierung erfolgt ja nur, wenn der Datensatz gespeichert wird &#8211; und das geschieht erst, wenn die aufrufende Prozedur das Formular mit <b>DoCmd.Close acForm, &#8222;frmBestellungDetails&#8220; <\/b>schlie&szlig;t. Damit die Validierung auch beim Ausblenden mit der Schaltfl&auml;che <b>cmdOK <\/b>durchgef&uuml;hrt wird, rufen wir die Prozedur <b>Form_BeforeUpdate <\/b>explizit auf und werten den darin gesetzten R&uuml;ckgabeparameter <b>Cancel <\/b>wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdOK_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>intCancel<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">If <\/span>Me.Dirty = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         DoCmd.Close acForm, Me.Name\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Form_BeforeUpdate intCancel\r\n     <span style=\"color:blue;\">If <\/span>intCancel = 0<span style=\"color:blue;\"> Then<\/span>\r\n         Me.Visible = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Im ersten Teil pr&uuml;fen wir au&szlig;erdem noch, ob der Benutzer den angezeigten Datensatz &uuml;berhaupt ge&auml;ndert hat und ob somit &uuml;berhaupt eine Validierung n&ouml;tig ist. Ist das nicht der Fall und die Eigenschaft <b>Me.Dirty <\/b>liefert den Wert <b>False <\/b>zur&uuml;ck, schlie&szlig;t <b>cmdOK_Click<\/b> das Formular direkt und beendet die Prozedur.<\/p>\n<h2>Anzeigen der Details einer Bestellung<\/h2>\n<p>Wenn der Benutzer einen der Datens&auml;tze im Unterformular markiert hat und auf die Schaltfl&auml;che <b>cmdBestellungAnzeigen <\/b>klickt, soll das Formular <b>frmBestellungDetails <\/b>ge&ouml;ffnet werden und den aktuell markierten Datensatz anzeigen.<\/p>\n<p>Das realisieren wir mit der Prozedur <b>cmdBestellungAnzeigen_Click<\/b> aus Listing 2. Hier rufen wir das Formular <b>frmBestellungDetails <\/b>wieder mit der <b>DoCmd.OpenForm<\/b>-Methode auf, allerdings &uuml;bergeben wir f&uuml;r den Parameter <b>DataMode <\/b>diesmal den Wert <b>acFormEdit<\/b>. Au&szlig;erdem legen wir mit <b>WhereCondition <\/b>fest, welchen Datensatz das Formular anzeigen soll.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdBestellungAnzeigen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>lngAktuelleBestellungID<span style=\"color:blue;\"> As Long<\/span>\r\n     lngAktuelleBestellungID = Me!sfmBestellungenUebersicht.Form!ID\r\n     DoCmd.OpenForm \"frmBestellungDetails\", WindowMode:=acDialog, DataMode:=acFormEdit, WhereCondition:=\"ID = \" _\r\n         & lngAktuelleBestellungID\r\n     <span style=\"color:blue;\">If <\/span>IstFormularGeoeffnet(\"frmBestellungDetails\")<span style=\"color:blue;\"> Then<\/span>\r\n         DoCmd.Close acForm, \"frmBestellungDetails\"\r\n         Me!sfmBestellungenUebersicht.Form.Refresh\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: Code zum Anzeigen einer vorhandenen Bestellung<\/span><\/b><\/p>\n<p>Die Vorgehensweise, wenn der Benutzer das Formular mit der <b>OK<\/b>-Schaltfl&auml;che unsichtbar macht, sieht etwas anders aus. Wir pr&uuml;fen nur noch, ob es bereits geschlossen ist und holen dies gegebenenfalls nach. Au&szlig;erdem erneuern wir in diesem Fall die angezeigten Daten im Unterformular-Steuerelement mit der <b>Refresh<\/b>-Methode.<\/p>\n<p><b>Refresh <\/b>reicht in diesem Fall aus, da kein neuer Datensatz hinzugef&uuml;gt wurde, sondern maximal eine &Auml;nderung an einem Datensatz durchgef&uuml;hrt wurde, die auch direkt in der &Uuml;bersicht angezeigt werden soll.<\/p>\n<h2>Anzeigen der Details einer Bestellung per Doppelklick<\/h2>\n<p>Praktisch w&auml;re es auch, wenn der Benutzer eine Bestellung direkt per Doppelklick anzeigen k&ouml;nnte. Wir wollen nur die Spalte mit der Bestellnummer f&uuml;r diese Funktion vorsehen.<\/p>\n<p>Deshalb markieren wir in der Entwurfsansicht des Formulars das Feld <b>Bestellnummer <\/b>und legen f&uuml;r dessen Ereignis <b>Beim Doppelklicken <\/b>eine Ereignisprozedur an (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1384_003.png\" alt=\"Anlegen einer Ereignisprozedur f&uuml;r den Doppelklick auf die Bestellnummer\" width=\"599,559\" height=\"441,1848\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Anlegen einer Ereignisprozedur f&uuml;r den Doppelklick auf die Bestellnummer<\/span><\/b><\/p>\n<p>Die dadurch ausgel&ouml;ste Ereignisprozedur finden Sie in Listing 3. Sie arbeitet wie die zuvor beschriebene Ereignisprozedur, aber da sie f&uuml;r das Unterformular definiert wurde und nicht aus der Perspektive des Hauptformulars, kann sie leichter auf die ID des doppelt angeklickten Datensatzes zugreifen &#8211; und auch der Aufruf der Refresh-Methode erfolgt wesentlich einfacher.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Bestellnummer_DblClick(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>lngAktuelleBestellungID<span style=\"color:blue;\"> As Long<\/span>\r\n     lngAktuelleBestellungID = Me!ID\r\n     DoCmd.OpenForm \"frmBestellungDetails\", WindowMode:=acDialog, DataMode:=acFormEdit, WhereCondition:=\"ID = \" _\r\n         & lngAktuelleBestellungID\r\n     <span style=\"color:blue;\">If <\/span>IstFormularGeoeffnet(\"frmBestellungDetails\")<span style=\"color:blue;\"> Then<\/span>\r\n         DoCmd.Close acForm, \"frmBestellungDetails\"\r\n         Me.Refresh\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: Code zum Anzeigen einer vorhandenen Bestellung per Doppelklick auf die Bestellnummer im Unterformular<\/span><\/b><\/p>\n<h2>Anzeigen der Details eines Kunden<\/h2>\n<p>Nat&uuml;rlich k&ouml;nnte man diese Funktion auch in einem Formular mit einer Kunden&uuml;bersicht unterbringen, aber warum nicht auch direkt in der &Uuml;bersicht der Bestellungen? Vielleicht m&ouml;chten Sie nicht nur eine Bestellung betrachten, sondern gleich den Kundendatensatz mit allen Bestellungen, die der Kunde bis dato aufgegeben hat.<\/p>\n<p>Also f&uuml;gen wir dem Formular noch zwei M&ouml;glichkeiten hinzu, den Kundendatensatz zur aktuell markierten Bestellung zu &ouml;ffnen. Die erste ist eine Schaltfl&auml;che, die wir diesmal <b>cmdKundeAnzeigen <\/b>nennen. Diese Schaltfl&auml;che soll ein Formular namens <b>frmKundeDetails <\/b>&ouml;ffnen, das wir in einem weiteren Beitrag mit dem Titel <b>Rechnungsverwaltung: Kunden&uuml;bersicht <\/b>(<b>www.access-im-unternehmen.de\/****<\/b>) beschreiben.<\/p>\n<p>Die Schaltfl&auml;che <b>cmdKundeAnzeigen<\/b> l&ouml;st die Prozedur aus Listing 4 aus. Die Prozedur liest die <b>ID <\/b>des Kunden aus dem Fremdschl&uuml;sselfeld <b>KundeID <\/b>der markierten Bestellung ein und verwendet diese als Vergleichswert des Parameters <b>WhereCondition <\/b>beim &Ouml;ffnen des Formulars <b>frmKundeDetails<\/b>. Dort kann der Benutzer die gew&uuml;nschten &Auml;nderungen durchf&uuml;hren und die Bearbeitung mit der Schaltfl&auml;che <b>OK <\/b>abschlie&szlig;en. Eventuelle &Auml;nderungen werden dann mit der <b>Refresh<\/b>-Methode in das Feld <b>cboKundeID <\/b>des Unterformulars <b>sfmBestellungenUebersicht <\/b>&uuml;bernommen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdKundeAnzeigen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>lngAktuellerKundeID<span style=\"color:blue;\"> As Long<\/span>\r\n     lngAktuellerKundeID = Me!sfmBestellungenUebersicht.Form!cboKundeID\r\n     DoCmd.OpenForm \"frmKundeDetails\", WindowMode:=acDialog, DataMode:=acFormEdit, WhereCondition:=\"ID = \" _\r\n         & lngAktuellerKundeID\r\n     <span style=\"color:blue;\">If <\/span>IstFormularGeoeffnet(\"frmKundeDetails\")<span style=\"color:blue;\"> Then<\/span>\r\n         DoCmd.Close acForm, \"frmKundeDetails\"\r\n         Me!sfmBestellungenUebersicht.Form.Refresh\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 4: &Ouml;ffnen des Kunden der aktuell ausgew&auml;hlten Bestellung per Klick auf cmdKundeAnzeigen<\/span><\/b><\/p>\n<p>Die gleiche Funktion m&ouml;chten wir f&uuml;r einen Doppelklick auf das Steuerelement <b>cboKundeID <\/b>im Unterformular <b>sfmBestellungenUebersicht <\/b>abbilden. Dazu hinterlegen wir die Prozedur aus Listing 5 f&uuml;r das Ereignis <b>Beim Doppelklicken <\/b>dieses Steuerelements.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboKundeID_DblClick(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>lngAktuellerKundeID<span style=\"color:blue;\"> As Long<\/span>\r\n     lngAktuellerKundeID = Me!cboKundeID\r\n     DoCmd.OpenForm \"frmKundeDetails\", WindowMode:=acDialog, DataMode:=acFormEdit, WhereCondition:=\"ID = \" _\r\n         & lngAktuellerKundeID\r\n     <span style=\"color:blue;\">If <\/span>IstFormularGeoeffnet(\"frmKundeDetails\")<span style=\"color:blue;\"> Then<\/span>\r\n         DoCmd.Close acForm, \"frmKundeDetails\"\r\n         Me.Refresh\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 5: &Ouml;ffnen des Kunden der aktuell ausgew&auml;hlten Bestellung per Doppelklick auf den Kundennamen im Unterformular<\/span><\/b><\/p>\n<h2>L&ouml;schen einer Bestellung<\/h2>\n<p>Die Schaltfl&auml;che <b>cmdBestellungLoeschen <\/b>soll das L&ouml;schen einer Bestellung erm&ouml;glichen. Hier wird es spannend: Wir haben im Datenmodell angegeben, dass nur Bestellungen gel&ouml;scht werden k&ouml;nnen sollen, f&uuml;r die noch keine Datens&auml;tze in der verkn&uuml;pften Tabelle <b>tblBestellpositionen<\/b> angelegt wurden.<\/p>\n<p>Ein einfaches L&ouml;schen mit einer <b>DELETE<\/b>-Aktionsabfrage w&uuml;rde daher zu der Fehlermeldung aus Bild 4 f&uuml;hren.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1384_004.png\" alt=\"Fehler beim Versuch, eine Bestellung zu l&ouml;schen, die bereits Bestellpositionen enth&auml;lt\" width=\"599,559\" height=\"399,3836\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Fehler beim Versuch, eine Bestellung zu l&ouml;schen, die bereits Bestellpositionen enth&auml;lt<\/span><\/b><\/p>\n<p>Daher f&uuml;hren wir die Prozedur, die durch die Schaltfl&auml;che <b>cmdBestellungLoeschen<\/b> ausgef&uuml;hrt wird, wie in Listing 6 aus. Diese ermittelt zun&auml;chst die <b>ID <\/b>der zu l&ouml;schenden Bestellung und verwendet diese als Vergleichswert der nachfolgend ausgef&uuml;hrten <b>DELETE<\/b>-Aktionsabfrage. Vorher deaktivieren wir jedoch die eingebaute Fehlerbehandlung, um auf den oben erw&auml;hnten Fehler mit einer eigenen Meldung reagieren zu k&ouml;nnen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdBestellungLoeschen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>lngZuLoeschendeBestellungID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     lngZuLoeschendeBestellungID = Me!sfmBestellungenUebersicht.Form!ID\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     db.Execute \"DELETE FROM tblBestellungen WHERE ID = \" & lngZuLoeschendeBestellungID, dbFailOnError\r\n     <span style=\"color:blue;\">If <\/span>Err.Number = 3200<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Die Bestellung enth&auml;lt bereits Bestellpositionen. Bitte entfernen Sie diese nach Pr&uuml;fung und \" _\r\n             & \"l&ouml;schen Sie erst dann die Bestellung.\", vbOKOnly + vbInformation, \"L&ouml;schen nicht m&ouml;glich\"\r\n         DoCmd.OpenForm \"frmBestellungDetails\", WindowMode:=acDialog, DataMode:=acFormEdit, WhereCondition:=\"ID = \" _\r\n             & lngZuLoeschendeBestellungID\r\n         <span style=\"color:blue;\">If <\/span>IstFormularGeoeffnet(\"frmBestellungDetails\")<span style=\"color:blue;\"> Then<\/span>\r\n             DoCmd.Close acForm, \"frmBestellungDetails\"\r\n             Me!sfmBestellungenUebersicht.Form.Refresh\r\n             Me!sfmBestellungenUebersicht.Form.Recordset.FindFirst \"ID = \" & lngZuLoeschendeBestellungID\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me!sfmBestellungenUebersicht.Form.Requery\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 6: Code zum L&ouml;schen einer Bestellung<\/span><\/b><\/p>\n<p>Diese fordert den Benutzer auf, die Bestellpositionen zu sichten und gegebenenfalls manuell zu entfernen, bevor er einen neuen Anlauf zum L&ouml;schen des Bestelldatensatzes startet. Dazu &ouml;ffnen wir direkt das Formular <b>frmBe-stel-lung-Details <\/b>und zeigen den zu l&ouml;schenden Datensatz an. Nachdem der Benutzer dieses Formular mit <b>OK <\/b>ausgeblendet hat, schlie&szlig;t die Prozedur das Formular und aktualisiert die Bestell&uuml;bersicht. Dann markiert sie den zu l&ouml;schenden Datensatz erneut.<\/p>\n<p>Falls beim L&ouml;schen des Bestelldatensatzes kein Fehler aufgetreten ist, aktualisiert die Prozedur einfach noch die Bestell&uuml;bersicht im Unterformular.<\/p>\n<h2>&Auml;nderungen im Unterformular verhindern<\/h2>\n<p>Wir wollen au&szlig;erdem sicherstellen, dass der Benutzer direkt im Unterformular mit den Bestellungen keine Datens&auml;tze &auml;ndern kann. Das soll dem Formular <b>frmBestellungDetails <\/b>vorbehalten sein. Dazu ist nicht viel zu tun: Wir m&uuml;ssen einfach nur in der Entwurfsansicht das Unterformular <b>sfmBestellungenUebersicht <\/b>markieren und f&uuml;r dieses die Eigenschaften <b>Anf&uuml;gen zulassen<\/b>, <b>L&ouml;schen zulassen<\/b> und <b>Bearbeitungen zulassen <\/b>auf<b> Nein<\/b> einstellen (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1384_005.png\" alt=\"Sperren der Bearbeitung der Daten im Unterformular\" width=\"599,559\" height=\"415,2254\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Sperren der Bearbeitung der Daten im Unterformular<\/span><\/b><\/p>\n<h2>Steuerelemente anordnen<\/h2>\n<p>Bevor wir eine Suchfunktion f&uuml;r die Bestellungen hinzuf&uuml;gen, machen wir uns Gedanken &uuml;ber die Anordnung der Steuerelemente. Wenn wir die bisher angelegten vier Schaltfl&auml;che sowie die noch anzulegenden Steuerelemente zur Eingabe von Suchkriterien &uuml;ber dem Unterformular platzieren, wird es dort etwas un&uuml;bersichtlich.<\/p>\n<p>Also platzieren wir die Schaltfl&auml;chen unter dem Unterformular und legen die Steuerelemente f&uuml;r die Suchfunktion am aktuellen Ort der Schaltfl&auml;chen an. Vergessen Sie nicht, die Eigenschaft <b>Vertikaler Anker <\/b>f&uuml;r die Schaltfl&auml;chen auf <b>Unten <\/b>einzustellen, damit diese nach unten verschoben werden, wenn der Benutzer die H&ouml;he des Formulars vergr&ouml;&szlig;ert.<\/p>\n<h2>In Bestellungen suchen<\/h2>\n<p>Nun k&uuml;mmern wir uns um eines der wichtigsten Features: der Suchfunktion. Egal, ob man im Callcenter arbeitet und sich schnell den Datensatz des anrufenden Kunden holen oder ob man den Kunden zu einer Anfrage per E-Mail finden m&ouml;chte &#8211; eine Suchfunktion, welche die wichtigsten Kriterien abdeckt, ist unverzichtbar.<\/p>\n<p>Wir werden in den folgenden Abschnitten verschiedene Suchkriterien zur Suche hinzuf&uuml;gen. Wichtig ist dabei, dass wir vorher festlegen, wie die Suche funktionieren soll. Soll diese nach der Eingabe eines jeden Zeichens aktualisiert werden? Oder soll der Benutzer zum Anzeigen des Suchergebnisses eine <b>Suchen<\/b>-Schaltfl&auml;che bet&auml;tigen m&uuml;ssen? Werden alle Suchen per <b>AND <\/b>oder per <b>OR <\/b>verkn&uuml;pft? Wie sieht es mit Platzhaltern aus &#8211; sollen Suchbegriffe f&uuml;r Textfelder immer mit dem kompletten Inhalt vergleichen werden oder reicht es, wenn der Suchbegriff sich irgendwo im Textfeld befindet? Oder wenn der Inhalt des Textfeldes mit diesem Suchbegriff beginnt?<\/p>\n<p>Wir w&auml;hlen hier folgende Optionen:<\/p>\n<ul>\n<li>Die verwendeten Suchoptionen sollen mit dem Schl&uuml;sselwort <b>AND <\/b>verkn&uuml;pft werden.<\/li>\n<li>Die Suche soll durch das Bet&auml;tigen einer daf&uuml;r vorgesehenen Schaltfl&auml;che erfolgen. Allerdings soll das Bet&auml;tigen der Eingabetaste ebenfalls die Suchfunktion ausl&ouml;sen. Mehr dazu weiter unten.<\/li>\n<li>F&uuml;r Textfelder reicht es aus, wenn der Textfeldinhalt mit dem Suchbegriff beginnt, wir suchen also nach <b>[Suchbegriff]*<\/b>.<\/li>\n<\/ul>\n<h2>Suche nach der Bestellnummer<\/h2>\n<p>Das erste Textfeld zur Eingabe eines Suchkriteriums wollen wir f&uuml;r die Suche nach der Bestellnummer nutzen. Das Textfeld nennen wir <b>txtSucheBestellnummer<\/b>. Damit wir gleich damit arbeiten k&ouml;nnen, f&uuml;gen wir direkt daneben die Schaltfl&auml;che <b>cmdSuchen <\/b>ein.<\/p>\n<p>Um die Suche zu starten, soll der Benutzer entweder die <b>Suchen<\/b>-Schaltfl&auml;che oder die Eingabetaste bet&auml;tigen. Damit Letzteres die gleiche Prozedur wie die <b>Suchen<\/b>-Schaltfl&auml;che ausl&ouml;st, stellen wir die Eigenschaft <b>Standard <\/b>der Schaltfl&auml;che <b>cmdSuchen <\/b>auf den Wert <b>Ja <\/b>ein (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1384_006.png\" alt=\"Die Suchen-Schaltfl&auml;che samt Bet&auml;tigung per Eingabetaste\" width=\"624,559\" height=\"409,3907\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Die Suchen-Schaltfl&auml;che samt Bet&auml;tigung per Eingabetaste<\/span><\/b><\/p>\n<p>Die noch sehr einfache Suchfunktion finden Sie in Listing 7. Die Prozedur deklariert eine Variable, in der wir den Filter aus den verschiedenen Kriterien zusammenstellen. Dann pr&uuml;ft sie, ob das Feld <b>txtSucheBestellnummer <\/b>einen Wert enth&auml;lt.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdSuchen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>strFilter<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(Me!txtSucheBestellnummer)<span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = \"Bestellnummer LIKE ''\" & Me!txtSucheBestellnummer & \"*''\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">With<\/span> Me!sfmBestellungenUebersicht.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;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Suchen nach der Bestellnummer<\/span><\/b><\/p>\n<p>Ist das der Fall, schreibt sie einen Ausdruck wie <b>Bestellnummer LIKE &#8220;12345*&#8220; <\/b>in die Variable <b>strFilter<\/b>. Diese verwendet die Prozedur dann als Wert f&uuml;r die Eigenschaft <b>Filter <\/b>des Unterformulars. Das Einstellen der Eigenschaft <b>FilterOn <\/b>auf den Wert <b>True <\/b>aktiviert den Filter schlie&szlig;lich.<\/p>\n<p>Damit erhalten wir das Ergebnis aus Bild 7.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1384_007.png\" alt=\"Testen der Suche nach der Bestellnummer\" width=\"599,559\" height=\"302,6993\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Testen der Suche nach der Bestellnummer<\/span><\/b><\/p>\n<p>Diese Prozedur sollte auch direkt daf&uuml;r ausgelegt sein, das Leeren des Suchformulars und erneutes Bet&auml;tigen der <b>Suchen<\/b>-Schaltfl&auml;che mit der Anzeige der ungefilterten Liste aller Bestellungen zu quittieren. Da das Textfeld <b>txtSucheBestellnummer <\/b>dann leer ist, wird <b>strFilter <\/b>anschlie&szlig;end ebenfalls nicht gef&uuml;llt und die Eigenschaft <b>Filter <\/b>erh&auml;lt eine leere Zeichenkette als Wert. Das ist jedoch nicht der Fall: Fragen wir den Wert der Eigenschaft <b>Filter <\/b>direkt nach dem Zuweisen der leeren Zeichenkette ab, enth&auml;lt diese immer noch den zuvor gesetzten Filterausdruck.<\/p>\n<p>Da wir aktuell nicht ergr&uuml;nden k&ouml;nnen, warum dies nicht wie gew&uuml;nscht funktioniert, erweitern wir die Prozedur noch um eine <b>If&#8230;Then<\/b>-Bedingung, die pr&uuml;ft, ob &uuml;berhaupt ein Filterkriterium in <b>strFilter <\/b>enthalten ist, und gegebenenfalls der Eigenschaft <b>Filter <\/b>eine leere Zeichenkette zuweist:<\/p>\n<pre><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     <span style=\"color:blue;\">With<\/span> Me!sfmBestellungenUebersicht.Form\r\n     <span style=\"color:blue;\">Debug.Print<\/span> strFilter\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     <span style=\"color:blue;\">With<\/span> Me!sfmBestellungenUebersicht.Form\r\n         .Filter = \"\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Interessanterweise funktioniert es mit der direkten Zuweisung einer leeren Zeichenkette wie gew&uuml;nscht und das Unterformular zeigt nach Ausf&uuml;hren der Suche mit leerem Feld <b>txtSucheBestellnummer <\/b>wieder alle Datens&auml;tze an.<\/p>\n<h2>Suche nach der Kundennummer<\/h2>\n<p>Darauf bauen wir nun auf und erg&auml;nzen die Suche um ein Feld zur Eingabe einer Kundennummer. Das Textfeld hei&szlig;t <b>txtSucheKundennummer <\/b>und wir f&uuml;gen es direkt unter dem anderen Suchtextfeld ein. Wenn wir nach der Kundennummer suchen wollen, gelingt das allerdings nicht durch Zusammensetzen eines Ausdrucks wie dem folgenden:<\/p>\n<pre>Bestellnummer LIKE ''1100000*'' AND Kundennummer LIKE ''99000013*''<\/pre>\n<p>Das wird deutlich, wenn wir uns ansehen, aus welchen Tabellen die Daten dieser beiden Felder stammen (siehe Bild 8). Es w&auml;re ein wenig einfacher, wenn wir keine eigene Kundennummer in der Tabelle <b>tblKunden <\/b>pflegen w&uuml;rden, sondern das Prim&auml;rschl&uuml;sselfeld als Kundennummer verwenden w&uuml;rden &#8211; aber wir haben uns aus bestimmten Gr&uuml;nden f&uuml;r die Variante mit einem eigenen Feld f&uuml;r die Kundennummer entschieden, wie Sie dem Beitrag <b>Rechnungsverwaltung: Datenmodell <\/b>(<b>www.access-im-unternehmen.de\/****<\/b>) entnehmen k&ouml;nnen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1384_008.png\" alt=\"Die an der Suche beteiligten Tabellen\" width=\"424,5589\" height=\"391,4226\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Die an der Suche beteiligten Tabellen<\/span><\/b><\/p>\n<p>Hier m&uuml;ssen wir also nun die Suche nach dem Feld <b>Kundenummer <\/b>auf eine weitere Tabelle neben <b>tblBestellungen <\/b>erstrecken. Das ist aber kein Problem, wenn man ein wenig mit SQL jongliert. In unserem Fall f&uuml;gen wir ein Kriterium wie das folgende zusammen:<\/p>\n<pre>KundeID IN (SELECT ID FROM tblKunden WHERE Kundennummer LIKE ''99000013*'')<\/pre>\n<p>Wir ermitteln einfach in einer Unterabfrage die <b>ID<\/b> des Datensatzes der Tabelle <b>tblKunden<\/b>, der die angegebene Kundennummer enth&auml;lt, und ermitteln in der Hauptabfrage alle Datens&auml;tze, deren Feld <b>KundeID <\/b>den mit der Unterabfrage entsprechenden Werten im Feld <b>ID <\/b>der Tabelle <b>tblKunden <\/b>entspricht.<\/p>\n<p>In der Prozedur <b>cmdSuchen_Click <\/b>ergeben sich damit die &Auml;nderungen aus Listing 8. Die erste &Auml;nderung ist, dass wir nun mehrere Kriterien zusammensetzen, die in Abh&auml;ngigkeit davon vorhanden sind, ob der Benutzer einen Vergleichswert f&uuml;r das jeweilige Suchfeld, also <b>txtSucheBestellnummer <\/b>oder <b>txtSucheKundennummer<\/b>, eingegeben hat. Da diese Kriterien alle mit <b>AND <\/b>verkn&uuml;pft werden sollen, f&uuml;gen wir allen dieses Schl&uuml;sselwort voran &#8211; auch dem ersten, selbst wenn das jetzt noch keinen Sinn ergibt. Wozu das dient, sehen wir in der ersten Anweisung innerhalb der <b>If&#8230;Then<\/b>-Bedingung, wo wir von der Zeichenkette aus <b>strFilter <\/b>einfach mit der <b>Mid<\/b>-Funktion die ersten f&uuml;nf Zeichen abschneiden. Wir sparen uns also die Notwendigkeit der Pr&uuml;fung, ob der Filterausdruck vorn das Schl&uuml;sselwort <b>AND <\/b>enth&auml;lt.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdSuchen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>strFilter<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(Me!txtSucheBestellnummer)<span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = \" AND Bestellnummer LIKE ''\" & Me!txtSucheBestellnummer & \"*''\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(Me!txtSucheKundennummer)<span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = strFilter & \" AND KundeID IN (SELECT ID FROM tblKunden WHERE Kundennummer LIKE ''\" _\r\n             & Me!txtSucheKundennummer & \"*'')\"\r\n     <span style=\"color:blue;\">End If<\/span>\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;\">Debug.Print<\/span> strFilter\r\n         <span style=\"color:blue;\">With<\/span> Me!sfmBestellungenUebersicht.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         <span style=\"color:blue;\">With<\/span> Me!sfmBestellungenUebersicht.Form\r\n             .Filter = \"\"\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><b><span style=\"color:darkgrey;\">Listing 8: Suche nach Bestellnummer und Kundennummer<\/span><\/b><\/p>\n<p>Die zweite &Auml;nderung ist die Verarbeitung des neuen Kriteriums f&uuml;r die Kundennummer. Diese ist genauso aufgebaut wie das f&uuml;r die Bestellnummer, nur das wir wegen der Daten aus einer weiteren Tabelle einen etwas aufwendigeren Filterausdruck verwenden. Zur Kontrolle haben wir auch noch eine <b>Debug.Print<\/b>-Anweisung zur Ausgabe des Inhalts von <b>strFilter <\/b>eingef&uuml;gt, die Sie sp&auml;ter entfernen k&ouml;nnen.<\/p>\n<h2>Weitere Suchkriterien hinzuf&uuml;gen<\/h2>\n<p>Danach f&uuml;gen wir noch weitere Suchkriterien hinzu. Dabei handelt es sich um die Felder <b>Firma<\/b>, <b>Vorname<\/b>, <b>Nachname <\/b>und <b>EMail <\/b>der Tabelle <b>tblKunden <\/b>sowie das Feld <b>BestelltAm <\/b>der Tabelle <b>tblBestellungen<\/b> (siehe Bild 9). F&uuml;r letzteres sehen wir gleich zwei Steuerelemente f&uuml;r Vergleichskriterien vor, n&auml;mlich <b>txtBestelltVom <\/b>und <b>txtBestelltBis<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1384_009.png\" alt=\"Erweiterung der Suchkriterien\" width=\"549,559\" height=\"523,784\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Erweiterung der Suchkriterien<\/span><\/b><\/p>\n<p>W&auml;hrend die Vergleichskriterien f&uuml;r die erstgenannten Felder genauso aussehen wie die f&uuml;r das Feld <b>Kundennummer<\/b>, gibt es f&uuml;r das Filtern von Bestellungen nach dem Bestelldatum ein paar Neuerungen. Die erste ist, dass wir dem Benutzer die Eingabe des Datums soweit wie m&ouml;glich vereinfachen wollen &#8211; allein, um Fehleingaben zu vermeiden. Dazu sind f&uuml;r die beiden Textfelder <b>txtBe-stellt-Vom <\/b>und <b>txtBestelltBis <\/b>zwei Einstellungen n&ouml;tig:<\/p>\n<ul>\n<li>Die Eigenschaft <b>Format <\/b>erh&auml;lt den Wert <b>Datum, kurz <\/b>als Wert.<\/li>\n<li>Und f&uuml;r die Eigenschaft <b>Datumsauswahl anzeigen <\/b>stellen Sie sicher, dass diese den Wert <b>F&uuml;r Datumsangaben <\/b>enth&auml;lt.<\/li>\n<\/ul>\n<p>In der Folge zeigen die beiden Felder <b>txtBestellVom<\/b> und <b>txtBestelltBis <\/b>eine Schaltfl&auml;che zum &Ouml;ffnen eines Popups zur Datumsauswahl an, wenn diese aktiviert sind. Ein Klick auf diese &ouml;ffnet die Datumsauswahl aus Bild 10.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1384_010.png\" alt=\"Auswahl des Datums per Popup\" width=\"549,559\" height=\"358,0878\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Auswahl des Datums per Popup<\/span><\/b><\/p>\n<p>F&uuml;r die Gestaltung der Kriterien f&uuml;r die Datumseingabe sind ein paar Besonderheiten zu beachten.<\/p>\n<p>Als Erstes verwenden wir eine Hilfsfunktion namens <b>IsoDatum<\/b>, um das als Text eingegebene Datum aus den Feldern <b>txtBestelltVom<\/b> und <b>txtBestelltBis <\/b>in ein SQL-taugliches Datum umzuwandeln. Damit erhalten wir beispielsweise f&uuml;r die Parameter aus dem Screenshot das folgende Kriterium:<\/p>\n<pre>BestelltAm &gt;= #2022\/04\/16# AND BestelltAm &lt;= #2022\/04\/21#<\/pre>\n<p>Warum nicht kleiner oder gleich dem Datum aus dem Feld <b>txtBestelltBis<\/b>? Weil es sein kann, dass der Benutzer irgendwie eine Uhrzeit mit in das Datum schmuggelt. Und Datumsfelder speichern ihre Daten als ganze Zahlen f&uuml;r das Datum und Nachkommastellen f&uuml;r die Uhrzeit. Die Angabe <b>20.4.2022 12:00 Uhr <\/b>entspricht dann beispielsweise <b>44671,5<\/b>. Wenn wir das &uuml;ber dem Operator <b><= <\/b>mit dem <b>20.4.2022 <\/b>vergleichen, was der Zahl <b>44671 <\/b>entspricht, f&auml;llt diese Bestellung nicht mehr in den angegebenen Zeitraum hinein. Also addieren wir <b>1 <\/b>hinzu, sodass wir auch noch alle Datumsangaben erfassen, die unabh&auml;ngig von einer eventuell angegeben Uhrzeit in den angegebenen Zeitraum hineinpassen.<\/p>\n<p>Die Suchprozedur sieht nun in der fertigen Fassung wie in Listing 9 aus.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdSuchen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>strFilter<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(Me!txtSucheBestellnummer)<span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = \" AND Bestellnummer LIKE ''\" & Me!txtSucheBestellnummer & \"*''\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(Me!txtSucheKundennummer)<span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = strFilter & \" AND KundeID IN (SELECT ID FROM tblKunden WHERE Kundennummer LIKE ''\" _\r\n             & Me!txtSucheKundennummer & \"*'')\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(Me!txtSuchefirma)<span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = strFilter & \" AND KundeID IN (SELECT ID FROM tblKunden WHERE Firma LIKE ''\" & Me!txtSuchefirma _\r\n             & \"*'')\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(Me!txtSucheVorname)<span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = strFilter & \" AND KundeID IN (SELECT ID FROM tblKunden WHERE Vorname LIKE ''\" & Me!txtSucheVorname _\r\n             & \"*'')\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(Me!txtSucheNachname)<span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = strFilter & \" AND KundeID IN (SELECT ID FROM tblKunden WHERE Nachname LIKE ''\" _\r\n             & Me!txtSucheNachname & \"*'')\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(Me!txtSucheEMail)<span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = strFilter & \" AND KundeID IN (SELECT ID FROM tblKunden WHERE EMail LIKE ''\" _\r\n             & Me!txtSucheEMail & \"*'')\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Nz(Me!txtSucheBestelltVom, 0) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = strFilter & \" AND BestelltAm &gt;= \" & SQLDatum(Me!txtSucheBestelltVom)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Nz(Me!txtSucheBestelltBis, 0) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = strFilter & \" AND BestelltAm &lt;= \" & SQLDatum(Me!txtSucheBestelltBis + 1)\r\n     <span style=\"color:blue;\">End If<\/span>\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;\">Debug.Print<\/span> strFilter\r\n         <span style=\"color:blue;\">With<\/span> Me!sfmBestellungenUebersicht.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         <span style=\"color:blue;\">With<\/span> Me!sfmBestellungenUebersicht.Form\r\n             .Filter = \"\"\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><b><span style=\"color:darkgrey;\">Listing 9: Suche nach verschiedenen Kriterien<\/span><\/b><\/p>\n<h2>Schnelles Anpassen der Suche erm&ouml;glichen<\/h2>\n<p>Wir wollen die Suche noch ein wenig optimieren. Wenn der Benutzer beispielsweise einen Vergleichswert in das Feld <b>txtSucheBestellnummer <\/b>eintr&auml;gt und dann die Eingabetaste bet&auml;tigt, l&ouml;st dies automatisch die Suche nach dem angegebenen Wert aus. Daf&uuml;r haben wir durch Einstellen des Wertes <b>Standard <\/b>der Schaltfl&auml;che auf den Wert <b>Ja <\/b>gesorgt.<\/p>\n<p>Allerdings stellt dies auch den Fokus auf die Schaltfl&auml;che ein, genau so, wie es auch beim Bet&auml;tigen der Schaltfl&auml;che durch den Benutzer selbst der Fall gewesen w&auml;re.<\/p>\n<p>Wenn der Benutzer nun allerdings feststellt, dass er den Suchbegriff noch anpassen muss, weil dieser nicht die gew&uuml;nschten Daten liefert, muss er erst wieder den Fokus auf das Textfeld <b>txtBestellnummer <\/b>setzen, was kontraproduktiv ist.<\/p>\n<p>Es w&auml;re also praktisch, wenn wir nach dem Ausl&ouml;sen des Suchvorgangs noch den Fokus zur&uuml;ck auf das zuletzt bearbeitetete Suchfeld verschieben k&ouml;nnten.<\/p>\n<p>Das erledigen wir mit einer Erweiterung der Suchfunktion um einige Ereignisprozeduren. Die Idee ist, dass wir beim Bet&auml;tigen der Eingabetaste ein Ereignis ausl&ouml;sen, mit dem wir einen Timer von 100 Millisekunden starten. Danach sorgt das Bet&auml;tigen der Eingabetaste daf&uuml;r, dass die <b>Suchen<\/b>-Schaltfl&auml;che ausgel&ouml;st wird, die dann auch den Fokus erh&auml;lt. Nach Ablauf des Timers stellen wir den Fokus dann wieder zur&uuml;ck auf die Schaltfl&auml;che, die f&uuml;r das Ausl&ouml;sen der Suche verantwortlich war. Dazu m&uuml;ssen wir diese noch in der Prozedur, die durch das Bet&auml;tigen der Eingabetaste ausgel&ouml;st wurde, speichern &#8211; genauso wie optimalerweise die Position der Einf&uuml;gemarke und die Gr&ouml;&szlig;e der Markierung in dem zuletzt bearbeiteten Suchfeld. All das erledigen wir wie nachfolgend beschrieben.<\/p>\n<p>Als Erstes ben&ouml;tigen wir einige Variablen:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>strLetztesSuchfeld<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Private <\/span>lngSelLength<span style=\"color:blue;\"> As Long<\/span>\r\n<span style=\"color:blue;\">Private <\/span>lngSelStart<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Den Mechanismus wollen wir beim Bet&auml;tigen der Eingabetaste in allen Suchfeldern ausl&ouml;sen. Da wir den Inhalt parametrisieren k&ouml;nnen, legen wir f&uuml;r die eigentlichen Aufgaben eine eigene Prozedur an, die wie folgt aussieht:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Suchfeld_KeyDown(KeyCode<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Select Case KeyCode\r\n         <span style=\"color:blue;\">Case <\/span>vbKeyReturn\r\n             strLetztesSuchfeld = Screen.ActiveControl.Name\r\n             lngSelLength = Screen.ActiveControl.SelLength\r\n             lngSelStart = Screen.ActiveControl.SelStart\r\n             Me.TimerInterval = 100\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur schreibt den Namen des aktuellen Steuerelements sowie die L&auml;nge und die Startposition der Markierung im aktuellen Textfeld in die Variablen. Das alles geschieht nur, wenn der Benutzer die Eingabetaste bet&auml;tigt hat, was wir durch Abgleichen des Wertes des Parameters <b>KeyCode <\/b>mit der Konstanten <b>vbKeyReturn <\/b>erreichen. Au&szlig;erdem setzt die Prozedur einen Timer auf 100 Millisekunden. Warum das? Weil beim Bet&auml;tigen der Eingabetaste direkt nach dem Ereignis <b>Bei Taste ab <\/b>der Fokus auf die Schaltfl&auml;che <b>cmdSuchen <\/b>verschoben wird. Wir m&uuml;ssen also daf&uuml;r sorgen, dass der Fokus erst kurz danach zur&uuml;ck auf das ausl&ouml;sende Steuerelement verschoben wird.<\/p>\n<p>Das erledigen wir in der Ereignisprozedur, die durch das Ereignis <b>Bei Zeitgeber <\/b>ausgel&ouml;st wird. Diese pr&uuml;ft, ob <b>strLetztesSuchfeld<\/b> &uuml;berhaupt einen Wert enth&auml;lt. Falls ja, setzt es den Fokus auf das damit angegebene Steuerelement und stellt die gespeicherte Markierung mit den Eigenschaften <b>SelStart <\/b>und <b>SelLength <\/b>wieder her. Au&szlig;erdem leert es <b>strLetztesSuchfeld <\/b>und deaktiviert den Timer durch das Einstellen von <b>TimerInterval <\/b>auf den Wert <b>0<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Timer()\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strLetztesSuchfeld) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         Me(strLetztesSuchfeld).SetFocus\r\n         Me(strLetztesSuchfeld).SelStart = lngSelStart\r\n         Me(strLetztesSuchfeld).SelLength = lngSelLength\r\n         strLetztesSuchfeld = \"\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Me.TimerInterval = 0\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Nun fehlt noch der Aufruf der Prozedur <b>Suchfeld_KeyCode <\/b>beim Herunterdr&uuml;cken der Eingabetaste von einem der Suchfelder aus. Das realisieren wir f&uuml;r alle Suchfelder jeweils durch die Implementierung des Ereignisses <b>Bei Taste ab <\/b>&#8211; hier beispielsweise f&uuml;r das Suchfeld f&uuml;r die Bestellnummer:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtSucheBestellnummer_KeyDown(KeyCode<span style=\"color:blue;\"> As <\/span> Integer, Shift<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Suchfeld_KeyDown KeyCode\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Auf diese Weise kann der Benutzer beispielsweise die Zeichenfolge <b>110001 <\/b>in das Feld <b>txtSucheBestellnummer <\/b>eingeben, die Suche mit der Eingabetaste starten und dann direkt in diesem Feld das Suchkriterium anpassen, wenn das Ergebnis nicht wie gew&uuml;nscht aussieht.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Rechnungsbericht_Formulare.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/100D024B-88EE-4725-A28E-5D283D910E7A\/aiu_1384.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Beitrag &#8222;Rechnungsverwaltung: Bestellformular&#8220; (www.access-im-unternehmen.de\/1382) aus der kommenden Ausgabe 5\/2022 stellen wir ein Formular zur Eingabe neuer Bestellungen inklusive Bestellpositionen vor. Damit der Benutzer komfortabel auf bereits angelegte Bestellungen zugreifen und neue Bestellungen anlegen kann, stellen wir ihm ein &Uuml;bersichtsformular f&uuml;r die Bestellungen zur Seite. Wie Sie dieses erstellen, zeigen wir im vorliegenden Beitrag. Dabei wollen wir nicht nur die Bestellungen in der &Uuml;bersicht anzeigen, sondern auch M&ouml;glichkeiten zum Durchsuchen der Rechnungen sowie f&uuml;r die Anzeige der zuletzt verwendeten Rechnungen anbieten.<\/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,66042022,44000023],"tags":[],"class_list":["post-55001384","post","type-post","status-publish","format-standard","hentry","category-662022","category-66042022","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>Rechnungsverwaltung: Bestell&uuml;bersicht - 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_Bestelluebersicht\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Rechnungsverwaltung: Bestell&uuml;bersicht\" \/>\n<meta property=\"og:description\" content=\"Im Beitrag &quot;Rechnungsverwaltung: Bestellformular&quot; (www.access-im-unternehmen.de\/1382) aus der kommenden Ausgabe 5\/2022 stellen wir ein Formular zur Eingabe neuer Bestellungen inklusive Bestellpositionen vor. Damit der Benutzer komfortabel auf bereits angelegte Bestellungen zugreifen und neue Bestellungen anlegen kann, stellen wir ihm ein &Uuml;bersichtsformular f&uuml;r die Bestellungen zur Seite. Wie Sie dieses erstellen, zeigen wir im vorliegenden Beitrag. Dabei wollen wir nicht nur die Bestellungen in der &Uuml;bersicht anzeigen, sondern auch M&ouml;glichkeiten zum Durchsuchen der Rechnungen sowie f&uuml;r die Anzeige der zuletzt verwendeten Rechnungen anbieten.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Bestelluebersicht\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2022-08-04T18:15:06+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=\"20\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_Bestelluebersicht\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Bestelluebersicht\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Rechnungsverwaltung: Bestell&uuml;bersicht\",\"datePublished\":\"2022-08-04T18:15:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Bestelluebersicht\\\/\"},\"wordCount\":3432,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"articleSection\":[\"2022\",\"4\\\/2022\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Bestelluebersicht\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Bestelluebersicht\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Bestelluebersicht\\\/\",\"name\":\"Rechnungsverwaltung: Bestell&uuml;bersicht - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"datePublished\":\"2022-08-04T18:15:06+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Bestelluebersicht\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Bestelluebersicht\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Bestelluebersicht\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Rechnungsverwaltung: Bestell&uuml;bersicht\"}]},{\"@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: Bestell&uuml;bersicht - 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_Bestelluebersicht\/","og_locale":"de_DE","og_type":"article","og_title":"Rechnungsverwaltung: Bestell&uuml;bersicht","og_description":"Im Beitrag \"Rechnungsverwaltung: Bestellformular\" (www.access-im-unternehmen.de\/1382) aus der kommenden Ausgabe 5\/2022 stellen wir ein Formular zur Eingabe neuer Bestellungen inklusive Bestellpositionen vor. Damit der Benutzer komfortabel auf bereits angelegte Bestellungen zugreifen und neue Bestellungen anlegen kann, stellen wir ihm ein &Uuml;bersichtsformular f&uuml;r die Bestellungen zur Seite. Wie Sie dieses erstellen, zeigen wir im vorliegenden Beitrag. Dabei wollen wir nicht nur die Bestellungen in der &Uuml;bersicht anzeigen, sondern auch M&ouml;glichkeiten zum Durchsuchen der Rechnungen sowie f&uuml;r die Anzeige der zuletzt verwendeten Rechnungen anbieten.","og_url":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Bestelluebersicht\/","og_site_name":"Access im Unternehmen","article_published_time":"2022-08-04T18:15:06+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"20\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Bestelluebersicht\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Bestelluebersicht\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Rechnungsverwaltung: Bestell&uuml;bersicht","datePublished":"2022-08-04T18:15:06+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Bestelluebersicht\/"},"wordCount":3432,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"articleSection":["2022","4\/2022","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Bestelluebersicht\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Bestelluebersicht\/","url":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Bestelluebersicht\/","name":"Rechnungsverwaltung: Bestell&uuml;bersicht - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"datePublished":"2022-08-04T18:15:06+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Bestelluebersicht\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Bestelluebersicht\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Bestelluebersicht\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Rechnungsverwaltung: Bestell&uuml;bersicht"}]},{"@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\/55001384","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=55001384"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001384\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001384"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001384"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001384"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}