{"id":55001237,"date":"2020-06-01T00:00:00","date_gmt":"2020-07-10T09:41:15","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1237"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Bestellungen_mit_geloeschten_Produkten","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Bestellungen_mit_geloeschten_Produkten\/","title":{"rendered":"Bestellungen mit gel&ouml;schten Produkten"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/700015e1f41e4a2fba888f7cc9c0d1c8\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>In einer Bestellverwaltung verwalten Sie Kunden, Bestellungen und Bestellpositionen mit den jeweiligen Produkten. Gelegentlich werden Produkte aus dem Programm genommen. Das ist f&uuml;r neue Bestellungen kein Problem &#8211; die Auswahl des Produkts einer Bestellposition kann auf vorhandene Produkte beschr&auml;nkt werden. Aber wie gehen wir vor, wenn wir bereits ausgelieferte Bestellungen betrachten wollen, die Bestellpositionen mit Produkten enthalten, die nicht mehr im Programm sind Wie das gelingt, zeigen wir in diesem Beitrag.<\/b><\/p>\n<p><b>Datenmodell der Beispielanwendung<\/b><\/p>\n<p>Die Beispielanwendung zu diesem Beitrag enth&auml;lt die &uuml;blichen Tabellen einer Bestellverwaltung mit den mindestens notwendigen Feldern, deren Datenmodell Sie in Bild 1 sehen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_1237_001.png\" alt=\"Beziehungsfenster des Datenmodells der Beispieldatenbank\" width=\"700\" height=\"302,0598\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Beziehungsfenster des Datenmodells der Beispieldatenbank<\/span><\/b><\/p>\n<p>Interessant ist hier vor allem die Tabelle <b>tblProdukte<\/b>. Die Produkte werden in der Tabelle <b>tblBestellpositionen <\/b>zu einer Bestellung aus der Tabelle <b>tblBestellungen <\/b>hinzugef&uuml;gt. Hinzu kommen in der Tabelle <b>tblBestellpositionen <\/b>noch andere Felder, um die zum Zeitpunkt der Bestellung g&uuml;ltigen Werte f&uuml;r den Einzelpreis und den Mehrwertsteuersatz festzuhalten.<\/p>\n<p><b>Beispielformular zur Verwaltung von Bestellungen<\/b><\/p>\n<p>Das Zusammenstellen einer Bestellung erledigen wir im Formular <b>frmBestellungDetail<\/b>, das an die Tabelle <b>tblBestellungen <\/b>gebunden ist und alle Felder dieser Tabelle im Detailbereich anzeigt.<\/p>\n<p>Au&szlig;erdem enth&auml;lt es ein Unterformular namens <b>sfmBestellungDetail<\/b>. Dieses ist an die Tabelle <b>tblBestellpositionen <\/b>gebunden und zeigt die Felder <b>ProduktID<\/b>, <b>Einzelpreis<\/b>, <b>Mehrwertsteuersatz <\/b>und <b>Menge <\/b>in der Datenblattansicht an. Damit es immer die Bestellpositionen zu der im Hauptformular angezeigten Bestellung liefert, erh&auml;lt die Eigenschaft <b>Verkn&uuml;pfen von <\/b>des Unterformular-Steuerelements den Wert <b>BestellungID <\/b>und die Eigenschaft <b>Verkn&uuml;pfen nach <\/b>den Wert <b>ID<\/b>. Dies sieht im Entwurf wie in Bild 2 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_1237_002.png\" alt=\"Entwurf des Formulars frmBestellungDetail\" width=\"649,559\" height=\"472,3234\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Entwurf des Formulars frmBestellungDetail<\/span><\/b><\/p>\n<p>Wenn Sie in die Formularansicht wechseln, k&ouml;nnen Sie nach dem Anlegen eines Datensatzes in der Tabelle <b>tblBestellungen <\/b>&uuml;ber das Hauptformular damit beginnen, die Bestellpositionen hinzuzuf&uuml;gen.<\/p>\n<p>Dazu w&auml;hlen Sie einfach aus dem Kombinationsfeld <b>ProduktID <\/b>das gew&uuml;nschte Produkt aus (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_1237_003.png\" alt=\"Formularansicht des Formulars frmBestellungDetail\" width=\"649,559\" height=\"447,8091\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Formularansicht des Formulars frmBestellungDetail<\/span><\/b><\/p>\n<p>Damit die Werte f&uuml;r die Felder <b>Mehrwertsteuersatz <\/b>und <b>Einzelpreis <\/b>aus der Tabelle <b>tblProdukte <\/b>beziehungsweise <b>tblMehrwertsteuersaetze <\/b>entnommen und direkt in den neuen Datensatz der Tabelle <b>tblBestellpositionen <\/b>eingetragen werden, legen wir f&uuml;r das Ereignis <b>Nach Aktualisierung <\/b>des Kombinationsfeldes eine Ereignisprozedur an. Diese sieht wie in Listing 1 aus. Die Prozedur ermittelt per <b>DLookup<\/b>-Funktion den Einzelpreis f&uuml;r das hinzugef&uuml;gte Produkt aus der Tabelle <b>tblProdukte<\/b>. Danach liest sie, ebenfalls per <b>DLookup<\/b>, den Wert des Feldes <b>MehrwertsteuersatzID <\/b>der Tabelle <b>tblProdukte <\/b>ein. Da wir aber den Mehrwertsteuersatz in der Tabelle <b>tblBestellpositionen <\/b>nicht als Fremdschl&uuml;sselfeld auf einen Eintrag der Tabelle <b>tblMehrwertsteuersaetze <\/b>anlegen wollen, sondern den Prozentsatz speichern wollen, m&uuml;ssen wir diesen anschlie&szlig;end noch aus der Tabelle <b>tblMehrwertsteuersaetze <\/b>auslesen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ProduktID_AfterUpdate()\r\n     <span style=\"color:blue;\">Dim <\/span>lngMehrwertsteuersatzID<span style=\"color:blue;\"> As Long<\/span>\r\n     Me!Einzelpreis = DLookup(\"Einzelpreis\", \"tblProdukte\", \"ID = \" & Me!ProduktID)\r\n     lngMehrwertsteuersatzID = DLookup(\"MehrwertsteuersatzID\", \"tblProdukte\", \"ID = \" & Me!ProduktID)\r\n     Me!Mehrwertsteuersatz = DLookup(\"Mehrwertsteuersatz\", \"tblMehrwertsteuersaetze\", \"ID = \" & lngMehrwertsteuersatzID)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Einf&uuml;gen von Mehrwertsteuersatz und Einzelpreis nach dem Einf&uuml;gen einer Bestellposition<\/span><\/b><\/p>\n<p><b>Angezeigte Produkte einschr&auml;nken<\/b><\/p>\n<p>Nun wollen wir Produkte, die nicht mehr verf&uuml;gbar sind, nicht mehr im Kombinationsfeld des Unterformulars <b>sfmBestellungDetail <\/b>auflisten. Deshalb haben wir vorsorglich schon einmal ein Feld namens <b>Aktiv <\/b>in den Entwurf der Tabelle <b>tblProdukte <\/b>eingearbeitet (siehe Bild 4). Dieses stellen standardm&auml;&szlig;ig auf den Wert <b>Ja <\/b>ein, damit neu angelegte Produkte direkt als aktiviert markiert sind.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_1237_004.png\" alt=\"Entwurf der Tabelle tblProdukte mit dem Feld Aktiv\" width=\"599,593\" height=\"416,6954\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Entwurf der Tabelle tblProdukte mit dem Feld Aktiv<\/span><\/b><\/p>\n<p>F&uuml;r Produkte, die nicht mehr aktiv sein sollen, m&uuml;ssen wir dann manuell den Wert des Feldes <b>Aktiv<\/b> auf <b>Nein <\/b>einstellen (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_1237_005.png\" alt=\"Einstellen der Werte des Feldes Aktiv\" width=\"599,593\" height=\"288,6266\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Einstellen der Werte des Feldes Aktiv<\/span><\/b><\/p>\n<p>Damit k&ouml;nnen wir nun die Datensatzherkunft des Kombinationsfeldes anpassen. Der bereits vorhandenen Abfrage, die durch die &Uuml;bernahme der Konfiguration des Nachschlagefeldes der Tabelle <b>tblBestellpositionen <\/b>f&uuml;r das Kombinationsfeld angelegt wurde, f&uuml;gen wir das Feld <b>Aktiv <\/b>aus der Tabelle <b>tblProdukte <\/b>hinzu und legen daf&uuml;r als Kriterium den Vergleichswert <b>Wahr<\/b> fest (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_1237_006.png\" alt=\"Neue Datensatzherkunft f&uuml;r das Kombinationsfeld zur Auswahl des Produkts einer Bestellposition\" width=\"424,7115\" height=\"412,6827\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Neue Datensatzherkunft f&uuml;r das Kombinationsfeld zur Auswahl des Produkts einer Bestellposition<\/span><\/b><\/p>\n<p>Wenn Sie dann im Formular <b>frmBestellungDetail <\/b>in die Formularansicht wechseln, taucht ein als nicht mehr aktiv markierter Eintrag nicht mehr im Kombinationsfeld auf (siehe Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_1237_007.png\" alt=\"Das als nicht aktiv markierte Produkt taucht nicht mehr in der Liste auf.\" width=\"299,7964\" height=\"254,4691\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Das als nicht aktiv markierte Produkt taucht nicht mehr in der Liste auf.<\/span><\/b><\/p>\n<p>Wechseln Sie dann allerdings zu einem Datensatz, der das nicht mehr aktive Produkt bereits in einer Bestellposition enth&auml;lt, wird dieses nicht mehr im Kombinationsfeld im Unterformular angezeigt (siehe Bild 8).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_1237_008.png\" alt=\"Ist das nicht mehr aktive Produkt bereits in einer Bestellung vorhanden, wird es allerdings nicht mehr im Kombinationsfeld angezeigt.\" width=\"549,6265\" height=\"370,9382\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Ist das nicht mehr aktive Produkt bereits in einer Bestellung vorhanden, wird es allerdings nicht mehr im Kombinationsfeld angezeigt.<\/span><\/b><\/p>\n<p>Wir m&uuml;ssen uns also &uuml;berlegen, wie wir erkennen, ob gerade ein Datensatz im Formular <b>frmBestellungDetail <\/b>angezeigt wird, der bereits versendet ist, und in diesem Fall die Datensatzherkunft des Kombinationsfeldes zur Auswahl der Produkte anpasst.<\/p>\n<p>Das k&ouml;nnen wir beispielsweise erledigen, indem wir das Lieferdatum abfragen. Ist dieses leer, sollen nicht mehr aktive Produkte noch angezeigt werden.<\/p>\n<p>Anderenfalls ist die Bestellung noch nicht als geliefert markiert und es ist korrekt, wenn das Produkt nicht mehr ausw&auml;hlbar ist. Wir realisieren wir das<\/p>\n<p>Ganz einfach: Wir legen eine Ereignisprozedur an, die beim Wechseln des Datensatzes im Hauptformular ausgel&ouml;st wird und die den Wert des Feldes <b>Lieferdatum <\/b>ermittelt. Wenn das Feld <b>Lieferdatum <\/b>den Wert <b>Null <\/b>hat, sollen nur die aktiven Produkte angezeigt werden. Wenn das Feld <b>Lieferdatum <\/b>nicht <b>Null <\/b>ist, soll das Kombinationsfeld alle Produkte liefern (siehe Listing 2).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Current()\r\n     <span style=\"color:blue;\">Dim <\/span>strSQL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span>IsNull(Me!Lieferdatum)<span style=\"color:blue;\"> Then<\/span>\r\n         strSQL = \"SELECT ID, Bezeichnung, Aktiv FROM tblProdukte WHERE Aktiv=True\"\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         strSQL = \"SELECT ID, Bezeichnung, Aktiv FROM tblProdukte\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Me!sfmBestellDetail.Form.ProduktID.RowSource = strSQL\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Ein- und Ausblenden der nicht mehr aktiven Artikel aus der Datensatzherkunft des Kombinationsfeldes zur Auswahl der Produkte<\/span><\/b><\/p>\n<p>Wenn Sie es genau nehmen, m&uuml;ssen Sie auch f&uuml;r das Feld zur Eingabe des Lieferdatums eine Ereignisprozedur vorsehen, die nach der Aktualisierung des enthaltenen Wertes die Datensatzherkunft des Kombinationsfeldes aktualisiert.<\/p>\n<p>Also lagern wir die Anweisungen der Prozedur <b>Form_Current <\/b>in eine eigene Prozedur namens <b>Produkte-EinAusblenden <\/b>aus, die wie in Listing 3 aussieht. Die beiden Prozeduren, die durch das Ereignis <b>Beim Anzeigen <\/b>des Hauptformulars und durch das Ereignis <b>Nach Aktualisierung <\/b>des Textfeldes <b>Lieferdatum <\/b>ausgel&ouml;st werden, sehen so aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ProdukteEinAusblenden()\r\n     <span style=\"color:blue;\">Dim <\/span>strSQL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span>IsNull(Me!Lieferdatum)<span style=\"color:blue;\"> Then<\/span>\r\n         strSQL = \"SELECT ID, Bezeichnung, Aktiv FROM tblProdukte WHERE Aktiv=True\"\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         strSQL = \"SELECT ID, Bezeichnung, Aktiv FROM tblProdukte\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Me!sfmBestellDetail.Form.ProduktID.RowSource = strSQL\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Ausgelagerte Anweisungen zum Anpassen der Datensatzherkunft des Kombinationsfeldes zum Ausw&auml;hlen der Produkte<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Current()\r\n     ProdukteEinAusblenden\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>Lieferdatum_AfterUpdate()\r\n     ProdukteEinAusblenden\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Zwischenstand<\/b><\/p>\n<p>Damit haben wir nun folgendes erreicht: Wenn der Benutzer einen Bestelldatensatz anzeigt, dessen Lieferdatum bereits gesetzt ist, enth&auml;lt das Kombinationsfeld <b>Produkt-ID <\/b>noch die nicht aktiven Datens&auml;tze, sodass diese noch angezeigt werden k&ouml;nnen. <\/p>\n<p>Wenn er zu einem Datensatz wechselt, der eine noch nicht gelieferte Bestellung enth&auml;lt, werden nicht mehr aktive Produkte nicht mehr zur Auswahl im Kombinationsfeld angeboten.<\/p>\n<p>Was aber geschieht, wenn eine Bestellung angelegt wird, die ein Produkt enth&auml;lt, das vor dem Eintragen des Lieferdatums als inaktiv markiert wird Wenn die Bestellung nicht direkt nach dem Anlegen versendet wird, dann zeigt diese doch eine Bestellposition an, deren Produkte nicht mehr in der Datensatzherkunft des Kombinationsfeldes <b>ProduktID <\/b>enthalten ist.<\/p>\n<p><b>Pr&uuml;fen offener Bestellpositionen beim Deaktivieren von Produkten<\/b><\/p>\n<p>Die Annahme ist also, dass es offene Bestellpositionen gibt, die ein Produkt enthalten, dessen Zustand von <b>Aktiv <\/b>in <b>Inaktiv <\/b>gesetzt werden soll &#8211; beispielsweise, weil dieses Produkt nicht mehr lieferbar ist.<\/p>\n<p>In diesem Fall m&uuml;ssten wir das Einstellen des inaktiven Zustandes mit einer Pr&uuml;fung verbinden, ob es noch Bestellungen gibt, die dieses Produkt als Bestellposition enthalten.<\/p>\n<p>Dazu erstellen wir ein neues Formular namens <b>frmProdukte<\/b>, das ein Formular namens <b>sfmProdukte <\/b>als Unterformular verwendet. Dieses Formular nutzt die Tabelle <b>tblProdukte <\/b>als Datensatzquelle und zeigt alle Felder dieser Tabelle au&szlig;er Bild und Beschreibung an (siehe Bild 9).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_1237_009.png\" alt=\"Formular mit Unterformular zur Anzeige der Produktliste in der Entwurfsansicht\" width=\"499,6607\" height=\"325,4593\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Formular mit Unterformular zur Anzeige der Produktliste in der Entwurfsansicht<\/span><\/b><\/p>\n<p>Damit die Datens&auml;tze in der Datenblattansicht angezeigt werden, stellen wir die Eigenschaft <b>Standardansicht <\/b>des Unterformulars auf <b>Datenblatt <\/b>ein. F&uuml;r das Hauptformular stellen wir die Eigenschaften <b>Navigationsschaltfl&auml;chen<\/b>, <b>Datensatzmarkierer <\/b>und <b>Bildlaufleisten <\/b>auf <b>Nein <\/b>und <b>Automatisch zentrieren <\/b>auf <b>Ja <\/b>ein.<\/p>\n<p>Wechseln Sie in die Formularansicht, sieht das Formular wie in Bild 10 aus. Wenn der Benutzer nun den Wert des Feldes <b>Aktiv <\/b>von <b>Ja <\/b>in <b>Nein <\/b>&auml;ndert, soll eine Pr&uuml;fung erfolgen, ob es noch offene Bestellpositionen gibt, die dieses Produkt enthalten. Diese Bestellpositionen samt Bestellungen sollen dem Benutzer dann angezeigt werden, damit er diese Bestellungen bearbeiten und gegebenenfalls den Kunden informieren kann, dass nicht alle Bestellpositionen geliefert werden k&ouml;nnen. Wir entwickeln zun&auml;chst die Abfrage, um offene Bestellpositionen zu ermitteln, die das betroffene Produkt enthalten.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_1237_010.png\" alt=\"Liste der Produkte im Unterformular sfmProdukte des Formulars frmProdukte\" width=\"499,6607\" height=\"342,4545\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Liste der Produkte im Unterformular sfmProdukte des Formulars frmProdukte<\/span><\/b><\/p>\n<p><b>Abfrage, um offene Bestellungen mit einem bestimmten Produkt zu ermitteln<\/b><\/p>\n<p>Die Abfrage, mit der wie alle Bestellungen ermitteln wollen, die offene Positionen mit einem bestimmten Produkt enthalten, ben&ouml;tigt die Tabellen <b>tblBestellungen<\/b> und <b>tblBestellpositionen <\/b>als Datenquelle (siehe Bild 11). Die Tabelle <b>tblBestellungen <\/b>liefert das Feld <b>Lieferdatum<\/b>, das wir mit dem Wert <b>Null <\/b>als Vergleichswert des Kriteriums ausstatten, sowie das Prim&auml;rschl&uuml;sselfeld <b>ID<\/b>. Die Tabelle <b>tblBestellpositionen<\/b> liefert das Feld <b>ProduktID<\/b>, nach dem wir mit dem Parameter <b>prmProduktID <\/b>filtern wollen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_1237_011.png\" alt=\"Abfrage, die alle Bestellungen mit offenen Positionen eines bestimmten Produkts liefert\" width=\"549,6265\" height=\"415,9338\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Abfrage, die alle Bestellungen mit offenen Positionen eines bestimmten Produkts liefert<\/span><\/b><\/p>\n<p>Wenn Sie nun zur Datenblattansicht wechseln, erscheint ein Eingabefenster, das den Wert des Parameters <b>prmProduktID<\/b> abfragt. Gegen Sie hier den Wert eines Produkts ein, das noch in einer oder mehreren Bestellungen enthalten ist, die noch nicht ausgeliefert wurden und das in den inaktiven Status geschaltet werden soll, zeigt die Abfrage die entsprechenden Datens&auml;tze (siehe Bild 12).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_1237_012.png\" alt=\"Bestellungen mit offenen Positionen, die das Produkt mit der ID 8 enthalten\" width=\"549,6265\" height=\"250,6743\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Bestellungen mit offenen Positionen, die das Produkt mit der ID 8 enthalten<\/span><\/b><\/p>\n<p>Diese Abfrage bauen wir nun in die Ereignisprozedur ein, die beim &Auml;ndern des Wertes des Kontrollk&auml;stchens <b>Aktiv <\/b>im Formular <b>frmProdukte <\/b>ausgel&ouml;st wird (siehe Listing 4).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Aktiv_BeforeUpdate(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>qdf<span style=\"color:blue;\"> As <\/span>DAO.QueryDef\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>prm<span style=\"color:blue;\"> As <\/span>DAO.Parameter\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> qdf = db.QueryDefs(\"qryBestellungenMitOffenenBestellpositionen\")\r\n     qdf.Parameters(\"prmProduktID\") = Me!ID\r\n     <span style=\"color:blue;\">Set<\/span> rst = qdf.OpenRecordset(dbOpenSnapshot)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> rst.EOF<span style=\"color:blue;\"> Then<\/span>\r\n         rst.MoveLast\r\n         <span style=\"color:blue;\">MsgBox<\/span> rst.RecordCount & \" offene Bestellpositionen mit diesem Produkt!\"\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: Pr&uuml;fen, ob offene Bestellpositionen f&uuml;r ein Produkt vorliegen<\/span><\/b><\/p>\n<p>Diese soll zun&auml;chst einmal eine Meldung anzeigen, wenn es noch offene Bestellpositionen mit dem zu pr&uuml;fenden Produkt gibt. <\/p>\n<p>Hier erstellen wir zun&auml;chst ein <b>QueryDef<\/b>-Objekt auf Basis der Abfrage <b>qryBestellungenMitOffenenBestellpositionen<\/b>. Diesem weisen wir den Wert des Prim&auml;rschl&uuml;sselfeldes <b>ID <\/b>des zu &auml;ndernden Produkt-Datensatzes f&uuml;r den Parameter <b>prmProduktID <\/b>zu.<\/p>\n<p>Anschlie&szlig;end &ouml;ffnen wir ein Recordset auf Basis des <b>QueryDef<\/b>-Objekts und dem &uuml;bergebenen Parameterwert. Wenn das Recordset nicht leer ist, bewegen wir den Datensatzzeiger zum letzten Datensatz und geben eine Meldung aus, welche die Anzahl der noch offenen Bestellpositionen mit diesem Datensatz ausgibt (siehe Bild 13).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_1237_013.png\" alt=\"Meldung &uuml;ber noch offene Bestellungen mit dem zu deaktivierenden Produkt\" width=\"549,6265\" height=\"360,7485\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Meldung &uuml;ber noch offene Bestellungen mit dem zu deaktivierenden Produkt<\/span><\/b><\/p>\n<p>Diese Prozedur wollen wir nun so ausbauen, dass der Benutzer die M&ouml;glichkeit erh&auml;lt, die betroffenen Datens&auml;tze einzusehen, die Positionen zu ver&auml;ndern und erst dann den Status des Produkts auf inaktiv zu setzen (siehe Listing 5).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Aktiv_BeforeUpdate(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>qdf<span style=\"color:blue;\"> As <\/span>DAO.QueryDef\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>prm<span style=\"color:blue;\"> As <\/span>DAO.Parameter\r\n     <span style=\"color:blue;\">Dim <\/span>strBestellIDs<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span>Me!Aktiv = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n         <span style=\"color:blue;\">Set<\/span> qdf = db.QueryDefs(\"qryBestellungenMitOffenenBestellpositionen\")\r\n         qdf.Parameters(\"prmProduktID\") = Me!ID\r\n         <span style=\"color:blue;\">Set<\/span> rst = qdf.OpenRecordset(dbOpenSnapshot)\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> rst.EOF<span style=\"color:blue;\"> Then<\/span>\r\n             rst.MoveLast\r\n             <span style=\"color:blue;\">MsgBox<\/span> rst.RecordCount & \" offene Bestellpositionen mit diesem Produkt!\" & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n                  & \"Im folgenden Dialog finden Sie die Bestellungen mit offenen Bestellpositionen mit diesem Produkt.\"\r\n             rst.MoveFirst\r\n             <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n                 strBestellIDs = strBestellIDs & \", \" & rst!ID\r\n                 rst.Move<span style=\"color:blue;\">Next<\/span>\r\n             <span style=\"color:blue;\">Loop<\/span>\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strBestellIDs) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                 strBestellIDs = <span style=\"color:blue;\">Mid<\/span>(strBestellIDs, 3)\r\n                 DoCmd.OpenForm \"frmBestellungDetail\", WindowMode:=acDialog, WhereCondition:=\"ID IN(\" & strBestellIDs _\r\n                     & \")\", OpenArgs:=Me!ID\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;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Pr&uuml;fen, ob offene Bestellpositionen f&uuml;r ein Produkt vorliegen &#8211; erweiterte Version<\/span><\/b><\/p>\n<p>Dazu f&uuml;gen wir zuerst einmal eine wichtige <b>If&#8230;Then<\/b>-Bedingung hinzu, mit der wir pr&uuml;fen, ob der Benutzer den Wert des Felds <b>Aktiv <\/b>auf <b>Wahr <\/b>oder <b>Falsch <\/b>eingestellt hat. Wir wollen nur aktiv werden, wenn der Wert <b>Falsch <\/b>lautet. In diesem Fall f&uuml;hren wir zun&auml;chst die Schritte wie in der ersten Version durch. Die Meldung passen wir dann allerdings so an, dass sie den Benutzer darauf hinweist, dass im nun erscheinenden Formular die Bestellungen angezeigt werden, die noch nicht versendet sind und wo der Benutzer die Bestellung noch anpassen und gegebenenfalls den Kunden informieren muss.<\/p>\n<p>Wenn Bestellungen gefunden wurden, die das nicht mehr aktive Produkt enthalten, sorgt eine <b>DoCmd.OpenForm<\/b>-Anweisung daf&uuml;r, dass das Formular <b>frmBestellungDetail <\/b>ge&ouml;ffnet wird (siehe Bild 14). Dieses soll dann nach den Bestellungen gefiltert werden, die Bestellpositionen mit dem zu deaktivierenden Produkt enthalten. Als Bonbon soll das Unterformular auch noch direkt die betroffene Bestellposition markieren. F&uuml;r das Filtern des Hauptformulars &uuml;bergeben wir ein Kriterium mit dem Parameter <b>WhereCondition<\/b>. Um im Unterformular die betroffene Bestellposition zu markieren, &uuml;bergeben wir die ID des Produkts als &Ouml;ffnungsargument.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_1237_014.png\" alt=\"Anzeige der Bestellungen mit dem zu deaktivierenden Produkt\" width=\"599,593\" height=\"594,884\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Anzeige der Bestellungen mit dem zu deaktivierenden Produkt<\/span><\/b><\/p>\n<p><b>Anpassen des Bestellformulars f&uuml;r die Anzeige der deaktivierten Produkte<\/b><\/p>\n<p>Damit das Bestellformular nicht nur die per <b>WhereCondition <\/b>&uuml;bergebene Bedingung ber&uuml;cksichtigt, sondern auch im Unterformular das zu deaktivierende Produkt markiert, passen wir die Ereignisprozedur <b>Form_Current <\/b>des Formulars wie folgt an:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Current()\r\n     <span style=\"color:blue;\">Dim <\/span>lngProduktID<span style=\"color:blue;\"> As Long<\/span>\r\n     ProdukteEinAusblenden\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(Nz(Me.OpenArgs, \"\")) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         lngProduktID = Me.OpenArgs\r\n         Me!sfmBestellDetail.Form.Recordset.FindFirst  \"ProduktID = \" & lngProduktID\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Hier pr&uuml;fen wir, ob ein &Ouml;ffnungsargument &uuml;bergeben wurde, und markieren den entsprechenden Eintrag im Unterformular mit der <b>FindFirst<\/b>-Methode des <b>Recordset<\/b>-Objekts des Unterformulars.<\/p>\n<p>Der Benutzer kann dann hier das bestellte und nicht mehr aktive Produkt aus der Bestellung entfernen und gegebenenfalls den Kunden informieren, dass das Produkt nicht mehr lieferbar ist. Solche Aktionen k&ouml;nnte man auch noch automatisieren, indem man eine Schaltfl&auml;che zum Hauptformular hinzuf&uuml;gt, die eine entsprechende Mail in Outlook erzeugt.<\/p>\n<p><b>Deaktivieren von Produkten ohne Entfernen aus offenen Bestellungen<\/b><\/p>\n<p>Was passiert, wenn wir ein Produkt deaktivieren, das Formular <b>frmProdukte <\/b>daraufhin das Formular <b>frmBestelldetail <\/b>&ouml;ffnet, wir aber nicht die noch offenen Bestellpositionen mit diesem Produkt entfernen<\/p>\n<p>Wenn wir dann im Formular <b>frmProdukte <\/b>den noch nicht gespeicherten Datensatz speichern, ist das Produkt in der Tabelle <b>tblProdukte <\/b>mit dem Wert <b>Nein <\/b>im Feld <b>Aktiv <\/b>gekennzeichnet.<\/p>\n<p>&Ouml;ffnen wir nun das Formular <b>frmBestelldetail <\/b>und zeigen einen der Datens&auml;tze an, der in einer Bestellposition das bereits als nicht mehr aktiv gekennzeichnete Produkte enth&auml;lt, wird der Name des Produkts nicht mehr im Kombinationsfeld zur Auswahl des Produkts angezeigt (siehe Bild 15).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_1237_015.png\" alt=\"Leeres Produkt-Auswahlfeld\" width=\"549,6265\" height=\"370,1405\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 15: Leeres Produkt-Auswahlfeld<\/span><\/b><\/p>\n<p>Also m&uuml;ssen wir den vorherigen Vorgang doch etwas anpassen, und zwar so, dass der Benutzer den Wert des Feldes <b>Aktiv <\/b>erst auf <b>Nein <\/b>einstellen kann, wenn er alle Bestellpositionen aus noch offenen Bestellungen, welche das zu deaktivierende Produkte enthalten, auch aus den Bestellungen entfernt hat. Das erledigen wir durch eine Erweiterung der Prozedur <b>Aktiv_BeforeUpdate<\/b> (siehe Listing 6).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Aktiv_BeforeUpdate(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     ...\r\n     <span style=\"color:blue;\">If <\/span>Me!Aktiv = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         ...\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> rst.EOF<span style=\"color:blue;\"> Then<\/span>\r\n             ...\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strBestellIDs) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                 strBestellIDs = <span style=\"color:blue;\">Mid<\/span>(strBestellIDs, 3)\r\n                 DoCmd.OpenForm \"frmBestellungDetail\", WindowMode:=acDialog, WhereCondition:=\"ID IN(\" & strBestellIDs _\r\n                     & \")\", OpenArgs:=Me!ID\r\n                 <span style=\"color:blue;\">Set<\/span> rst = qdf.OpenRecordset(dbOpenSnapshot)\r\n                 rst.MoveLast\r\n                 <span style=\"color:blue;\">If <\/span>rst.RecordCount &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                     <span style=\"color:blue;\">MsgBox<\/span> \"Es sind noch offene Bestellungen vorhanden, welche dieses Produkt als Bestellposition \" _\r\n                         & \"enthalten.\" & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span> & \"Das Produkt wird nicht als nicht aktiv markiert.\", _\r\n                         <span style=\"color:blue;\">vbCr<\/span>itical + vbOKOnly\r\n                     Cancel = <span style=\"color:blue;\">True<\/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 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 6: Erweiterung um Pr&uuml;fung, ob alle Bestellpositionen offener Bestellungen mit dem zu deaktivierenden Produkt gel&ouml;scht sind<\/span><\/b><\/p>\n<p>Das Formular <b>frmBestellungDetail <\/b>&ouml;ffnen wir in dieser Prozedur als modalen Dialog. Das hei&szlig;t, dass der aufrufende Code erst nach dem Schlie&szlig;en des Formulars fortgesetzt wird. Das ist perfekt f&uuml;r unsere Zwecke, denn so k&ouml;nnen wir abwarten, bis der Benutzer das Formular geschlossen hat.<\/p>\n<p>Dann pr&uuml;fen wir, ob der Benutzer alle Bestellpositionen mit dem nicht mehr aktiven Produkt gel&ouml;scht hat. Dazu erstellen wir erneut das bereits weiter oben verwendete Recordset mit den offenen Bestellpositionen und ermitteln mit der <b>RecordCount<\/b>-Eigenschaft die Anzahl der gesuchten Bestellpositionen.<\/p>\n<p>Ist diese gr&ouml;&szlig;er als <b>0<\/b>, erscheint die Meldung aus Bild 16. Und noch wichtiger: Die Prozedur stellt dann den R&uuml;ckgabeparameter <b>Cancel <\/b>auf den Wert <b>True <\/b>ein, was dazu f&uuml;hrt, dass die Aktualisierung des Datensatzes abgebrochen wird. Der Benutzer kann dann erneut das Feld <b>Aktiv <\/b>auf <b>Nein <\/b>einstellen und nochmal die noch offenen Bestellpositionen mit diesem Produkt entfernen. Erst wenn die Anzahl der offenen Bestellpositionen mit diesen Produkten gleich <b>0 <\/b>ist, wird die &Auml;nderung im Datensatz auch gespeichert. Damit ist sichergestellt, dass es keine offenen Bestellungen mehr gibt, in denen nicht aktive Produkte angezeigt werden. Neu ausw&auml;hlen kann der Benutzer diese auch nicht, da nicht aktive Produkte nicht mehr im Auswahlfeld angeboten werden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_03\/pic_1237_016.png\" alt=\"Meldung beim Versuch, ein Produkt zu deaktivieren, f&uuml;r das es auch nach der M&ouml;glichkeit, diese zu entfernen, noch Bestellpositionen gibt.\" width=\"549,6265\" height=\"385,5715\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 16: Meldung beim Versuch, ein Produkt zu deaktivieren, f&uuml;r das es auch nach der M&ouml;glichkeit, diese zu entfernen, noch Bestellpositionen gibt.<\/span><\/b><\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Damit haben wir eine Funktion in eine Bestellverwaltung implementiert, die daf&uuml;r sorgt, dass nicht mehr aktive Produkte noch in abgeschlossenen Bestellungen aufgef&uuml;hrt werden k&ouml;nnen, aber nicht mehr in neuen Bestellungen zur Auswahl stehen.<\/p>\n<p>Offen ist noch die Programmierung einer M&ouml;glichkeit, die Kunden direkt &uuml;ber das Entfernen von nicht mehr lieferbaren Produkten per E-Mail zu informieren.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>BestellungenMitGeloeschtenArtikeln.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/9033EF77-F89B-4551-8134-2744C5690165\/aiu_1237.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In einer Bestellverwaltung verwalten Sie Kunden, Bestellungen und Bestellpositionen mit den jeweiligen Produkten. Gelegentlich werden Produkte aus dem Programm genommen. Das ist f&uuml;r neue Bestellungen kein Problem &#8211; die Auswahl des Produkts einer Bestellposition kann auf vorhandene Produkte beschr&auml;nkt werden. Aber wie gehen wir vor, wenn wir bereits ausgelieferte Bestellungen betrachten wollen, die Bestellpositionen mit Produkten enthalten, die nicht mehr im Programm sind Wie das gelingt, zeigen wir in diesem Beitrag.<\/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":[662020,66032020,44000023],"tags":[],"class_list":["post-55001237","post","type-post","status-publish","format-standard","hentry","category-662020","category-66032020","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>Bestellungen mit gel&ouml;schten Produkten - 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\/Bestellungen_mit_geloeschten_Produkten\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Bestellungen mit gel&ouml;schten Produkten\" \/>\n<meta property=\"og:description\" content=\"In einer Bestellverwaltung verwalten Sie Kunden, Bestellungen und Bestellpositionen mit den jeweiligen Produkten. Gelegentlich werden Produkte aus dem Programm genommen. Das ist f&uuml;r neue Bestellungen kein Problem - die Auswahl des Produkts einer Bestellposition kann auf vorhandene Produkte beschr&auml;nkt werden. Aber wie gehen wir vor, wenn wir bereits ausgelieferte Bestellungen betrachten wollen, die Bestellpositionen mit Produkten enthalten, die nicht mehr im Programm sind Wie das gelingt, zeigen wir in diesem Beitrag.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Bestellungen_mit_geloeschten_Produkten\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-07-10T09:41:15+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/700015e1f41e4a2fba888f7cc9c0d1c8\" \/>\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=\"15\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bestellungen_mit_geloeschten_Produkten\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bestellungen_mit_geloeschten_Produkten\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Bestellungen mit gel&ouml;schten Produkten\",\"datePublished\":\"2020-07-10T09:41:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bestellungen_mit_geloeschten_Produkten\\\/\"},\"wordCount\":2589,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bestellungen_mit_geloeschten_Produkten\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/700015e1f41e4a2fba888f7cc9c0d1c8\",\"articleSection\":[\"2020\",\"3\\\/2020\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Bestellungen_mit_geloeschten_Produkten\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bestellungen_mit_geloeschten_Produkten\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bestellungen_mit_geloeschten_Produkten\\\/\",\"name\":\"Bestellungen mit gel&ouml;schten Produkten - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bestellungen_mit_geloeschten_Produkten\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bestellungen_mit_geloeschten_Produkten\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/700015e1f41e4a2fba888f7cc9c0d1c8\",\"datePublished\":\"2020-07-10T09:41:15+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bestellungen_mit_geloeschten_Produkten\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Bestellungen_mit_geloeschten_Produkten\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bestellungen_mit_geloeschten_Produkten\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/700015e1f41e4a2fba888f7cc9c0d1c8\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/700015e1f41e4a2fba888f7cc9c0d1c8\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Bestellungen_mit_geloeschten_Produkten\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bestellungen mit gel&ouml;schten Produkten\"}]},{\"@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":"Bestellungen mit gel&ouml;schten Produkten - 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\/Bestellungen_mit_geloeschten_Produkten\/","og_locale":"de_DE","og_type":"article","og_title":"Bestellungen mit gel&ouml;schten Produkten","og_description":"In einer Bestellverwaltung verwalten Sie Kunden, Bestellungen und Bestellpositionen mit den jeweiligen Produkten. Gelegentlich werden Produkte aus dem Programm genommen. Das ist f&uuml;r neue Bestellungen kein Problem - die Auswahl des Produkts einer Bestellposition kann auf vorhandene Produkte beschr&auml;nkt werden. Aber wie gehen wir vor, wenn wir bereits ausgelieferte Bestellungen betrachten wollen, die Bestellpositionen mit Produkten enthalten, die nicht mehr im Programm sind Wie das gelingt, zeigen wir in diesem Beitrag.","og_url":"https:\/\/access-im-unternehmen.de\/Bestellungen_mit_geloeschten_Produkten\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-07-10T09:41:15+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/700015e1f41e4a2fba888f7cc9c0d1c8","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"15\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Bestellungen_mit_geloeschten_Produkten\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Bestellungen_mit_geloeschten_Produkten\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Bestellungen mit gel&ouml;schten Produkten","datePublished":"2020-07-10T09:41:15+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Bestellungen_mit_geloeschten_Produkten\/"},"wordCount":2589,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Bestellungen_mit_geloeschten_Produkten\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/700015e1f41e4a2fba888f7cc9c0d1c8","articleSection":["2020","3\/2020","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Bestellungen_mit_geloeschten_Produkten\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Bestellungen_mit_geloeschten_Produkten\/","url":"https:\/\/access-im-unternehmen.de\/Bestellungen_mit_geloeschten_Produkten\/","name":"Bestellungen mit gel&ouml;schten Produkten - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Bestellungen_mit_geloeschten_Produkten\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Bestellungen_mit_geloeschten_Produkten\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/700015e1f41e4a2fba888f7cc9c0d1c8","datePublished":"2020-07-10T09:41:15+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Bestellungen_mit_geloeschten_Produkten\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Bestellungen_mit_geloeschten_Produkten\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Bestellungen_mit_geloeschten_Produkten\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/700015e1f41e4a2fba888f7cc9c0d1c8","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/700015e1f41e4a2fba888f7cc9c0d1c8"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Bestellungen_mit_geloeschten_Produkten\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Bestellungen mit gel&ouml;schten Produkten"}]},{"@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\/55001237","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=55001237"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001237\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001237"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001237"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001237"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}