{"id":55000334,"date":"2017-08-01T00:00:00","date_gmt":"2020-01-24T15:59:41","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=334"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Lokaler_Webshop_Teil_II","status":"publish","type":"post","link":"https:\/\/access-basics.de\/index.php\/Lokaler_Webshop_Teil_II.html","title":{"rendered":"Lokaler Webshop, Teil II"},"content":{"rendered":"<p class='introduction'>Nach dem Anzeigen der Artikel unseres in Access nachgebildeten Webshops der vorletzten Ausgabe geht es nun an das Bestellen der Produkte bei der <b>ABasics Computer GmbH<\/b>. F&uuml;r den hier ben&ouml;tigten Warenkorb, die Kasse und die Bestellvorg&auml;nge kommen ganz neue Formulare ins Spiel. Deren Design, Aufbau und Programmierung widmet sich dieser Beitrag, wobei allerlei Tricks und Kniffe nicht zu kurz kommen.<\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Die Beispiele dieses Artikels finden Sie in der Datenbank <b>1610_Web-shopII.zip<\/b>.<\/p>\n<h2>Bestellen im Webshop<\/h2>\n<p>Sie m&ouml;chten im Hauptformular <b>frmShop<\/b> der Anwendung einen Drucker bestellen. Nach Auswahl der Produktkategorie <b>Drucker<\/b> im Kombinationsfeld links oben, und nach Markierung der Unterkategorie <b>Tintenstrahler ab A3<\/b> im Listenfeld links, f&uuml;llt sich die Produktliste <b>lstArtikel<\/b> in der Mitte mit den verf&uuml;gbaren Produkten. Da Ihnen der Hersteller <b>Hewlett-Packard<\/b> am vertrauensw&uuml;rdigsten erscheint, filtern Sie diese Liste &uuml;ber das Kombinationsfeld rechts oben (siehe Bild 1). In dieser Combobox finden sich ausschlie&szlig;lich jene Hersteller, die auch in der Produktliste aufgef&uuml;hrt sind. Ihre Datenherkunft verh&auml;lt sich also dynamisch in Abh&auml;ngigkeit von der gew&auml;hlten Unterkategorie.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/frmShop_Filtered.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/frmShop_Filtered.png\" alt=\"So pr&auml;sentiert sich der Webshop nach dem Start des Formulars frmShop mit eingestellten Kategorien und einem Produkt\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 1: So pr&auml;sentiert sich der Webshop nach dem Start des Formulars frmShop mit eingestellten Kategorien und einem Produkt<\/p>\n<p>Listing 1 zeigt, wie sie bei Ausl&ouml;sen des Ereignisses <b>Nach Aktualisierung<\/b> des Listenfelds <b>lstKategorien<\/b> &uuml;ber einen neuen <b>SQL-Select-Ausdruck<\/b> festgelegt wird. Die <b>RowSource<\/b> des Steuerelements ist im Prinzip an die Tabelle <b>tblHersteller<\/b> gebunden. Damit aus dieser aber nur jene Datens&auml;tze ausgew&auml;hlt werden, die in ihrem Feld <b>ID<\/b> den gleichen Wert aufweisen, der auch in der Kategorienliste markiert ist (<b>lstKategorien.Value<\/b>), ben&ouml;tigen wir eine Zwischenabfrage, denn die Herstellertabelle kennt selbst keine Kategorien. Das ist ein sch&ouml;nes Beispiel f&uuml;r den Einsatz der <b>IN<\/b>-Klausel. Aus <b>tblArtikel<\/b> ermittelt die <b>Select<\/b>-Abfrage innerhalb der Klammer alle Datens&auml;tze, deren Kategorien (<b>IDKategorie<\/b>) mit dem markierten Eintrag des Listenfelds &uuml;bereinstimmen und gibt aus ihren nur jeweils die <b>IDHersteller<\/b> zur&uuml;ck. Befindet sich wiederum eine <b>ID<\/b> der Herstellertabelle <b>IN<\/b> diesem Pool, so ist die Bedingung positiv und der Datensatz mitsamt der Herstellerbezeichnung wird ausgegeben, so dass er im Kombinationsfeld erscheinen kann.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>lstKategorien_AfterUpdate()\r\n     ...\r\n     Me!cbHerstellerFilter.RowSource = \"SELECT * FROM tblHersteller \" & _\r\n         \"WHERE ID IN(SELECT IDHersteller FROM tblArtikel WHERE IDKategorie=\" & _\r\n         Me!lstKategorien.Value & \")\"\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p class='imagetext'>Listing 1: Setzen der Datenherkunft der Hersteller-Combobox cbHersteller<\/p>\n<p>Sie interessieren sich f&uuml;r den <b>Deskjet T730<\/b> und haben ihn in der Produktliste markiert. Seine Details gibt nun das Unterformular rechts im Bild wieder. Den Preis finden Sie OK und Sie klicken auf den Button I<b>n den Warenkorb<\/b>. Damit erscheint sogleich in einer <b>Msgbox<\/b> die Info aus Bild 2. Klicken Sie erneut auf den Button, so zeigt sich eine abweichende Meldung (Bild 3).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/MsgInWarenkorb.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/MsgInWarenkorb.png\" alt=\"Info zum Warenkorb\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 2: Info zum Warenkorb<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/MsgInWarenkorb2.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/MsgInWarenkorb2.png\" alt=\"Info zum Warenkorb bei wiederholtem Hinzuf&uuml;gen\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 3: Info zum Warenkorb bei wiederholtem Hinzuf&uuml;gen<\/p>\n<p>Die beim Klicken auf den Button <b>cmdAdd<\/b> ausgel&ouml;ste Prozedur finden Sie in Listing 2.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAdd_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>n<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>ID<span style=\"color:blue;\"> As Long<\/span>\r\n     \r\n     n = Nz(DLookup(\"Anzahl\", \"tblBestellDetails\", \"ArtikelID=\" & Me!ID.Value & _\r\n            \" AND BestellID=\" & BestellID))\r\n     <span style=\"color:blue;\">If <\/span>n = 0<span style=\"color:blue;\"> Then<\/span>\r\n         CurDB.Execute \"INSERT INTO tblBestellDetails\" & _\r\n                       \" (BestellID,ArtikelID,Anzahl,Netto,Ust)\" & _\r\n                       \" VALUES (\" & BestellID & \",\" & Me!ID.Value & \",1,\" & _\r\n                       Str(Me!Netto.Value) & \",\" & Str(Me!USt.Value) & \")\"\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Sie haben '\" & Me!Produkt & \"' in den Warenkorb gelegt.\", vbInformation\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         ID = DLookup(\"ID\", \"tblBestellDetails\", \"ArtikelID=\" & Me!ID.Value & _\r\n              \" AND BestellID=\" & BestellID)\r\n         CurDB.Execute \"UPDATE tblBestellDetails SET Anzahl=\" & (n + 1) & _\r\n                       \" WHERE ID=\" & ID\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Sie haben die Anzahl von '\" & Me!Produkt & \"' im Warenkorb erh&ouml;ht.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Me!cbWarenkorb.Requery\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p class='imagetext'>Listing 2: Das Legen eines Produkts in den Warenkorb &uuml;ber den Button cmdAdd<\/p>\n<p>In der ersten Zeile ermittelt eine <b>DLookup<\/b>-Funktion zun&auml;chst die Anzahl jener Artikel, die sich bereits in der Bestellung befinden, wobei nach dem aktuell ausgew&auml;hlten Produkt (<b>ArtikelID = Me!ID<\/b>) und nach der momentanen Bestellung (<b>BestellID<\/b>) gefiltert wird. Im ersten Betrag wurde erl&auml;utert, dass schon beim &ouml;ffnen des Shop-Formulars ein tempor&auml;rer Bestelldatensatz in der Tabelle <b>tblBestellDetails<\/b> angelegt und ein Verweis auf dessen <b>ID<\/b> in der  globalen Variablen <b>BestellID<\/b>  abgespeichert wird. Hier nun kommt diese <b>ID<\/b> zum Tragen. Ist der Artikel bereits in der Bestellung vorhanden, so gibt <b>DLookup<\/b> einen von <b>0<\/b> abweichenden Wert zur&uuml;ck und weist diesen der Variablen <b>n<\/b> zu. Die Prozedur verzweigt jetzt in Abh&auml;ngigkeit von diesem Wert.<\/p>\n<p>Ist der Artikel neu, was den einfacheren Fall darstellt so findet das Einf&uuml;gen eines Datensatzes &uuml;ber die<b> INSERT INTO<\/b>-Anweisung statt. Ihr werden als Feldparameter die aktuelle <b>BestellID<\/b>, der Preis (<b>Me!Netto<\/b>) und der Umsatzsteuersatz (<b>Me!Ust<\/b>) verabreicht. Diese letzten beiden Werte k&ouml;nnen nicht aus der Artikeltabelle entnommen werden! Denn bald k&ouml;nnte sich der Preis ja &auml;ndern, was bei Bearbeitung der Bestellung zu einer erh&ouml;hten Summe f&uuml;hren w&uuml;rde.<\/p>\n<p>Hier muss der aktuelle Preis gelten, weshalb er fest in den Bestelldatensatz gespeichert werden muss. Die anschlie&szlig;ende <b>MsgBox<\/b> zeigt nun lediglich das Produkt (<b>Me!Produkt<\/b>) in einem entsprechenden Text an.<\/p>\n<p>Ist der Artikel in der Bestellung bereits vorhanden, also der Wert von <b>n<\/b> ungleich <b>0<\/b>, so f&uuml;hrt sich der n&auml;chste Zweig der Prozedur aus. Hier muss erst ermittelt werden, welche <b>ID<\/b> der betreffende Bestelldatensatz hat, wobei abermals eine <b>DLookup<\/b>-Funktion verwendet wird. Anschlie&szlig;end erh&ouml;ht eine <b>SQL-UPDATE<\/b>-Anweisung den Wert des Felds Anzahl im gefundenen Datensatz. Die Meldung sieht nun geringf&uuml;gig anders aus.<\/p>\n<p>Auf die Bedeutung der letzten Zeile, die ein Requery auf das Kombinationsfeld <b>cbWarenkorb<\/b> ausl&ouml;st, kommen wir gleich zu sprechen.<\/p>\n<p>Die SQL-Anweisungen geschehen &uuml;brigens &uuml;ber die Objektvariable <b>CurDB<\/b>. Das ist tats&auml;chlich eine Funktion, die nur die Access-Eigenschaft <b>CurrentDb<\/b> ersetzt. Sie befindet sich im Modul <b>mdlShop<\/b> der Datenbank (Listing 3). Die im Kopf des Moduls deklarierte Objektvariable <b>thisdb<\/b> bekommt beim ersten Aufruf der Funktion den Inhalt von <b>CurrentDb<\/b> verpasst. Forthin gibt sie deren Wert zur&uuml;ck. Der Vorteil der Funktion ist, neben k&uuml;rzerer Schreibweise, eine bessere Performance.<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>thisdb<span style=\"color:blue;\"> As <\/span>Database \r\n<span style=\"color:blue;\">Function <\/span>CurDB()<span style=\"color:blue;\"> As <\/span>Database\r\n     <span style=\"color:blue;\">If <\/span>thisdb Is Nothing<span style=\"color:blue;\"> Then<\/span> <span style=\"color:blue;\">Set<\/span> thisdb = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> CurDB = thisdb\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p class='imagetext'>Listing 3: CurDB gibt die aus CurrentDb erhaltene Objektvariable thisdb zur&uuml;ck<\/p>\n<h2>Artikel im Warenkorb<\/h2>\n<p>F&uuml;r den Warenkorb ist dieselbe Tabelle verantwortlich, wie f&uuml;r die Bestellungen: <b>tblBestelldetails<\/b>. Ohne das Formular f&uuml;r den Warenkorb zu &ouml;ffnen k&ouml;nnen bereits im Shop-Formular die hinzugef&uuml;gten Artikel inspiziert werden. Dazu klicken Sie mit der Maus auf den Button Warenkorb rechts. Sogleich klappt eine Combobox mit der Liste der bestellten Produkte auf (Bild 4). Der Vorgang mag ungew&ouml;hnlich sein. In Webshops passiert dies h&auml;ufig beim &uuml;berfahren der Maus auf ein Warenkorbsymbol. Dies nachzustellen w&auml;re hier des Aufwands etwas zu viel gewesen. Die Combobox soll gen&uuml;gen. Ihre Datenherkunft ist an eine Abfrage gebunden, die folgenden Text hat:<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/cbWarenkorb.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/cbWarenkorb.png\" alt=\"Der Inhalt des Warenkorbs kann &uuml;ber eine Combobox eingesehen werden, die sich hinter dem Button befindet\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 4: Der Inhalt des Warenkorbs kann &uuml;ber eine Combobox eingesehen werden, die sich hinter dem Button befindet<\/p>\n<pre>SELECT \r\n   \"- \" & [tblArtikel].[Produkt] AS P,\r\n   tblArtikel.ID,\r\n   tblArtikel.IDKategorie,\r\n   tblBestellDetails.BestellID\r\nFROM tblArtikel\r\nINNER JOIN\r\ntblBestellDetails ON tblArtikel.ID =\r\n    tblBestellDetails.ArtikelID\r\nWHERE tblBestellDetails.BestellID = \r\n   [Forms]![frmShop]![txtBestellID]<\/pre>\n<p>Die Datens&auml;tze bilden sich &uuml;ber den <b>JOIN<\/b> aus der Verkn&uuml;pfung zwischen <b>tblBestellDetails<\/b> mit <b>tblArtikel<\/b>. Da nur die aktuelle Bestellung ber&uuml;cksichtigt werden soll, filtert die <b>WHERE<\/b>-Bedingung nach der <b>BestellID<\/b>. Und die kommt direkt aus dem Formular <b>frmShop<\/b>, in dem das unsichtbare Textfeld <b>txtBestellID<\/b> vorhanden ist. Superelegant ist derlei nicht, aber als Datenherkunft f&uuml;r ein Kombinationsfeld innerhalb des Formulars ist so ein fester Bezug durchaus akzeptabel. Die <b>Requery<\/b>-Anweisung auf <b>cbWarenkorb<\/b> f&uuml;hrt zur Neuauswertung der SQL-Abfrage, so dass ihr Datenbestand immer aktuell ist.<\/p>\n<p>Das Ausklappen der Combobox erledigt die Routine in Listing 4. Bei Rechtsklick auf die Schaltfl&auml;che <b>Warenkorb<\/b> (<b>cmdWarenkorb<\/b>)  ereignet sich das <b>MouseDown<\/b>-Event. Steht der Parameter <b>Button<\/b> auf <b>2<\/b>, so handelt es sich um die rechte Maustaste. Dann stellt die Prozedur den Fokus auf die Combobox <b>cbWarenkorb<\/b> und bewirkt &uuml;ber die Methode <b>Dropdown<\/b> deren Ausklappen. Sie ger&auml;t dadurch in den Vordergrund, obwohl sie im Formularentwurf in den Hintergrund verfrachtet wurde. Bei Verlassen des Steuerelements wird automatisch wieder der Ausgangszustand hergestellt.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdWarenkorb_MouseDown(Button<span style=\"color:blue;\"> As Integer<\/span>, Shift<span style=\"color:blue;\"> As Integer<\/span>, _\r\n                                    X<span style=\"color:blue;\"> As Single<\/span>, Y<span style=\"color:blue;\"> As Single<\/span>)\r\n     <span style=\"color:blue;\">If <\/span>Button = 2<span style=\"color:blue;\"> Then<\/span>\r\n         Me!cbWarenkorb.SetFocus\r\n         Me!cbWarenkorb.Dropdown\r\n     <span style=\"color:blue;\">End If<\/span>\r\nEnd SUb<\/pre>\n<p class='imagetext'>Listing 4: Ausklappen der Combobox beim Maustaste Ab-Ereignis des Buttons<\/p>\n<p>Beim normalen Linksklick auf den Button <b>Warenkorb<\/b> ruft dieser die <b>Click<\/b>-Prozedur auf und &ouml;ffnet das Formular <b>frmWarenkorb<\/b> (Bild 5).<\/p>\n<p>Allerdings auch nur dann, wenn sich im Warenkorb Artikel befinden. Ansonsten erfolgt eine Meldung, dass der Warenkorb leer sei. Die erste Zeile in Listing 5 wertet &uuml;ber <b>COUNT(*)<\/b> aus, wie viele Datens&auml;tze die Tabelle <b>tblBestellDetails<\/b> zur aktuellen <b>BestellID<\/b> aufweist. Ist die Anzahl <b>0<\/b>, so kommt es zur Meldung und andernfalls zum &ouml;ffnen des Formulars.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdWarenkorb_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>n<span style=\"color:blue;\"> As Long<\/span>\r\n     \r\n     n = CurDB.OpenRecordset(\"SELECT COUNT(*) FROM tblBestellDetails\" & _\r\n                             \" WHERE BestellID=\" & BestellID)(0)\r\n     <span style=\"color:blue;\">If <\/span>n = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Ihr Warenkorb ist leer!\", vbExclamation, sLogo\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         DoCmd.OpenForm \"frmWarenkorb\", , , , , , BestellID\r\n     <span style=\"color:blue;\">End If<\/span>\r\nEnd SUb<\/pre>\n<p class='imagetext'>Listing 5: Das Starten des Warenkorbformulars h&auml;ngt von der Anzahl der aktuell bestellten Artikel in tblBestellDetails ab<\/p>\n<h2>Warenkorbformular<\/h2>\n<p>Das gestartete Warenkorbformular <b>frmWarenkorb<\/b> (Bild 5) weist die folgenden Grundeinstellungen auf. Die Eigenschaft <b>Popup<\/b> steht auf <b>Ja<\/b> und die Eigenschaft <b>Gebunden<\/b> ebenfalls.  Dadurch steht es im Vordergrund vor dem Shop-Formular, auf welches nun kein Zugriff mehr m&ouml;glich ist. Als Ansichtsmodus ist <b>Endlosformular<\/b> vorgesehen. Im Detailbereich finden sich die Felder f&uuml;r die Bestelldetails, also die Produkte mit deren Artikelnummer, der Bezeichnung, der gew&uuml;nschten Anzahl, dem Preis und der Verf&uuml;gbarkeit. Bis auf das Steuerelement f&uuml;r die <b>Anzahl<\/b> sind alle weiteren gesperrt (Eigenschaftenblatt f&uuml;r das Steuerelement | <b>Daten | Gesperrt<\/b> = <b>Ja<\/b>). Die Anzahl kann der Kunde im Warenkorb noch &auml;ndern.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/frmWarenkorb.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/frmWarenkorb.png\" alt=\"So etwa zeigt sich das Formular frmWarenkorb mit zwei bestellten Produkten\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 5: So etwa zeigt sich das Formular frmWarenkorb mit zwei bestellten Produkten<\/p>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Access &#091;basics&#093;<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/282\/access-basics?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 400 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000334\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/index.php\/data\/wp\/v2\/posts\/55000334?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000334\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"8d63f6cbe9\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nach dem Anzeigen der Artikel unseres in Access nachgebildeten Webshops der vorletzten Ausgabe geht es nun an das Bestellen der Produkte bei der <b>ABasics Computer GmbH<\/b>. F&uuml;r den hier ben&ouml;tigten Warenkorb, die Kasse und die Bestellvorg&auml;nge kommen ganz neue Formulare ins Spiel. Deren Design, Aufbau und Programmierung widmet sich dieser Beitrag, wobei allerlei Tricks und Kniffe nicht zu kurz kommen.<\/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":[66102016,662016,44000014],"tags":[],"class_list":["post-55000334","post","type-post","status-publish","format-standard","hentry","category-66102016","category-662016","category-Loesungen"],"aioseo_notices":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v15.9.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Lokaler Webshop, Teil II - Access [basics]<\/title>\n<meta name=\"description\" content=\"Nach dem Anzeigen der Artikel unseres in Access nachgebildeten Webshops der vorletzten Ausgabe geht es nun an das Bestellen der Produkte bei der ABasics Computer GmbH. F\u00fcr den hier ben\u00f6tigten Warenkorb, die Kasse und die Bestellvorg\u00e4nge kommen ganz neue Formulare ins Spiel. Deren Design, Aufbau und Programmierung widmet sich dieser Beitrag, wobei allerlei Tricks und Kniffe nicht zu kurz kommen.\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-basics.de\/index.php\/Lokaler_Webshop_Teil_II.html\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Lokaler Webshop, Teil II - Access [basics]\" \/>\n<meta property=\"og:description\" content=\"Nach dem Anzeigen der Artikel unseres in Access nachgebildeten Webshops der vorletzten Ausgabe geht es nun an das Bestellen der Produkte bei der ABasics Computer GmbH. F\u00fcr den hier ben\u00f6tigten Warenkorb, die Kasse und die Bestellvorg\u00e4nge kommen ganz neue Formulare ins Spiel. Deren Design, Aufbau und Programmierung widmet sich dieser Beitrag, wobei allerlei Tricks und Kniffe nicht zu kurz kommen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-basics.de\/index.php\/Lokaler_Webshop_Teil_II.html\" \/>\n<meta property=\"og:site_name\" content=\"Access [basics]\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-24T15:59:41+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"-0001-11-30T00:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/..\/tl_files\/images\/frmShop_Filtered.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\">\n\t<meta name=\"twitter:data1\" content=\"23\u00a0Minuten\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/access-basics.de\/#website\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Access [basics]\",\"description\":\"DAS ACCESS-MAGAZIN F\\u00dcR ALLE, DIE VON 0 AUF 100 WOLLEN\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/access-basics.de\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Lokaler_Webshop_Teil_II.html#primaryimage\",\"inLanguage\":\"de\",\"url\":\"..\/tl_files\/images\/frmShop_Filtered.png\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Lokaler_Webshop_Teil_II.html#webpage\",\"url\":\"https:\/\/access-basics.de\/index.php\/Lokaler_Webshop_Teil_II.html\",\"name\":\"Lokaler Webshop, Teil II - Access [basics]\",\"isPartOf\":{\"@id\":\"https:\/\/access-basics.de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Lokaler_Webshop_Teil_II.html#primaryimage\"},\"datePublished\":\"2020-01-24T15:59:41+00:00\",\"dateModified\":\"-0001-11-30T00:00:00+00:00\",\"author\":{\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\"},\"description\":\"Nach dem Anzeigen der Artikel unseres in Access nachgebildeten Webshops der vorletzten Ausgabe geht es nun an das Bestellen der Produkte bei der ABasics Computer GmbH. F\\u00fcr den hier ben\\u00f6tigten Warenkorb, die Kasse und die Bestellvorg\\u00e4nge kommen ganz neue Formulare ins Spiel. Deren Design, Aufbau und Programmierung widmet sich dieser Beitrag, wobei allerlei Tricks und Kniffe nicht zu kurz kommen.\",\"breadcrumb\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Lokaler_Webshop_Teil_II.html#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/access-basics.de\/index.php\/Lokaler_Webshop_Teil_II.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Lokaler_Webshop_Teil_II.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Lokaler_Webshop_Teil_II.html\",\"url\":\"https:\/\/access-basics.de\/index.php\/Lokaler_Webshop_Teil_II.html\",\"name\":\"Lokaler Webshop, Teil II\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/#personlogo\",\"inLanguage\":\"de\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","_links":{"self":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000334","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/comments?post=55000334"}],"version-history":[{"count":0,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000334\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/media?parent=55000334"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/categories?post=55000334"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/tags?post=55000334"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}