{"id":55001567,"date":"2025-10-01T00:00:00","date_gmt":"2025-12-18T07:31:32","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1567"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Verpackungsprozesse_mit_Access_Formulare","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Verpackungsprozesse_mit_Access_Formulare\/","title":{"rendered":"Verpackungsprozesse mit Access: Formulare"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg01.met.vgwort.de\/na\/1d54b9bc153e4ee3aa6719bc3a41b108\" width=\"1\" height=\"1\" alt=\"\"><b>Ein Kunde hatte neulich die Herausforderung, dass er Produkte bestehend aus einzelnen Bauteilen ausliefern m&ouml;chte und dabei erfassen muss, welche Bauteile in welcher Menge in den verschiedenen Versandkartons landen. Der Verpackungsvorgang im Lager erfolgt individuell und in einer Weise, dass die Mitarbeiter die einzelnen Bauteile so in Kartons f&uuml;llen, dass die Kartons optimal genutzt werden. W&auml;hrend des Verpackens sollen sie aufzeichnen, welcher Karton welche Bauteile enth&auml;lt, damit diese beim Empf&auml;nger so ausgepackt werden k&ouml;nnen, wie die Bauteile ben&ouml;tigt werden. In diesem Beitrag beschreiben wir zun&auml;chst, wie das Datenmodell f&uuml;r dieses Vorhaben aussieht und erstellen basierend darauf die notwendigen Formulare. Schlie&szlig;lich geben wir auch noch die St&uuml;cklisten f&uuml;r die verschiedenen Kartons per Bericht aus.<\/b><\/p>\n<h2>Bestellungen eingeben<\/h2>\n<p>Die Grundlage f&uuml;r diese L&ouml;sung sind Bestellungen. Diese bearbeiten wir in dem einfachen Formular aus Bild 1. Hier k&ouml;nnen wir im Hauptformular den Kunden ausw&auml;hlen und das Bestelldatum eingeben.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_1567_002.png\" alt=\"Einfaches Bestellformular\" width=\"549,559\" height=\"341,0706\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Einfaches Bestellformular<\/span><\/b><\/p>\n<p>Au&szlig;erdem w&auml;hlen wir im Unterformular die Produkte aus, die dieser Bestellung zugeordnet werden sollen und f&uuml;gen die gew&uuml;nschte Menge hinzu.<\/p>\n<p>Um Preise und andere Informationen k&uuml;mmern wir uns in diesem Fall aus Gr&uuml;nden der &Uuml;bersichtlichkeit nicht.<\/p>\n<p>Wenn eine Bestellung eingegeben wurde, k&ouml;nnen wir mit dem Button <b>Verpacken <\/b>zum n&auml;chsten Formular wechseln, dass die eigentliche Funktion dieses Beitrags abbildet.<\/p>\n<p>Vorab noch die Information, dass jedes Produkt aus verschiedenen Bauteilen in unterschiedlicher Menge besteht, die im Hintergrund in Tabellen gespeichert sind.<\/p>\n<p>Auf die genauen Zusammenh&auml;nge im Datenmodell gehen wir sp&auml;ter ein.<\/p>\n<h2>Erfassung der verpackten Bauteile<\/h2>\n<p>Das Formular <b>frmVerpackung <\/b>ist das eigentliche Arbeitstier (siehe Bild 2). Hier sehen wir verschiedene Bereiche:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_1567_003.png\" alt=\"Formular zum Protokollieren der Verpackung\" width=\"699,559\" height=\"540,8705\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Formular zum Protokollieren der Verpackung<\/span><\/b><\/p>\n<ul>\n<li>Ganz oben finden wir nochmal die Daten zu der jeweiligen Bestellung.<\/li>\n<li>Darunter sehen wir die einzelnen Positionen der Bestellung, also die Produkte.<\/li>\n<li>Das Listenfeld links unten zeigt die Bauteile, die zu den Produkten dieser Bestellung geh&ouml;ren. Wenn das Formular ge&ouml;ffnet wird, zeigt diese Liste zun&auml;chst die Bauteile f&uuml;r alle Produkte der Bestellung an. Wenn wir jedoch auf eines der Produkte im Listenfeld dar&uuml;ber klicken, werden nur noch die Bauteile zu diesem Produkt angezeigt. Au&szlig;erdem sehen wir dort die gesamte Menge des jeweiligen Bauteils, die Anzahl der gepackten Exemplare und die Restmenge, also die nicht gepackten Bauteile.<\/li>\n<li>Rechts finden wir Steuerelemente, mit denen wir einen Beh&auml;ltertyp ausw&auml;hlen und diesen zur aktuellen Bestellung hinzuf&uuml;gen k&ouml;nnen. Wir w&auml;hlen einen Beh&auml;lter aus und klicken auf <b>Beh&auml;lter hinzuf&uuml;gen<\/b>, um diesen der Bestellung zuzuordnen. Dabei k&ouml;nnen wir dem Beh&auml;lter noch einen individuellen Namen zuweisen (siehe Bild 3). Der angelegte Beh&auml;lter landet schlie&szlig;lich im Listenfeld der Beh&auml;lter zu dieser Bestellung. Au&szlig;erdem k&ouml;nnen wir mit der Schaltfl&auml;che <b>Beh&auml;lter l&ouml;schen <\/b>auch den aktuell markierten Beh&auml;lter l&ouml;schen.<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_1567_004.png\" alt=\"Anlegen von Beh&auml;ltern\" width=\"424,5589\" height=\"354,5175\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Anlegen von Beh&auml;ltern<\/span><\/b><\/p>\n<li>Unten rechts sehen wir die dem jeweiligen Beh&auml;lter zugeordneten Bauteile. Die Zuordnung erfolgt &uuml;ber die Pfeil-Schaltfl&auml;chen. Mit dem einfachen Pfeil nach rechts ordnen wir ein St&uuml;ck des aktuell markierten Bauteils zum aktiven Beh&auml;lter zu. Mit dem doppelten Pfeil weisen wir dem Beh&auml;lter alle verbleibenden Bauteile zu.<\/li>\n<li>Mit dem einfachen und dem doppelten Pfeil nachh links k&ouml;nnen wir ein Bauteil oder alle Bauteile aus der Liste <b>Inhalt <\/b>entfernen.<\/li>\n<li>Wenn wir Ver&auml;nderungen am Inhalt eines Beh&auml;lters vornehmen, wird die dortige Menge angepasst. Au&szlig;erdem wird auch die Liste <b>Bauteile <\/b>aktualisiert. Wenn wir beispielsweise ein Bauteil zu den gepackten Bauteilen hinzuf&uuml;gen, wird der Wert in der Spalte <b>Gepackt <\/b>um <b>1 <\/b>erh&ouml;ht und die <b>Restmenge <\/b>um <b>1 <\/b>vermindert.<\/li>\n<\/ul>\n<p>Auf diese Weise sieht der Mitarbeiter genau, wie viele Exemplare eines Bauteils noch gepackt werden m&uuml;ssen.<\/p>\n<p>Nach dem Packen eines oder mehrerer Bauteile in einen Beh&auml;lter braucht der Mitarbeiter nur das entsprechende Bauteil in der Liste <b>Bauteile <\/b>zu markieren und entweder entsprechend der Menge der gepackten Bauteile mehrfach auf die Schaltfl&auml;che mit den einfachen Pfeil nach rechts zu klicken, oder er packt alle Exemplare eines Bauteils in einen Beh&auml;lter und klickt direkt auf die Schaltfl&auml;che mit den zwei Pfeilen.<\/p>\n<p>Auch wenn er bereits ein einzelnes Bauteil von mehreren mit einem Klick auf die Schaltfl&auml;che mit dem einfachen Pfeil zu einem Beh&auml;lter hinzugef&uuml;gt hat, kann er alle verbleibenden mit einem Klick auf die Schaltfl&auml;che mit dem doppelten Pfeil dem aktuell gew&auml;hlten Beh&auml;lter zuordnen.<\/p>\n<h2>Datenmodell der Anwendung<\/h2>\n<p>Bevor wir in die Programmierung des Formulars einsteigen, wollen wir uns kurz das Datenmodell ansehen (siehe Bild 4). Die Tabellen, die mit dem Formular <b>frmBestellungen <\/b>verwaltet werden, hei&szlig;en <b>tblKunden<\/b>, <b>tblBestellungen <\/b>und <b>tblBestellungProdukte<\/b>. <\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_1567_001.png\" alt=\"Datenmodell der Anwendung\" width=\"700\" height=\"320,6896\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Datenmodell der Anwendung<\/span><\/b><\/p>\n<p>Daneben gibt es noch weitere Stammdaten. Die Tabelle <b>tblBauteile <\/b>enth&auml;lt alle Bauteile, die &uuml;ber die Tabelle <b>tblProdukteBauteile <\/b>dem jeweiligen Produkt zugewiesen werden. Das Feld <b>Menge <\/b>dieser Tabelle gibt an, wie viele Exemplare eines Bauteils zu einem Produkt geh&ouml;ren.<\/p>\n<p>Genau so, wie wir den Produktnamen bei Ausw&auml;hlen einer Bestellung in die Tabelle <b>tblBestellungProdukte <\/b>schreiben, um diese unabh&auml;ngig von den sich gegebenenfalls &auml;ndernden Stammdaten zu machen, wollen wir auch die Bauteile zu jeder Bestellposition in einer eigenen Tabelle historisieren.<\/p>\n<p>Dazu verwenden wir die Tabelle <b>tblBestellungProdukteBauteile<\/b>. Sie ist einerseits mit der Tabelle <b>tblBestellungProdukte <\/b>verkn&uuml;pft und andererseits mit der Tabelle <b>tblBauteile<\/b>. Damit halten wir fest, woher die Bauteile urspr&uuml;nglich stammen. In den Feldern <b>Bauteilname<\/b>, <b>Menge <\/b>und <b>Gewicht <\/b>speichern wir die Eigenschaften zum Zeitpunkt dieser Bestellung. Die Menge wird berechnet aus dem Produkt des Feldes <b>Menge <\/b>der Tabelle <b>tblBestellungProdukte <\/b>und dem gleichnamigen Feld der Tabelle <b>tblProdukteBauteile<\/b>.<\/p>\n<p>Damit kommen wir zu einem weiteren Teil des Datenmodells, der die Zuordnung der Bauteile einer Bestellung zu den daf&uuml;r angelegten Beh&auml;ltern speichert. Die Beh&auml;lter werden in der Tabelle <b>tblBehaelter <\/b>angelegt. Hier k&ouml;nnen wir &uuml;ber das Feld <b>BehaeltertypID <\/b>den Typ des Beh&auml;lters aus der Tabelle <b>tblBehaeltertypen <\/b>ausw&auml;hlen. Jeder Beh&auml;lter wird au&szlig;erdem noch der jeweiligen Bestellung zugeordnet.<\/p>\n<p>Die Tabelle <b>tblBestellungBauteileBehaelter <\/b>schlie&szlig;lich speichert, wie viele Exemplare eines Bauteils eines Produkts in einem der Beh&auml;lter gespeichert sind.<\/p>\n<h2>L&ouml;schweitergaben im Datenmodell<\/h2>\n<p>Wir haben bei den meisten mit referenzieller Integrit&auml;t definierten Beziehungen auch die L&ouml;schweitergabe aktiviert. So werden beispielsweise beim L&ouml;schen von Bestellungen auch automatisch die damit verkn&uuml;pften Produkte, Bauteile et cetera gel&ouml;scht. Auch beim L&ouml;schen von Beh&auml;ltern sollen die Zuordnungen von Bauteilen gel&ouml;scht werden.<\/p>\n<h2>Programmierung des Formulars frmBestellungen<\/h2>\n<p>Wenn der Benutzer im Formular <b>frmBestellungen <\/b>ein Produkt im Unterformular ausw&auml;hlt, wird der Name des Produkts in das Feld <b>Produktname <\/b>der Tabelle <b>tblBestellungProdukte <\/b>eingetragen.<\/p>\n<p>Damit stellen wir sicher, dass bei sp&auml;teren &Auml;nderungen des Produktnamens der zum Zeitpunkt der Bestellung g&uuml;ltige Produktname in den Bestelldaten beibehalten wird. Das Formular sehen wir in Bild 5 in der Entwurfsansicht.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_1567_006.png\" alt=\"Entwurfsansicht des Formulars frmBestellungen\" width=\"549,559\" height=\"358,7652\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Entwurfsansicht des Formulars frmBestellungen<\/span><\/b><\/p>\n<p>Wenn der Benutzer das Produkt ausgew&auml;hlt hat, soll der Produktname aus der Tabelle <b>tblProdukte <\/b>in die Tabelle <b>tblBestellungProdukte <\/b>eingetragen werden. Das erledigen wir in der <b>Vor Aktualisierung<\/b>-Ereignisprozedur:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ProduktID_BeforeUpdate(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Me.Produktname = DLookup(\"Produktname\", _\r\n         \"tblProdukte\", \"ProduktID = \" & Me.ProduktID)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Nachdem der Benutzer die Menge f&uuml;r die aktuelle Position eingetragen hat und den Datensatz gespeichert hat, tragen wir die Daten in die Tabelle <b>tblBestellungProdukteBauteile <\/b>ein.<\/p>\n<p>Das erledigen wir mit der Prozedur, die durch das Ereignis <b>Nach Aktualisierung <\/b>des Unterformulars ausgel&ouml;st wird (siehe Listing 1). Die Prozedur erstellt zwei Recordsets. <b>rstBauteileQuelle <\/b>enth&auml;lt eine Abfrage, die alle Bauteile enth&auml;lt, die zu dem im Unterformular hinzugef&uuml;gten Produkt geh&ouml;ren. Der zweite enth&auml;lt die Tabelle <b>tblBestellungProdukteBauteile<\/b>, also die Tabelle, in die wir die Bauteile f&uuml;r die aktuelle Bestellposition eintragen wollen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_AfterUpdate()\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>rstBauteileQuelle<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>rstBauteileZiel<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rstBauteileQuelle = db.OpenRecordset(\"SELECT tblProdukteBauteile.ProduktID, tblProdukteBauteile.Menge, \" _\r\n         & \"tblBauteile.BauteilID, tblBauteile.Bauteilname, tblBauteile.Gewicht FROM tblBauteile \" _\r\n         & \"INNER JOIN tblProdukteBauteile ON tblBauteile.BauteilID = tblProdukteBauteile.BauteilID WHERE ProduktID = \" _\r\n         & Me.ProduktID, dbOpenDynaset)\r\n     <span style=\"color:blue;\">Set<\/span> rstBauteileZiel = db.OpenRecordset(\"SELECT * FROM tblBestellungProdukteBauteile WHERE 1=2\", dbOpenDynaset)\r\n     \r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rstBauteileQuelle.EOF\r\n         <span style=\"color:blue;\">With<\/span> rstBauteileZiel\r\n             .Add<span style=\"color:blue;\">New<\/span>\r\n             !BestellungProduktID = Me.BestellungProduktID\r\n             !BauteilID = rstBauteileQuelle!BauteilID\r\n             !Bauteilname = rstBauteileQuelle!Bauteilname\r\n             !Menge = rstBauteileQuelle!Menge * Me.Menge\r\n             !Gewicht = rstBauteileQuelle!Gewicht\r\n             .Update\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         rstBauteileQuelle.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Eintragen der Produkt- und Bauteildaten f&uuml;r die aktuelle Bestellung<\/span><\/b><\/p>\n<p>In der folgenden <b>Do While<\/b>-Schleife durchlaufen wir alle Datens&auml;tze des ersten Recordsets und tragen die ben&ouml;tigten Werte aus den Tabellen <b>tblBauteile <\/b>und <b>tblProdukteBauteile <\/b>in die Tabelle <b>tblBestellungProdukteBauteile <\/b>ein. Dabei werden alle Daten &uuml;bernommen &#8211; mit Ausnahme des Feldes <b>Menge<\/b>. Hier multiplizieren wir die Menge der Produktposition mit der Menge der Bauteile f&uuml;r dieses Produkt.<\/p>\n<h2>Programmierung des Formulars frmVerpackung<\/h2>\n<p>Da wir nun in der Tabelle <b>tblBestellungProdukteBauteile <\/b>alle Informationen &uuml;ber die zu verpackenden Bauteile haben, k&ouml;nnen wir uns dem Formular zum Verwalten des Packvorgangs zuwenden. Dieses hei&szlig;t <b>frmVerpackung <\/b>und sieht in der Entwurfsansicht wie in Bild 6 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_1567_007.png\" alt=\"Entwurf des Formulars frmVerpackung\" width=\"649,559\" height=\"535,2425\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Entwurf des Formulars frmVerpackung<\/span><\/b><\/p>\n<p>Das Formular selbst verwendet die Tabelle <b>tblBestellungen <\/b>als Datensatzquelle. Es zeigt die beiden Felder <b>BestellungID <\/b>und <b>Bestelldatum <\/b>dieser Tabelle an.<\/p>\n<p>Alle &uuml;brigen Daten werden &uuml;berwiegend in Listenfeldern angezeigt. Einzige Ausnahme ist das Kombinationsfeld zur Auswahl des Beh&auml;ltertyps f&uuml;r das Anlegen eines neuen Beh&auml;lters zur aktuellen Bestellung. Schauen wir uns also diese Listenfelder an.<\/p>\n<h2>Listenfeld zur Anzeige der Produkte einer Bestellung<\/h2>\n<p>Das erste Listenfeld hei&szlig;t <b>lstProdukte <\/b>und soll alle Produkte einer Bestellung inklusive Menge anzeigen. Damit das Listenfeld beim Anzeigen eines Datensatzes immer die zur aktuellen Bestellung geh&ouml;renden Produkte anzeigt, weisen wir die Datensatzherkunft im Ereignis <b>Beim Anzeigen <\/b>des Formulars jeweils neu zu.<\/p>\n<p>Dabei verwenden wir einen SQL-Ausdruck, der die ben&ouml;tigten Daten der Tabelle <b>tblBestellungProdukte <\/b>liefert und diese nach der aktuell im Formular angezeigten Bestellung filtert. Au&szlig;erdem erledigen wir dort noch weitere Schritte, indem wir Prozeduren zum Aktualisieren der &uuml;brigen Listenfelder und der Schaltfl&auml;chen aufrufen (siehe Listing 2).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Current()\r\n     Me.lstProdukte.RowSource = \"SELECT BestellungProduktID, ProduktID AS ID, Produktname, Menge \" _\r\n         & \"FROM tblBestellungProdukte WHERE BestellungID = \" & Me.BestellungID\r\n     <span style=\"color:blue;\">Call<\/span> lstBauteileAktualisieren\r\n     <span style=\"color:blue;\">Call<\/span> lstBehaelterAktualisieren\r\n     <span style=\"color:blue;\">Call<\/span> lstInhaltAktualisieren\r\n     <span style=\"color:blue;\">Call<\/span> SchaltflaechenAktualisieren\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: F&uuml;llen der Listenfelder beim Anzeigen eines Datensatzes<\/span><\/b><\/p>\n<p>Wozu aber wollen wir dieses Listenfeld &uuml;berhaupt nutzen? Es soll dazu dienen, die Anzeige der Bauteile im Listenfeld <b>lstBauteile <\/b>nach dem jeweils ausgew&auml;hlten Produkt zu filtern.<\/p>\n<p>Wenn das Formular ge&ouml;ffnet wird, soll dieses Listenfeld zun&auml;chst alle Bauteile anzeigen, die zu den Produkten der Bestellung geh&ouml;ren. Vielleicht sollen die Bauteile zu einem Produkt aber jeweils in eigenen Beh&auml;ltern gepackt werden. Dann kann der Mitarbeiter auf das jeweilige Produkt klicken und erst einmal nur diese Bauteile packen, bevor er mit dem folgenden Produkt fortf&auml;hrt.<\/p>\n<p>Also haben wir auch zwei Prozeduren, die das Listenfeld <b>lstBauteile <\/b>f&uuml;llen &#8211; eine tr&auml;gt alle Bauteile der aktuellen Bestellung ein, die andere ermittelt alle Bauteile zum aktuell markierten Produkt.<\/p>\n<p>Wenn wir normalerweise einen Eintrag in einem Listenfeld anklicken, k&ouml;nnen wir diesen nicht wieder abw&auml;hlen &#8211; au&szlig;er, wir w&auml;hlen einen anderen Eintrag aus. Wir wollen aber auch wieder alle Bauteile der aktuellen Bestellung anzeigen k&ouml;nnen, obwohl wir vielleicht gerade ein Produkt gew&auml;hlt haben, um nur dessen Bauteile anzuzeigen. Also m&uuml;ssen wir uns einen kleinen Trick &uuml;berlegen, um den aktuell markierten Eintrag im Listenfeld <b>lstProdukte <\/b>wieder abzuw&auml;hlen. <\/p>\n<p>Dazu wollen wir beim Ausw&auml;hlen eines Produkts pr&uuml;fen, ob dieses bereits zuvor selektiert war. Dies erfordert eine Variable au&szlig;erhalb der Prozedur, um den zuletzt selektierten Eintrag zu speichern:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>varProduktSelektiertVorher<span style=\"color:blue;\"> As Variant<\/span><\/pre>\n<p>F&uuml;r das Ereignis <b>Nach Aktualisierung <\/b>des Listenfeldes <b>lstProdukte <\/b>hinterlegen wir nun die folgende Ereignisprozedur:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>lstProdukte_AfterUpdate()\r\n     <span style=\"color:blue;\">If <\/span>Me.lstProdukte = Nz(varProduktSelektiertVorher, 0)<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Call<\/span> lstBauteileAktualisierenNachBestellungID\r\n         varProduktSelektiertVorher = Null\r\n         Me.lstProdukte = Null\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">Call<\/span> lstBauteileAktualisierenNachProduktID\r\n         varProduktSelektiertVorher = Me.lstProdukte\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese pr&uuml;ft, ob der aktuell angeklickte Eintrag dem in <b>varProduktSelektiertVorher <\/b>gespeicherten Eintrag entspricht. Falls ja, will der Benutzer offensichtlich gerade den gew&auml;hlten Listeneintrag abw&auml;hlen. Also stellen wir das Listenfeld auf den Wert <b>Null <\/b>ein, um die Selektion aufzuheben und leeren auch die Variable <b>varProduktSelektiertVorher<\/b>. Au&szlig;erdem rufen wir die Prozedur <b>lstBauteileAktualisierenNachBestellungID <\/b>auf, um im Listenfeld <b>lstBauteile <\/b>alle Bauteile anzuzeigen, die zur aktuellen Bestellung geh&ouml;ren.<\/p>\n<p>Wenn der Benutzer ein Produkt ausgew&auml;hlt hat, das zuvor nicht selektiert war, rufen wir die Prozedur <b>lstBauteileAktualisierenNachProduktID <\/b>auf, um im Listenfeld <b>lstBauteile<\/b> alle Bauteile der aktuellen Bestellung anzuzeigen. Au&szlig;erdem legen wir den Wert von <b>varProduktSelektiertVorher <\/b>auf den aktuell markierten Eintrag fest.<\/p>\n<h2>Listenfeld zur Anzeige der Bauteile einer Bestellung<\/h2>\n<p>Das Listenfeld <b>lstBauteile <\/b>soll, wie zuvor beschrieben, entweder die Bauteile f&uuml;r die aktuelle Bestellung anzeigen oder die Bauteile zu dem im Listenfeld <b>lstProdukte <\/b>ausgew&auml;hlten Produkt.<\/p>\n<p>Wir schauen uns zuerst die Auflistung aller Bauteile zur aktuellen Bestellung an, da diese auch direkt beim &Ouml;ffnen des Formulars erscheinen soll. Dazu verwenden wir die Abfrage <b>qryProdukteBauteileNachBestellung <\/b>als Datensatzherkunft. <\/p>\n<p>Diese Abfrage ist relativ kompliziert und sieht in der Entwurfsansicht wie in Bild 7 aus. Sie enth&auml;lt Daten aus den Tabellen <b>tblBestellungProdukte<\/b>, <b>tblBestellungProdukteBauteile <\/b>und <b>tblBestellungBauteileBehaelter<\/b>. Wir haben diese Tabellen mit den Alias-Bezeichnungen <b>bp<\/b>, <b>bpbt <\/b>und <b>bbb <\/b>versehen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_1567_008.png\" alt=\"Entwurf der Abfrage qryProdukteBauteileNachBestellung\" width=\"700\" height=\"320,0402\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Entwurf der Abfrage qryProdukteBauteileNachBestellung<\/span><\/b><\/p>\n<p>Warum so kompliziert? Weil diese Abfrage gleich mehrere zus&auml;tzliche Informationen neben den eigentlichen Bauteilen ber&uuml;cksichtigen soll:<\/p>\n<ul>\n<li>Wir haben im Formular ein Kontrollk&auml;stchen namens <b>chkVollstaendigGepackteProdukteAusblenden <\/b>eingebaut. Mit diesem wollen wir alle Eintr&auml;ge aus der Liste <b>lstBauteile <\/b>ausblenden k&ouml;nnen, die bereits vollst&auml;ndig einem Beh&auml;lter zugeordnet wurden. So sieht der Mitarbeiter nur die Bauteile, die noch gepackt werden m&uuml;ssen. Den Wert dieses Feldes wollen wir in der Abfrage ber&uuml;cksichtigen.<\/li>\n<li>Au&szlig;erdem wollen wir neben dem Feld <b>Menge<\/b>, das die Gesamtmenge dieses Bauteils anzeigt, noch zwei weitere berechnete Felder unterbringen. Das erste hei&szlig;t <b>Gepackt <\/b>und soll die Anzahl der bereits gepackten Bauteile ausgeben. Das zweite hei&szlig;t <b>Restmenge <\/b>und liefert die noch zu packenden Bauteile.<\/li>\n<\/ul>\n<p>Die Abfrage ist gruppiert nach den Feldern <b>BestellungBauteileID<\/b>, <b>Produktname<\/b>, <b>Bauteilname<\/b>, <b>BauteilID <\/b>und <b>BestellungID<\/b>. Warum eine Gruppierung? Weil zu jedem Bauteil mehrere Zuordnungen zu den verschiedenen Beh&auml;ltern vorkommen k&ouml;nnen und wir die gepackten Mengen aus den verschiedenen Beh&auml;ltern aufsummieren wollen. Diese Summen landen in den Feldern <b>Gepackt <\/b>und <b>Restmenge<\/b>.<\/p>\n<p>Au&szlig;erdem wollen wir vollst&auml;ndige gepackte Bauteile ausblenden k&ouml;nnen, wenn wir das Kombinationsfeld <b>chkVollstaendigGepackteProdukteAusblenden <\/b>aktiviert haben. Dazu haben wir eine entsprechende Bedingung im <b>Having<\/b>-Teil der Abfrage untergebracht, die wir in Bild 8 nochmal in der SQL-Ansicht dargestellt haben. Wir nutzen die beiden Parameter <b>prmBestellungID <\/b>zum Filtern nach der anzuzeigenden Bestellung und <b>prmAusblenden<\/b> zum Filtern nach den auszublendenden Bauteilen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_1567_009.png\" alt=\"SQL-Ansicht der Abfrage qryProdukteBauteileNachBestellung\" width=\"499,5589\" height=\"664,131\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: SQL-Ansicht der Abfrage qryProdukteBauteileNachBestellung<\/span><\/b><\/p>\n<p>Warum nutzen wir Parameter? Weil wir sonst die vollst&auml;ndige SQL-Abfrage im VBA-Code unterbringen und dort mit den Werten f&uuml;r die Parameter f&uuml;llen m&uuml;ssten, was es noch un&uuml;bersichtlicher machen w&uuml;rde.<\/p>\n<p>Also verwenden wir diese Abfrage als Grundlage f&uuml;r das Listenfeld <b>lstBauteile<\/b>, indem wir ein Recordset auf Basis der Abfrage erstellen und dieses mit den erforderlichen Parameterwerten ausstatten. <\/p>\n<p>Dazu referenzieren wir in der Prozedur <b>lstBauteileAktualisierenNachBestellungID<\/b> (siehe Listing 3) das aktuelle <b>Database<\/b>-Objekt &uuml;ber die Funktion <b>CurrentDb <\/b>und speichern die Referenz in der Variablen <b>db<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>lstBauteileAktualisierenNachBestellungID()\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>prmBestellungID<span style=\"color:blue;\"> As <\/span>DAO.Parameter\r\n     <span style=\"color:blue;\">Dim <\/span>prmAusblenden<span style=\"color:blue;\"> As <\/span>DAO.Parameter\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> qdf = db.QueryDefs(\"qryProdukteBauteileNachBestellung\")\r\n     <span style=\"color:blue;\">Set<\/span> prmBestellungID = qdf.Parameters(\"prmBestellungID\")\r\n     prmBestellungID = Me.BestellungID\r\n     <span style=\"color:blue;\">Set<\/span> prmAusblenden = qdf.Parameters(\"prmAusblenden\")\r\n     prmAusblenden = Me.chkVollstaendigGepackteProdukteAusblenden\r\n     <span style=\"color:blue;\">Set<\/span> rst = qdf.OpenRecordset\r\n     <span style=\"color:blue;\">Set<\/span> Me.lstBauteile.Recordset = rst\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: F&uuml;llen des Listenfelds lstBauteile mit den Bauteilen einer Bestellung<\/span><\/b><\/p>\n<p>Dann holen wir uns &uuml;ber die <b>QueryDefs<\/b>-Auflistung einen Verweis auf die Abfrage <b>qryProdukteBauteileNachBestellung<\/b> und tragen diesen in die Variable <b>qdf <\/b>ein.<\/p>\n<p>Mit den beiden <b>Parameter<\/b>-Variablen <b>prmBestellungID <\/b>und <b>prmAusblenden <\/b>definieren wir die Parameter und weisen ihnen die aktuelle <b>BestellungID <\/b>und den Wert des Kontrollk&auml;stchens <b>chkVollstaendigGepackteProdukteAusblenden <\/b>zu.<\/p>\n<p>Nun k&ouml;nnen wir mit <b>OpenRecordset <\/b>ein Recordset auf Basis von <b>qdf <\/b>&ouml;ffnen und dieses der Eigenschaft <b>Recordset <\/b>des Listenfelds <b>lstBauteile <\/b>zuweisen.<\/p>\n<h2>Listenfeld zur Anzeige der Bauteile einer Bestellung nur f&uuml;r ein Produkt<\/h2>\n<p>Wenn der Benutzer auf eines der Produkte im Listenfeld <b>lstProdukte <\/b>geklickt hat, sollen nur die Bauteile f&uuml;r dieses Produkt in <b>lstBauteile<\/b> erscheinen.<\/p>\n<p>Dazu nutzen wir eine &auml;hnliche Vorgehensweise wie bei der Anzeige aller Bauteile der kompletten Bestellung.<\/p>\n<p>Die Abfrage ist fast identisch aufgebaut, aber sie verwendet einen zus&auml;tzlichen Parameter namens <b>prmProduktID<\/b> (siehe Bild 9).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_1567_010.png\" alt=\"SQL-Ansicht der Abfrage qryProdukteBauteileNachProdukt\" width=\"499,5589\" height=\"693,2655\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: SQL-Ansicht der Abfrage qryProdukteBauteileNachProdukt<\/span><\/b><\/p>\n<p>In der Prozedur <b>lstBauteileAktualisierenNachProduktID <\/b>gehen wir analog zu der zuvor vorgestellten Prozedur vor, allerdings bauen wir noch den Parameter <b>prmProduktID<\/b> mit dem aktuellen Wert aus dem Listenfeld <b>lstProdukte <\/b>in den Aufbau des Recordsets ein (siehe Listing 4).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>lstBauteileAktualisierenNachProduktID()\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>prmBestellungID<span style=\"color:blue;\"> As <\/span>DAO.Parameter\r\n     <span style=\"color:blue;\">Dim <\/span>prmProduktID<span style=\"color:blue;\"> As <\/span>DAO.Parameter\r\n     <span style=\"color:blue;\">Dim <\/span>prmAusblenden<span style=\"color:blue;\"> As <\/span>DAO.Parameter\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> qdf = db.QueryDefs(\"qryProdukteBauteileNachProdukt\")\r\n     <span style=\"color:blue;\">Set<\/span> prmBestellungID = qdf.Parameters(\"prmBestellungID\")\r\n     prmBestellungID = Me.BestellungID\r\n     <span style=\"color:blue;\">Set<\/span> prmProduktID = qdf.Parameters(\"prmProduktID\")\r\n     prmProduktID = Me.lstProdukte.Column(1)\r\n     <span style=\"color:blue;\">Set<\/span> prmAusblenden = qdf.Parameters(\"prmAusblenden\")\r\n     prmAusblenden = Me.chkVollstaendigGepackteProdukteAusblenden\r\n     <span style=\"color:blue;\">Set<\/span> rst = qdf.OpenRecordset\r\n     <span style=\"color:blue;\">Set<\/span> Me.lstBauteile.Recordset = rst\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: F&uuml;llen des Listenfelds lstBauteile mit den Bauteilen eines Produkts<\/span><\/b><\/p>\n<h2>Vollst&auml;ndig gepackte Bauteile ausblenden<\/h2>\n<p>Wenn der Mitarbeiter auf das Kontrollk&auml;stchen <b>chkVollstaendigGepackteProdukteAusblenden <\/b>klickt, sollen die Bauteile, die bereits vollst&auml;ndig einem der Beh&auml;lter zugeordnet wurden, aus der Liste <b>lstBauteile <\/b>ausgeblendet werden. Dazu hinterlegen wir f&uuml;r das Ereignis <b>Nach Aktualisierung <\/b>des Listenfeldes die Prozedur aus Listing 5.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>chkVollstaendigGepackteProdukteAusblenden_AfterUpdate()\r\n     <span style=\"color:blue;\">Call<\/span> lstBauteileAktualisieren\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Aktualisieren von lstBauteile beim Bet&auml;tigen des Kontrollk&auml;stchens<\/span><\/b><\/p>\n<h2>Hinzuf&uuml;gen eines Beh&auml;lters zu einer Bestellung<\/h2>\n<p>Die beiden Steuerelemente <b>cboBehaeltertypen <\/b>und <b>cmdBehaelterHinzufuegen <\/b>dienen dazu, einer Bestellung einen Beh&auml;lter hinzuzuf&uuml;gen. Als Erstes w&auml;hlt der Benutzer einen der Eintr&auml;ge aus dem Kombinationsfeld aus.<\/p>\n<p>Dieses verwendet die folgende Abfrage als Datensatzherkunft:<\/p>\n<pre>SELECT BehaeltertypID, Behaeltertyp, Gewicht FROM tblBehaeltertypen ORDER BY tblBehaeltertypen.Behaeltertyp;<\/pre>\n<p>Ein Mausklick auf die Schaltfl&auml;che <b>cmdBehaelterHinzufuegen<\/b> l&ouml;st die Prozedur aus Listing 6 aus.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdBehaelterHinzufuegen_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>strBehaeltername<span style=\"color:blue;\"> As String<\/span>\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     \r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(Me.cboBehaeltertypen)<span style=\"color:blue;\"> Then<\/span>\r\n         strBehaeltername = InputBox(\"Beh&auml;ltername:\", \"Neuer Beh&auml;lter\", Me.cboBehaeltertypen.Column(1))\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strBehaeltername) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             db.Execute \"INSERT INTO tblBehaelter(Behaeltername, BehaeltertypID, BestellungID) VALUES(''\" _\r\n                 & strBehaeltername & \"'', \" & Me.cboBehaeltertypen & \", \" & Me.BestellungID & \")\", dbFailOnError\r\n             <span style=\"color:blue;\">Call<\/span> lstBehaelterAktualisieren\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Kein Beh&auml;ltertyp ausgew&auml;hlt.\", vbOKOnly + vbExclamation, \"Beh&auml;ltertyp fehlt\"\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: Hinzuf&uuml;gen eines Beh&auml;lters zu einer Bestellung<\/span><\/b><\/p>\n<p>Diese pr&uuml;ft zuerst, ob ein Eintrag im Kombinationsfeld <b>cboBehaeltertypen <\/b>ausgew&auml;hlt ist. Fall ja, erscheint eine InputBox, mit welcher der Mitarbeiter den individuellen Namen f&uuml;r diesen Beh&auml;lter einstellen kann. Als Standardwert wird dabei der Typ des Beh&auml;lters vorgeschlagen. Danach wird ein neuer Datensatz in der Tabelle <b>tblBehaelter <\/b>angelegt.<\/p>\n<p>Dieser erh&auml;lt den vom Mitarbeiter gew&auml;hlten Beh&auml;lternamen, die ID des Beh&auml;ltertyps aus der Tabelle <b>tblBehaeltertypen <\/b>und die ID der Bestellung als Feldwerte.<\/p>\n<p>Danach wird das Listenfeld <b>lstBehaelter <\/b>&uuml;ber die Prozedur <b>lstBehaelterAktualisieren <\/b>aktualisiert. Diese Prozedur weist dem Listenfeld eine Abfrage zu, welche die aktuelle <b>BestellungID<\/b> in der <b>WHERE<\/b>-Bedingung filtert (siehe Listing 7). Falls der Mitarbeiter keinen Beh&auml;ltertyp mit <b>cboBehaeltertyp <\/b>ausgew&auml;hlt hat, erscheint eine Meldung, die auf diese fehlende Information hinweist.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>lstBehaelterAktualisieren()\r\n     Me.lstBehaelter.RowSource = \"SELECT tblBehaelter.BehaelterID, tblBehaelter.Behaeltername, \" _\r\n         & \"tblBehaeltertypen.Behaeltertyp FROM tblBehaelter INNER JOIN tblBehaeltertypen ON \"  _\r\n         & \"tblBehaelter.BehaeltertypID = tblBehaeltertypen.BehaeltertypID WHERE tblBehaelter.BestellungID = \" _\r\n         & Me.BestellungID\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Aktualisieren des Listenfeldes lstBehaelter<\/span><\/b><\/p>\n<h2>Listenfeld zur Anzeige der Beh&auml;lter einer Bestellung<\/h2>\n<p>Damit kommen wir zum Listenfeld <b>lstBehaelter<\/b>. Dieses soll alle Beh&auml;lter anzeigen, die der aktuellen Bestellung bereits hinzugef&uuml;gt wurden. Wie dieses gef&uuml;llt wird, haben wir oben bereits gesehen.<\/p>\n<p>Wenn der Benutzer einen der Beh&auml;lter ausw&auml;hlt, wird das Ereignis <b>Nach Aktualisierung <\/b>des Listenfeldes <b>lstBehaelter <\/b>ausgel&ouml;st:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>lstBehaelter_AfterUpdate()\r\n     <span style=\"color:blue;\">Call<\/span> lstInhaltAktualisieren\r\n     <span style=\"color:blue;\">Call<\/span> SchaltflaechenAktualisieren\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese aktualisiert den Inhalt des Listenfeldes <b>lstInhalt <\/b>und aktualisiert anschlie&szlig;end die Schaltfl&auml;chen zum Hinzuf&uuml;gen und Entfernen von Bauteilen in oder aus den Beh&auml;ltern.<\/p>\n<h2>Listenfeld zur Anzeige der gepackten Bauteile<\/h2>\n<p>Die erste Prozedur <b>lstInhaltAktualisieren <\/b>sehen wir in Listing 8.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>lstInhaltAktualisieren()\r\n     Me.lstInhalt.RowSource = \"SELECT * FROM qryBestellungBauteileBehaelter WHERE BestellungID = \" & Me.BestellungID _\r\n         & \" AND BehaelterID = \" & Nz(Me.lstBehaelter, 0)\r\n     <span style=\"color:blue;\">Call<\/span> ErstenEintragMarkieren(Me.lstInhalt)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Aktualisieren des Listenfeldes lstInhalt<\/span><\/b><\/p>\n<p>Diese weist dem Listenfeld alle Eintr&auml;ge einer Abfrage namens <b>qryBestellungBauteileBehaelter <\/b>hinzu, deren Feld <b>BestellungID <\/b>der aktuell angezeigten Bestellung entspricht (siehe Bild 10).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_1567_011.png\" alt=\"Entwurf der Abfrage qryBestellungBauteileBehaelter\" width=\"700\" height=\"302,5085\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Entwurf der Abfrage qryBestellungBauteileBehaelter<\/span><\/b><\/p>\n<p>Die Abfrage fasst die Daten der Tabellen <b>tblBestellungBauteileBehaelter<\/b>, <b>tblBestellungProdukteBauteile <\/b>und <b>tblBestellungProdukte <\/b>zusammen. Die anzuzeigenden Daten stammen im Wesentlichen aus der Tabelle <b>tblBestellungBauteileBehaelter<\/b>, die &uuml;brigen Tabellen sind n&ouml;tig, damit wir nach dem Feld <b>BestellungID <\/b>filtern k&ouml;nnen.<\/p>\n<p>Nach dem F&uuml;llen soll der erste Eintrag dieses Listenfeldes markiert werden. Dies erledigt die folgende Prozedur:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ErstenEintragMarkieren(lst<span style=\"color:blue;\"> As <\/span>Access.ListBox)\r\n     <span style=\"color:blue;\">If <\/span>lst.ColumnHeads = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         lst = lst.ItemData(1)\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         lst = lst.ItemData(0)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese pr&uuml;ft, ob f&uuml;r das Listenfeld die Anzeige von Spalten&uuml;berschriften aktiviert ist. Falls ja, ist der Index der ersten Zeile mit Daten <b>1<\/b>, anderenfalls <b>0<\/b>.<\/p>\n<p>Davon abh&auml;ngig wird entweder die Zeile mit dem Index <b>1 <\/b>oder <b>0 <\/b>markiert.<\/p>\n<p>Damit haben wir alle Listenfelder mit den notwendigen Funktionen ausgestattet und kommen zum spannenden Teil: Dem Hinzuf&uuml;gen von Bauteilen zum jeweils markierten Beh&auml;lter.<\/p>\n<h2>Schaltfl&auml;chen zum Hinzuf&uuml;gen und Entfernen von Bauteilen zu einem Beh&auml;lter<\/h2>\n<p>Zum Hinzuf&uuml;gen und Entfernen von Bauteilen nutzen wir die Schaltfl&auml;chen <b>cmdEinBauteilHinzufuegen<\/b>, <b>cmdAlleBauteileHinzufuegen<\/b>, <b>cmdEinBauteilEntfernen <\/b>und <b>cmdAlleBauteileEntfernen<\/b>. Das Entfernen ist notwendig, weil es einmal sein kann, dass man bereits gepackte Bauteile noch einmal umpacken m&ouml;chte.<\/p>\n<p>Wir stellen zun&auml;chst sicher, dass immer nur die tats&auml;chlich verf&uuml;gbaren Schaltfl&auml;chen aktiviert sind. Das erledigen wir mit der Prozedur <b>SchaltflaechenAktualisieren<\/b>, die von verschiedenen Stellen aus aufgerufen wird &#8211; zum Beispiel nach dem &Auml;ndern verschiedener Listenfeldinhalte.<\/p>\n<p>Ob die Schaltfl&auml;chen zum Hinzuf&uuml;gen von Bauteilen aktiviert werden oder nicht, h&auml;ngt davon ab, ob im Listenfeld <b>lstBauteile <\/b>und im Listenfeld <b>lstBehaelter<\/b> ein Eintrag ausgew&auml;hlt ist. Ist das der Fall, untersucht die Prozedur den Wert der Spalte <b>Restmenge<\/b>. Ist dieser gr&ouml;&szlig;er als <b>0<\/b>, sollen die beiden Schaltfl&auml;chen <b>cmdAlleBauteileHinzufuegen <\/b>und <b>cmdEinBauteilHinzufuegen <\/b>aktiviert werden, anderenfalls werden diese deaktiviert.<\/p>\n<p>Danach untersucht die Prozedur, ob <b>lstInhalt<\/b> einen markierten Eintrag enth&auml;lt. Falls ja, werden die beiden Schaltfl&auml;chen <b>cmdAlleBauteileEntfernen <\/b>und <b>cmdEinBauteilEntfernen <\/b>aktiviert. Anderenfalls werden die beiden Schaltfl&auml;chen deaktiviert:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SchaltflaechenAktualisieren()\r\n     If <span style=\"color:blue;\">Not<\/span> IsNull(Me.lstBauteile) _\r\n             And <span style=\"color:blue;\">Not<\/span> IsNull(Me.lstBehaelter) Then\r\n         <span style=\"color:blue;\">If <\/span>Me.lstBauteile.Column(5) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             Me.cmdAlleBauteileHinzufuegen.Enabled = <span style=\"color:blue;\">True<\/span>\r\n             Me.cmdEinBauteilHinzufuegen.Enabled = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             Me.cmdAlleBauteileHinzufuegen.Enabled = <span style=\"color:blue;\">False<\/span>\r\n             Me.cmdEinBauteilHinzufuegen.Enabled = <span style=\"color:blue;\">False<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me.cmdAlleBauteileHinzufuegen.Enabled = <span style=\"color:blue;\">False<\/span>\r\n         Me.cmdEinBauteilHinzufuegen.Enabled = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(Me.lstInhalt)<span style=\"color:blue;\"> Then<\/span>\r\n         Me.cmdAlleBauteileEntfernen.Enabled = <span style=\"color:blue;\">True<\/span>\r\n         Me.cmdEinBauteilEntfernen.Enabled = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me.cmdAlleBauteileEntfernen.Enabled = <span style=\"color:blue;\">False<\/span>\r\n         Me.cmdEinBauteilEntfernen.Enabled = <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<h2>Ein Bauteil zur Liste f&uuml;r den aktuellen Beh&auml;lter hinzuf&uuml;gen<\/h2>\n<p>Wenn sowohl ein Bauteil in der Liste <b>lstBauteile <\/b>markiert ist, als auch ein Beh&auml;lter in <b>lstBehaelter<\/b>, sind die beiden Schaltfl&auml;chen <b>cmdEinBauteilHinzufuegen <\/b>und <b>cmdAlleBauteileHinzufuegen <\/b>aktiviert. Wir schauen uns zuerst an, was beim Klick auf den Button <b>cmdEinBauteilHinzufuegen<\/b> geschieht (siehe Listing 9).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdEinBauteilHinzufuegen_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>lngBestellungBauteilID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngBehaelterID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intSpaltenueberschriften<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolNaechstesBauteilMarkieren<span style=\"color:blue;\"> As Boolean<\/span>\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     lngBestellungBauteilID = Me.lstBauteile\r\n     lngBehaelterID = Me.lstBehaelter\r\n     \r\n     db.Execute \"UPDATE tblBestellungBauteileBehaelter SET Menge = Menge + 1 WHERE BestellungBauteilID = \" _\r\n         & lngBestellungBauteilID & \" AND BehaelterID = \" & lngBehaelterID, dbFailOnError\r\n     <span style=\"color:blue;\">If <\/span>db.RecordsAffected = 0<span style=\"color:blue;\"> Then<\/span>\r\n         db.Execute \"INSERT INTO tblBestellungBauteileBehaelter(BestellungBauteilID, BehaelterID, Menge) \" _\r\n             & \"VALUES(\" & lngBestellungBauteilID & \", \" & lngBehaelterID & \", \" & 1 & \")\", dbFailOnError\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     \r\n     Me.lstInhalt.Requery\r\n     Me.lstInhalt = Nz(DLookup(\"BestellungBauteilBehaelterID\", \"tblBestellungBauteileBehaelter\", _\r\n         \"BestellungBauteilID = \" & lngBestellungBauteilID & \" AND BehaelterID = \" & lngBehaelterID))\r\n     \r\n     <span style=\"color:blue;\">Call<\/span> lstBauteileAktualisieren\r\n     \r\n     Me.lstBauteile = lngBestellungBauteilID\r\n     <span style=\"color:blue;\">If <\/span>Me.lstBauteile.ListIndex = -1<span style=\"color:blue;\"> Then<\/span>\r\n         bolNaechstesBauteilMarkieren = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">If <\/span>Me.lstBauteile.Column(5) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             bolNaechstesBauteilMarkieren = <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;\">If <\/span>bolNaechstesBauteilMarkieren = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         intSpaltenueberschriften = Abs(Me.lstBauteile.ColumnHeads)\r\n         For i = 0 + intSpaltenueberschriften To Me.lstBauteile.ListCount - 1 + intSpaltenueberschriften\r\n             <span style=\"color:blue;\">If <\/span>Me.lstBauteile.Column(5, i)<span style=\"color:blue;\"> Then<\/span>\r\n                 Me.lstBauteile = Me.lstBauteile.ItemData(i)\r\n                 <span style=\"color:blue;\">Exit For<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Next<\/span> i\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Call<\/span> SchaltflaechenAktualisieren\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 9: Hinzuf&uuml;gen eines Bauteils zur Liste des aktuell ausgew&auml;hlten Beh&auml;lters<\/span><\/b><\/p>\n<p>Wir schreiben die ID des markierten Eintrags aus <b>lstBauteile <\/b>in <b>lngBestellungBauteilID<\/b> und die ID des Zielbeh&auml;lters aus <b>lstBehaelter <\/b>in <b>lngBehaelterID<\/b>. Dann f&uuml;hren wir eine Aktualisierungsabfrage aus, die den Datensatz der Tabelle <b>tblBestellungBauteilBehaelter<\/b>, der im Feld <b>BestellungBauteilID <\/b>den Wert aus <b>lngBestellungBauteilID <\/b>enth&auml;lt und im Feld <b>BehaelterID <\/b>den Wert aus <b>lngBehaelterID<\/b>.<\/p>\n<p>Dies aktualisiert nur einen Datensatz, wenn bereits ein Exemplar dieses Bauteils in <b>tblBestellungBauteilBehaelter <\/b>vorhanden ist. Mit <b>db.RecordsAffected = 0 <\/b>pr&uuml;fen wir anschlie&szlig;end, ob hier ein Datensatz aktualisiert wurde. Falls nicht, f&uuml;gen wir einen entsprechenden Datensatz zu dieser Tabelle hinzu und stellen die Menge auf <b>1 <\/b>ein.<\/p>\n<p>Danach versuchen wir, den zuletzt gepackten Eintrag in <b>lstBauteile <\/b>erneut zu markieren. Wenn jedoch die Anzahl der offenen Exemplare <b>0 <\/b>ist und wir das Ausblenden der komplett gepackten Bauteile aktiviert haben, hat <b>ListIndex <\/b>danach den Wert <b>-1 <\/b>und wir stellen die Variable <b>bolNaechstesBauteilMarkieren <\/b>auf <b>True <\/b>ein.<\/p>\n<p>Sind erledigte Bauteile nicht ausgeblendet, pr&uuml;fen wir den Wert des Feldes <b>Restmenge <\/b>(<b>Column(5)<\/b>) auf den Wert <b>0<\/b>. Auch wenn dieser <b>True <\/b>ist, stellen wir <b>bolNaechstesBauteilMarkieren <\/b>auf <b>True <\/b>ein.<\/p>\n<p>Hat <b>bolNaechstesBauteilMarkieren <\/b>danach den Wert <b>True<\/b>, ist das zuletzt einem Beh&auml;lter zugeordnete Bauteil offensichtlich vollst&auml;ndig verpackt. In diesem Fall wollen wir das n&auml;chste Bauteil markieren, das noch nicht vollst&auml;ndig gepackt ist. Dazu durchlaufen wir eine Schleife &uuml;ber alle Elemente und markieren das erste Element, das in <b>Column(5)<\/b>, also im Feld <b>Restmenge<\/b>, einen Wert gr&ouml;&szlig;er als <b>0<\/b> hat. Dabei ber&uuml;cksichtigen wir mit der Variablen <b>intSpaltenueberschriften <\/b>auch die M&ouml;glichkeit, dass eine Spalten&uuml;berschrift eingeblendet ist, was die Indizierung der Elemente von <b>0<\/b>-basiert auf <b>1<\/b>-basiert ver&auml;ndert.<\/p>\n<p>Danach rufen wir schlie&szlig;lich die Prozedur <b>SchaltflaechenAktualisieren <\/b>auf.<\/p>\n<h2>Alle Bauteile zur Liste f&uuml;r den aktuellen Beh&auml;lter hinzuf&uuml;gen<\/h2>\n<p>Ein Klick auf die Schaltfl&auml;che <b>cmdAlleBauteileHinzufuegen<\/b> soll alle verbleibenden Exemplare eines Bauteils zum aktuell markierten Beh&auml;lter hinzuf&uuml;gen (siehe Listing 10).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAlleBauteileHinzufuegen_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>lngRest<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngBestellungBauteilID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngBehaelterID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intSpaltenueberschriften<span style=\"color:blue;\"> As Integer<\/span>\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     lngRest = Me.lstBauteile.Column(5)\r\n     lngBestellungBauteilID = Me.lstBauteile\r\n     lngBehaelterID = Me.lstBehaelter\r\n     \r\n     db.Execute \"UPDATE tblBestellungBauteileBehaelter SET Menge = Menge + \" & lngRest _\r\n         & \" WHERE BestellungBauteilID = \" & lngBestellungBauteilID & \" AND BehaelterID = \" & lngBehaelterID, dbFailOnError\r\n     <span style=\"color:blue;\">If <\/span>db.RecordsAffected = 0<span style=\"color:blue;\"> Then<\/span>\r\n         db.Execute \"INSERT INTO tblBestellungBauteileBehaelter(BestellungBauteilID, BehaelterID, Menge) \" _\r\n             & \"VALUES(\" & lngBestellungBauteilID & \", \" & lngBehaelterID & \", \" & lngRest & \")\", dbFailOnError\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Call<\/span> lstInhaltAktualisieren\r\n     <span style=\"color:blue;\">Call<\/span> lstBauteileAktualisieren\r\n     \r\n     intSpaltenueberschriften = Abs(Me.lstBauteile.ColumnHeads)\r\n     For i = 0 + intSpaltenueberschriften To Me.lstBauteile.ListCount - 1 + intSpaltenueberschriften\r\n         <span style=\"color:blue;\">If <\/span>Me.lstBauteile.Column(5, i)<span style=\"color:blue;\"> Then<\/span>\r\n             Me.lstBauteile = Me.lstBauteile.ItemData(i)\r\n             <span style=\"color:blue;\">Exit For<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     <span style=\"color:blue;\">Call<\/span> SchaltflaechenAktualisieren\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 10: Hinzuf&uuml;gen aller verbleibenden Exemplare eines Bauteils zur Liste des aktuell ausgew&auml;hlten Beh&auml;lters<\/span><\/b><\/p>\n<p>Dabei ermitteln wir wie zuvor die aktuellen Eintr&auml;ge der Listenfelder <b>lstBauteile <\/b>und <b>lstBehaelter<\/b>. Au&szlig;erdem holen wir aus dem Listenfeld <b>lstBauteile <\/b>den Inhalt der Spalte mit dem Index <b>5<\/b>, welche die Restmenge enth&auml;lt, und schreiben diesen Wert in die Variable <b>lngRest<\/b>. Damit aktualisieren wir wieder per <b>UPDATE<\/b>-Anweisung die Tabelle <b>tblBestellungBauteileBehaelter<\/b>. Diesmal addieren wir allerdings den Wert aus <b>lngRest <\/b>hinzu statt nur den Wert <b>1 <\/b>wie beim Hinzuf&uuml;gen eines einzelnen Bauteils.<\/p>\n<p>Wieder pr&uuml;fen wir, ob dadurch ein Datensatz ge&auml;ndert wurde. Wenn nicht, wurde noch kein Bauteil dieses Eintrags zu diesem Beh&auml;lter hinzugef&uuml;gt. Also f&uuml;gen wir einen neuen Datensatz zu <b>tblBestellungenBauteilBehaelter <\/b>hinzu und tragen dort die vollst&auml;ndige Menge aus <b>lngRest <\/b>ein.<\/p>\n<p>Anschlie&szlig;end aktualisieren wir die Inhalte von <b>lstInhalt <\/b>und <b>lstBauteile<\/b>. Da hier nun alle Exemplare eines Bauteils zu einem Beh&auml;lter hinzugef&uuml;gt wurden, ist die verbleibende Restmenge gleich <b>0<\/b>. Je nach Einstellung des Kontrollk&auml;stchens wird dieser Eintrag nun ausgeblendet oder bleibt mit der Restmenge <b>0 <\/b>stehen. Also wollen wir nun das n&auml;chste Bauteil in der Liste markieren, f&uuml;r das noch eine Restmenge verf&uuml;gbar ist. Dazu ermitteln wir, ob Spalten&uuml;berschriften aktiviert sind und wandeln das Ergebnis (<b>0 <\/b>oder <b>-1<\/b>) mit der <b>Abs<\/b>-Funktion in <b>0 <\/b>oder <b>1 <\/b>um. Dann durchlaufen wir alle Elemente des Listenfeldes und pr&uuml;fen, ob es in <b>Column(5) <\/b>einen Wert gr&ouml;&szlig;er als <b>0 <\/b>gibt. Ist das der Fall, markieren wir diesen Eintrag und verlassen die Schleife. Schlie&szlig;lich aktualisiert die Prozedur noch die Schaltfl&auml;chen.<\/p>\n<h2>Ein Bauteil aus der Liste f&uuml;r den aktuellen Beh&auml;lter entfernen<\/h2>\n<p>Wenn der Mitarbeiter ein Bauteil wieder aus einem Beh&auml;lter entfernen m&ouml;chte, klickt er die Schaltfl&auml;che <b>cmdEinBauteilEntfernen <\/b>an und l&ouml;st damit die Prozedur aus Listing 11 aus.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdEinBauteilEntfernen_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>strSQL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngBestellungBauteilID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     lngBestellungBauteilID = Me.lstInhalt.Column(5)\r\n     <span style=\"color:blue;\">If <\/span>DLookup(\"Menge\", \"tblBestellungBauteileBehaelter\", \"BestellungBauteilBehaelterID = \" & Me.lstInhalt) = 1<span style=\"color:blue;\"> Then<\/span>\r\n         strSQL = \"DELETE FROM tblBestellungBauteileBehaelter WHERE BestellungBauteilBehaelterID = \" & Me.lstInhalt\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         strSQL = \"UPDATE tblBestellungBauteileBehaelter SET Menge = Menge - 1 WHERE BestellungBauteilBehaelterID = \" _\r\n             & Me.lstInhalt\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     db.Execute strSQL, dbFailOnError\r\n     <span style=\"color:blue;\">Call<\/span> lstInhaltAktualisieren\r\n     <span style=\"color:blue;\">Call<\/span> lstBauteileAktualisieren\r\n     Me.lstBauteile = lngBestellungBauteilID\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 11: L&ouml;schen eines Bauteils aus einem Beh&auml;lter<\/span><\/b><\/p>\n<p>Hier lesen wir den Wert des Feldes <b>BestellungBauteilID <\/b>aus <b>Column(5) <\/b>des Listenfeldes <b>lstInhalt <\/b>aus und speichern es in <b>lngBestellungBauteilID<\/b>.<\/p>\n<p>Dann pr&uuml;fen wir, ob dies das letzte Exemplar dieses Bauteils ist, das dem aktuell markierten Beh&auml;lter zugeordnet ist. Falls ja, l&ouml;schen wir diesen verbleibenden Datensatz einfach aus der Tabelle <b>tblBestellungBauteileBehaelter<\/b>.<\/p>\n<p>Anderenfalls aktualisieren wir den entsprechenden Datensatz dieser Tabelle und ziehen den Wert <b>1 <\/b>vom aktuellen Wert des Feldes <b>Menge <\/b>ab.<\/p>\n<p>Schlie&szlig;lich aktualisieren wir die Listenfelder <b>lstInhalt <\/b>und <b>lstBauteile <\/b>und stellen die Liste <b>lstBauteile <\/b>auf das zuletzt aus dem Beh&auml;lter entfernte Bauteil ein.<\/p>\n<h2>Alle Bauteile aus der Liste f&uuml;r den aktuellen Beh&auml;lter entfernen<\/h2>\n<p>Die zweite M&ouml;glichkeit zum Entfernen von Bauteilen aus einem Beh&auml;lter ist die Schaltfl&auml;che <b>cmdAlleBauteileEntfernen<\/b>. Sie l&ouml;st die Prozedur aus Listing 12 aus.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAlleBauteileEntfernen_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>strSQL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngBestellungBauteilID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     lngBestellungBauteilID = Me.lstInhalt.Column(5)\r\n     strSQL = \"DELETE FROM tblBestellungBauteileBehaelter WHERE BestellungBauteilBehaelterID = \" & Me.lstInhalt\r\n     db.Execute strSQL, dbFailOnError\r\n     Me.lstInhalt.Requery\r\n     <span style=\"color:blue;\">Call<\/span> lstBauteileAktualisieren\r\n     Me.lstBauteile = lngBestellungBauteilID\r\n     <span style=\"color:blue;\">Call<\/span> lstInhaltAktualisieren\r\n     <span style=\"color:blue;\">Call<\/span> SchaltflaechenAktualisieren\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 12: L&ouml;schen aller Exemplare eines Bauteils aus einem Beh&auml;lter<\/span><\/b><\/p>\n<p>Diese Prozedur ist noch etwas einfacher gehalten als die zum Entfernen eines einzigen Exemplars aus der Tabelle <b>tblBestellungBauteileBehaelter<\/b>, weil wir nun wissen, dass wir einfach nur den Eintrag f&uuml;r dieses Bauteil in diesem Beh&auml;lter l&ouml;schen m&uuml;ssen &#8211; unabh&auml;ngig davon, welchen Wert das Feld <b>Menge <\/b>in diesem Datensatz hat.<\/p>\n<p>Wir l&ouml;schen also den entsprechenden Datensatz mit der <b>DELETE<\/b>-Anweisung und aktualisieren nachher alle betroffenen Elemente der Benutzeroberfl&auml;che. Im Listenfeld <b>lstBauteile <\/b>selektieren wir au&szlig;erdem wieder das Bauteil, das soeben aus dem Beh&auml;lter entfernt wurde.<\/p>\n<h2>Vorhandenen Beh&auml;lter l&ouml;schen<\/h2>\n<p>Gegebenenfalls legt der Mitarbeiter einen Beh&auml;lter versehentlich an oder er stellt sp&auml;ter fest, dass er den Beh&auml;lter nicht ben&ouml;tigt, weil er alle Bauteile in die &uuml;brigen Beh&auml;lter packen kann. F&uuml;r diesen Fall haben wir die Schaltfl&auml;che <b>cmdBehaelterLoeschen <\/b>hinzugef&uuml;gt, welche die Prozedur aus Listing 13 aufruft.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdBehaelterLoeschen_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>bolLoeschen<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolBauteileEnthalten<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngBehaelterID<span style=\"color:blue;\"> As Long<\/span>\r\n     \r\n     bolLoeschen = <span style=\"color:blue;\">True<\/span>\r\n     lngBehaelterID = Me.lstBehaelter\r\n     If <span style=\"color:blue;\">Not<\/span> IsNull(DLookup(\"BestellungBauteilBehaelterID\", \"tblBestellungBauteileBehaelter\", \"BehaelterID = \" _\r\n             & lngBehaelterID)) Then\r\n         bolBauteileEnthalten = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span>bolBauteileEnthalten = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         If <span style=\"color:blue;\">MsgBox<\/span>(\"Dies l&ouml;scht auch die Zuordnungen zu diesem Beh&auml;lter. Fortsetzen?\", vbOKCancel + vbExclamation, _\r\n                 \"Beh&auml;lter l&ouml;schen\") = vbCancel Then\r\n             bolLoeschen = <span style=\"color:blue;\">False<\/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;\">If <\/span>bolLoeschen = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n         db.Execute \"DELETE FROM tblBehaelter WHERE BehaelterID = \" & Me.lstBehaelter, dbFailOnError\r\n         <span style=\"color:blue;\">Call<\/span> lstBehaelterAktualisieren\r\n         <span style=\"color:blue;\">Call<\/span> ErstenEintragMarkieren(Me.lstBehaelter)\r\n         <span style=\"color:blue;\">Call<\/span> lstInhaltAktualisieren\r\n         <span style=\"color:blue;\">Call<\/span> lstBauteileAktualisieren\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 13: L&ouml;schen eines Beh&auml;lters<\/span><\/b><\/p>\n<p>Diese Prozedur stellt zuerst die Variable <b>bolLoeschen <\/b>auf den Wert <b>True <\/b>ein. Mit den folgenden Anweisungen pr&uuml;fen wir verschiedene Bedingungen, wodurch diese Variable auf den Wert <b>False <\/b>ge&auml;ndert werden kann. Danach ermitteln wir die ID des aktuell markierten Beh&auml;lters.<\/p>\n<p>Die erste <b>If&#8230;Then<\/b>-Bedingung pr&uuml;ft, ob diesem Beh&auml;lter bereits Bauteile &uuml;ber die Tabelle <b>tblBestellungBauteileBehaelter <\/b>zugeordnet wurden. Ist das der Fall, stellt die Prozedur die Variable <b>bolBauteileEnthalten <\/b>auf <b>True <\/b>ein.<\/p>\n<p>Die zweite <b>If&#8230;Then<\/b>-Bedingung pr&uuml;ft zuerst, ob <b>bolBauteileEnthalten <\/b>den Wert <b>True <\/b>hat, denn dann m&uuml;ssen wir den Mitarbeiter fragen, ob die bereits erfolgten Zuweisungen von Bauteilen ebenfalls gel&ouml;scht werden sollen. Wird dies verneint, erh&auml;lt <b>bolLoeschen <\/b>den Wert <b>False<\/b>.<\/p>\n<p>Die in der letzten <b>If&#8230;Then<\/b>-Bedingung enthaltenen Anweisungen werden nur ausgef&uuml;hrt, wenn <b>bolLoeschen <\/b>den Wert <b>True <\/b>enth&auml;lt.<\/p>\n<p>In diesem Fall l&ouml;scht die Prozedur den entsprechenden Datensatz aus der Tabelle <b>tblBehaelter<\/b>.<\/p>\n<p>Anschlie&szlig;end werden die Inhalte von <b>lstBehaelter<\/b>, <b>lstInhaltAktualisieren <\/b>und <b>lstBauteileAktualisieren <\/b>aktualisiert.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Damit haben wir den recht komplexen Vorgang der Zuordnung von Elementen einer Bestellung zu verschiedenen Beh&auml;ltern abgebildet. In einem weiteren Beitrag namens <b>Verpackungsprozesse mit Access: Berichte <\/b>(<b>www.access-im-unternehmen.de\/1568<\/b>) geben wir die erfassten Informationen beispielsweise als Lieferschein und Packzettel in Form von Berichten aus.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>VerpackungsprozesseMitAccessVerwalten.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/BDF66B41-725D-4A7A-A326-1579EF79CC1F\/aiu_1567.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ein Kunde hatte neulich die Herausforderung, dass er Produkte bestehend aus einzelnen Bauteilen ausliefern m&ouml;chte und dabei erfassen muss, welche Bauteile in welcher Menge in den verschiedenen Versandkartons landen. Der Verpackungsvorgang im Lager erfolgt individuell und in einer Weise, dass die Mitarbeiter die einzelnen Bauteile so in Kartons f&uuml;llen, dass die Kartons optimal genutzt werden. W&auml;hrend des Verpackens sollen sie aufzeichnen, welcher Karton welche Bauteile enth&auml;lt, damit diese beim Empf&auml;nger so ausgepackt werden k&ouml;nnen, wie die Bauteile ben&ouml;tigt werden. In diesem Beitrag beschreiben wir zun&auml;chst, wie das Datenmodell f&uuml;r dieses Vorhaben aussieht und erstellen basierend darauf die notwendigen Formulare. Schlie&szlig;lich geben wir auch noch die St&uuml;cklisten f&uuml;r die verschiedenen Kartons per Bericht aus.<\/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":[662025,66052025,44000027],"tags":[],"class_list":["post-55001567","post","type-post","status-publish","format-standard","hentry","category-662025","category-66052025","category-Loesungen"],"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>Verpackungsprozesse mit Access: Formulare - 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\/Verpackungsprozesse_mit_Access_Formulare\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Verpackungsprozesse mit Access: Formulare\" \/>\n<meta property=\"og:description\" content=\"Ein Kunde hatte neulich die Herausforderung, dass er Produkte bestehend aus einzelnen Bauteilen ausliefern m&ouml;chte und dabei erfassen muss, welche Bauteile in welcher Menge in den verschiedenen Versandkartons landen. Der Verpackungsvorgang im Lager erfolgt individuell und in einer Weise, dass die Mitarbeiter die einzelnen Bauteile so in Kartons f&uuml;llen, dass die Kartons optimal genutzt werden. W&auml;hrend des Verpackens sollen sie aufzeichnen, welcher Karton welche Bauteile enth&auml;lt, damit diese beim Empf&auml;nger so ausgepackt werden k&ouml;nnen, wie die Bauteile ben&ouml;tigt werden. In diesem Beitrag beschreiben wir zun&auml;chst, wie das Datenmodell f&uuml;r dieses Vorhaben aussieht und erstellen basierend darauf die notwendigen Formulare. Schlie&szlig;lich geben wir auch noch die St&uuml;cklisten f&uuml;r die verschiedenen Kartons per Bericht aus.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Verpackungsprozesse_mit_Access_Formulare\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-18T07:31:32+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg01.met.vgwort.de\/na\/1d54b9bc153e4ee3aa6719bc3a41b108\" \/>\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=\"29\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Verpackungsprozesse_mit_Access_Formulare\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Verpackungsprozesse_mit_Access_Formulare\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Verpackungsprozesse mit Access: Formulare\",\"datePublished\":\"2025-12-18T07:31:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Verpackungsprozesse_mit_Access_Formulare\\\/\"},\"wordCount\":4779,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Verpackungsprozesse_mit_Access_Formulare\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/1d54b9bc153e4ee3aa6719bc3a41b108\",\"articleSection\":[\"2025\",\"5\\\/2025\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Verpackungsprozesse_mit_Access_Formulare\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Verpackungsprozesse_mit_Access_Formulare\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Verpackungsprozesse_mit_Access_Formulare\\\/\",\"name\":\"Verpackungsprozesse mit Access: Formulare - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Verpackungsprozesse_mit_Access_Formulare\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Verpackungsprozesse_mit_Access_Formulare\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/1d54b9bc153e4ee3aa6719bc3a41b108\",\"datePublished\":\"2025-12-18T07:31:32+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Verpackungsprozesse_mit_Access_Formulare\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Verpackungsprozesse_mit_Access_Formulare\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Verpackungsprozesse_mit_Access_Formulare\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/1d54b9bc153e4ee3aa6719bc3a41b108\",\"contentUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/1d54b9bc153e4ee3aa6719bc3a41b108\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Verpackungsprozesse_mit_Access_Formulare\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Verpackungsprozesse mit Access: Formulare\"}]},{\"@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":"Verpackungsprozesse mit Access: Formulare - 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\/Verpackungsprozesse_mit_Access_Formulare\/","og_locale":"de_DE","og_type":"article","og_title":"Verpackungsprozesse mit Access: Formulare","og_description":"Ein Kunde hatte neulich die Herausforderung, dass er Produkte bestehend aus einzelnen Bauteilen ausliefern m&ouml;chte und dabei erfassen muss, welche Bauteile in welcher Menge in den verschiedenen Versandkartons landen. Der Verpackungsvorgang im Lager erfolgt individuell und in einer Weise, dass die Mitarbeiter die einzelnen Bauteile so in Kartons f&uuml;llen, dass die Kartons optimal genutzt werden. W&auml;hrend des Verpackens sollen sie aufzeichnen, welcher Karton welche Bauteile enth&auml;lt, damit diese beim Empf&auml;nger so ausgepackt werden k&ouml;nnen, wie die Bauteile ben&ouml;tigt werden. In diesem Beitrag beschreiben wir zun&auml;chst, wie das Datenmodell f&uuml;r dieses Vorhaben aussieht und erstellen basierend darauf die notwendigen Formulare. Schlie&szlig;lich geben wir auch noch die St&uuml;cklisten f&uuml;r die verschiedenen Kartons per Bericht aus.","og_url":"https:\/\/access-im-unternehmen.de\/Verpackungsprozesse_mit_Access_Formulare\/","og_site_name":"Access im Unternehmen","article_published_time":"2025-12-18T07:31:32+00:00","og_image":[{"url":"http:\/\/vg01.met.vgwort.de\/na\/1d54b9bc153e4ee3aa6719bc3a41b108","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"29\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Verpackungsprozesse_mit_Access_Formulare\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Verpackungsprozesse_mit_Access_Formulare\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Verpackungsprozesse mit Access: Formulare","datePublished":"2025-12-18T07:31:32+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Verpackungsprozesse_mit_Access_Formulare\/"},"wordCount":4779,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Verpackungsprozesse_mit_Access_Formulare\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/1d54b9bc153e4ee3aa6719bc3a41b108","articleSection":["2025","5\/2025","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Verpackungsprozesse_mit_Access_Formulare\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Verpackungsprozesse_mit_Access_Formulare\/","url":"https:\/\/access-im-unternehmen.de\/Verpackungsprozesse_mit_Access_Formulare\/","name":"Verpackungsprozesse mit Access: Formulare - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Verpackungsprozesse_mit_Access_Formulare\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Verpackungsprozesse_mit_Access_Formulare\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/1d54b9bc153e4ee3aa6719bc3a41b108","datePublished":"2025-12-18T07:31:32+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Verpackungsprozesse_mit_Access_Formulare\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Verpackungsprozesse_mit_Access_Formulare\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Verpackungsprozesse_mit_Access_Formulare\/#primaryimage","url":"http:\/\/vg01.met.vgwort.de\/na\/1d54b9bc153e4ee3aa6719bc3a41b108","contentUrl":"http:\/\/vg01.met.vgwort.de\/na\/1d54b9bc153e4ee3aa6719bc3a41b108"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Verpackungsprozesse_mit_Access_Formulare\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Verpackungsprozesse mit Access: Formulare"}]},{"@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\/55001567","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=55001567"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001567\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001567"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001567"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001567"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}