{"id":55000084,"date":"2017-04-01T00:00:00","date_gmt":"2020-03-27T19:26:06","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=84"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"EDM_Bestellungen_und_Bestellpositionen","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/EDM_Bestellungen_und_Bestellpositionen\/","title":{"rendered":"EDM: Bestellungen und Bestellpositionen"},"content":{"rendered":"<p><b>Auch in dieser Ausgabe geht es mit unserer Beispiell&ouml;sung Bestellverwaltung weiter. Nachdem wir bereits Kunden, Produkte und Kategorien verwalten k&ouml;nnen, nehmen wir uns nun die Bestellungen und Bestellpositionen vor. Dabei brauchen wir ein paar neue Seiten, um die Details einer Bestellung mit den Bestellpositionen und die Details einer neuen oder zu bearbeitenden Bestellposition anzuzeigen. Damit werden wir erstmal die Bearbeitung von Daten einer m:n-Beziehung erm&ouml;glichen.<\/b><\/p>\n<h2>Neue Funktionen<\/h2>\n<p>Die neue Version der Bestellverwaltung enth&auml;lt wieder eine neue Gruppe im Ribbon, mit der zwei neue Seiten ge&ouml;ffnet werden k&ouml;nnen. Die erste davon ist eine &Uuml;bersicht der Bestellungen in absteigender Reihenfolge nach dem Bestelldatum (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_84_001.png\" alt=\"&Uuml;bersicht der Bestellungen\" width=\"599,593\" height=\"337,3914\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: &Uuml;bersicht der Bestellungen<\/span><\/b><\/p>\n<p>Hier kann der Benutzer die aktuell markierte Bestellung per Mausklick l&ouml;schen oder auch eine neue Bestellung anlegen. Per Doppelklick l&auml;sst sich die angeklickte Bestellung &ouml;ffnen (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_84_002.png\" alt=\"Bestellung in der Detailansicht\" width=\"599,593\" height=\"416,4374\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Bestellung in der Detailansicht<\/span><\/b><\/p>\n<p>Ein Klick auf den Ribbon-Eintrag <b>Neue Bestellung <\/b>soll den Dialog mit den Bestelldetails f&uuml;r eine neue Bestellung anzeigen, wobei direkt das Kombinationsfeld zur Auswahl des Kunden f&uuml;r diese Bestellung ausgeklappt wird (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_84_003.png\" alt=\"Anlegen einer neuen Bestellung\" width=\"599,593\" height=\"416,4374\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Anlegen einer neuen Bestellung<\/span><\/b><\/p>\n<p>Auch wenn der Benutzer mit einem Klick auf die Schaltfl&auml;che <b>Neue Bestellposition <\/b>klickt, soll sich direkt das Kombinationsfeld zur Auswahl des betroffenen Produkts &ouml;ffnen und die schnelle Auswahl erleichtern.<\/p>\n<p>Wenn der Benutzer dann das gew&uuml;nschte Produkt ausgew&auml;hlt hat, sollen direkt die Werte der Felder <b>Einzelpreis<\/b>, <b>Mehrwertsteuersatz <\/b>und <b>Gewicht <\/b>aus der Tabelle <b>Produkte <\/b>in den neuen Datensatz der Tabelle <b>tblBestellpositionen <\/b>&uuml;bernommen werden.<\/p>\n<p>Die Detailseite f&uuml;r eine Bestellposition, wie sie nach einem Doppelklick auf einen der Eintr&auml;ge der Seite mit den Bestelldetails aussieht, finden Sie in Bild 4.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_84_004.png\" alt=\"Bearbeiten einer Bestellposition\" width=\"549,6265\" height=\"369,3776\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Bearbeiten einer Bestellposition<\/span><\/b><\/p>\n<h2>Datenbankerweiterungen<\/h2>\n<p>F&uuml;r diese neue Version der Bestellverwaltung haben wir ein paar kleine &Auml;nderungen am Datenmodell der SQLite-Datenbank <b>Bestellungen.db <\/b>vorgenommen. Dabei sind wir auf zwei Probleme gesto&szlig;en, die wir wie folgt gel&ouml;st haben:<\/p>\n<ul>\n<li>Mit dem <b>DBBrowser for SQLite <\/b>konnten wir in manchen F&auml;llen keine Zahlenfelder zu einer bestehenden Tabelle hinzuf&uuml;gen. Dies f&uuml;hrt im schlimmsten Fall zum Leeren der kompletten Datenbank. Wir sind dann zu einem anderen Tool namens <b>SQLiteStudio <\/b>gewechselt (<b>sqlitestudio.pl<\/b>), welches die &Auml;nderungen klaglos vorgenommen hat.<\/li>\n<li>Als wir die &Auml;nderungen an der Datenbank in das Entity Data Model &uuml;bernehmen wollten, gab es ebenfalls Probleme. Die &Auml;nderungen &uuml;bernehmen Sie, indem Sie das Entity Data Model (Datei <b>BestellverwaltungEntities.edmx<\/b>) &ouml;ffnen und dann den Kontextmen&uuml;eintrag <b>Modell aus der Datenbank aktualisieren &#8230; <\/b>ausw&auml;hlen. Die nachfolgende Fehlermeldung, deren Text mit <b>[A]System.Data.SQLite.SQLiteConnection cannot be cast to [B]System.Data.SQLite.SQLiteConnection. <\/b>begann, wurde behoben, nachdem wir die aktuelle Version des NuGet-Pakets <b>System.Data.SQLite <\/b>sowie die aktuelle Runtime-Komponente von der Internetseite <b>https:\/\/system.data.sqlite.org\/index.html\/doc\/trunk\/www\/downloads.wiki <\/b>installiert und Visual Studio dann neu gestartet haben.<\/li>\n<\/ul>\n<h2>Hinzuf&uuml;gen der neuen Ribbon-Elemente<\/h2>\n<p>Dieser Teil bringt keine neuen Techniken. Die beiden neu hinzugef&uuml;gten Ribbon-Schaltfl&auml;chen hei&szlig;en <b>btnNeueBestellung <\/b>und <b>btnBestelluebersicht <\/b>und laden die Seiten <b>BestellungDetails.xaml <\/b>beziehungsweise <b>BestellungUebersicht.xaml <\/b>in das <b>Frame<\/b>-Element namens <b>Workzone<\/b>.<\/p>\n<p>Die Schaltfl&auml;che <b>btnBestelluebersicht <\/b>l&ouml;st die folgende Ereignismethode aus:<\/p>\n<pre>private void btnBestelluebersicht_Click(object sender, RoutedEventArgs e) {\r\n     ShowBestellungenUebersicht();\r\n}<\/pre>\n<p>Die hier aufgerufene Methode <b>ShowBestellungenUebersicht<\/b> verwendet den optionalen Parameter <b>bestellungID<\/b>, der beim Aufruf nach dem &Auml;ndern oder Neuanlegen einer Bestellung &uuml;bergeben werden kann, damit der ge&auml;nderte oder neu angelegte Eintrag im DataGrid markiert werden kann.<\/p>\n<p>Wurde die Seite <b>BestellungUebersicht <\/b>noch nicht erstellt oder gab es eine &Auml;nderung bei einer der Bestellungen, wird die Seite neu erstellt und die Variable <b>BestellungChanged <\/b>auf <b>false <\/b>eingestellt. Anschlie&szlig;end abonniert die Klasse <b>MainWindow.xaml.cs <\/b>die beiden Ereignisse <b>ItemDoubleClicked <\/b>und <b>NewItem <\/b>der Klasse <b>BestellungUebersicht.xaml.cs<\/b>. Schlie&szlig;lich wird die Seite, egal ob neu erzeugt oder bereits vorhanden, im <b>Frame<\/b>-Steuerelement <b>Workzone <\/b>angezeigt:<\/p>\n<pre>private void ShowBestellungenUebersicht(long bestellungID = 0) {\r\n     if (bestellungUebersicht == null | BestellungChanged == true) {\r\n         bestellungUebersicht = new BestellungUebersicht(bestellungID);\r\n         BestellungChanged = false;\r\n     }\r\n     bestellungUebersicht.ItemDoubleClicked += new BestellungUebersicht.EventHandlerItemDoubleClicked(OnBestellungDoubleClicked);\r\n     bestellungUebersicht.NewItem += new BestellungUebersicht.EventHandlerNewItem(OnNewBestellung);\r\n     WorkZone.Content = bestellungUebersicht;\r\n}<\/pre>\n<h2>&Uuml;bersicht der Bestellungen<\/h2>\n<p>Schauen wir uns erst die Seite <b>BestellungUebersicht.xaml <\/b>an. Diese enth&auml;lt unter anderem ein DataGrid mit drei Spalten, die wie folgt definiert werden. Interessant ist hier wieder die in eine Ressource des <b>DataGrid<\/b>-Elements ausgelagerte Ereignisdefinition f&uuml;r das Ereignis <b>MouseDoubleClick<\/b>, welches die Methode <b>Row_DoubleClick <\/b>aufrufen soll.<\/p>\n<p>Au&szlig;erdem haben wir hier die beiden Felder <b>Nachname <\/b>und <b>Vorname <\/b>der Auflistung <b>Kunden <\/b>des <b>Bestellung<\/b>-Objekts in einem <b>MultiBinding<\/b>-Element zusammengefasst:<\/p>\n<pre>&lt;DataGrid x:Name=\"dgBestellungen\" ItemsSource=\"{Binding Bestellungen}\" AutoGenerateColumns=\"false\" CanUserAddRows=\"False\" Grid.Row=\"0\"&gt;\r\n     &lt;DataGrid.Columns&gt;\r\n         &lt;DataGridTextColumn Binding=\"{Binding Path=ID}\" Header=\"ID\"  \/&gt;\r\n         &lt;DataGridTextColumn Binding=\"{Binding Path=Bestelldatum, StringFormat=\\{0:dd.MM.yyyy\\}}\" Header=\"Bestelldatum\" \/&gt;\r\n         &lt;DataGridTextColumn Header=\"Kunde Multibinding\"&gt;\r\n             &lt;DataGridTextColumn.Binding&gt;\r\n                 &lt;MultiBinding StringFormat=\"{}{0}, {1}\"&gt;\r\n                     &lt;Binding Path=\"Kunden.Nachname\" \/&gt;\r\n                     &lt;Binding Path=\"Kunden.Vorname\" \/&gt;\r\n                 &lt;\/MultiBinding&gt;\r\n             &lt;\/DataGridTextColumn.Binding&gt;\r\n         &lt;\/DataGridTextColumn&gt;\r\n         &lt;DataGridTextColumn Binding=\"{Binding Path=Kunde}\" Header=\"Kunde\" \/&gt;\r\n     &lt;\/DataGrid.Columns&gt;\r\n     &lt;DataGrid.Resources&gt;\r\n         &lt;Style TargetType=\"DataGridRow\"&gt;\r\n             &lt;EventSetter Event=\"MouseDoubleClick\" Handler=\"Row_DoubleClick\"\/&gt;\r\n         &lt;\/Style&gt;\r\n     &lt;\/DataGrid.Resources&gt;\r\n&lt;\/DataGrid&gt;<\/pre>\n<p>Das DataGrid wird mit den Bestellungen aus einer <b>ObservableCollection <\/b>namens <b>bestellungen <\/b>mit Elementen des Typs <b>Bestellung <\/b>gef&uuml;ttert, und zwar &uuml;ber die &ouml;ffentliche Eigenschaft <b>Bestellungen<\/b>:<\/p>\n<pre>private ObservableCollection&lt;Bestellung&gt; bestellungen;\r\npublic ObservableCollection&lt;Bestellung&gt; Bestellungen {\r\n     get { return bestellungen; }\r\n     set { bestellungen = value; }\r\n}<\/pre>\n<p>In der Konstruktor-Methode <b>BestellungUebersicht <\/b>erstellen wir das <b>dbContext<\/b>-Element und f&uuml;llen die Collection <b>bestellungen<\/b>:<\/p>\n<pre>public BestellungUebersicht(long bestellungID = 0) {\r\n     InitializeComponent();\r\n     dbContext = new BestellverwaltungEntities();\r\n     bestellungen = new ObservableCollection&lt;Bestellung&gt;(dbContext.Bestellungen.OrderByDescending(c =&gt; c.Bestelldatum));\r\n     DataContext = this;\r\n     if (bestellungID != 0) {\r\n         Bestellung currentBestellung = dbContext.Bestellungen.Find(bestellungID);\r\n         dgBestellungen.Focus();\r\n         dgBestellungen.SelectedItem = currentBestellung;\r\n         dgBestellungen.ScrollIntoView(currentBestellung);\r\n     }\r\n}<\/pre>\n<h2>Neue Bestellung anlegen<\/h2>\n<p>Ein Klick auf die Schaltfl&auml;che <b>btnNeu <\/b>der Seite <b>BestellungUebersicht.xaml <\/b>l&ouml;st die folgende Methode aus, welche wiederum das Ereignis <b>NewItem <\/b>aufruft:<\/p>\n<pre>private void btnNeu_Click(object sender, RoutedEventArgs e) {\r\n     NewItem(this, null);\r\n}<\/pre>\n<p><b>NewItem <\/b>ist wie folgt in <b>BestellungUebersicht.xaml.cs <\/b>definiert:<\/p>\n<pre>public delegate void EventHandlerNewItem(object sender, System.EventArgs e);\r\npublic event EventHandlerNewItem NewItem;<\/pre>\n<p>Das Ereignis <b>NewItem <\/b>wird im &uuml;bergeordneten Fenster-Element <b>MainWindow.xaml <\/b>abonniert, sobald der Benutzer auf die Ribbon-Schaltfl&auml;che <b>btnBestelluebersicht <\/b>klickt (mehr siehe in den Methoden <b>btnBestelluebersicht_Click <\/b>und <b>ShowBestellungenUebersicht <\/b>in der Datei <b>MainWindow.xaml.cs<\/b>). Das Ereignis wird in <b>MainWindow.xaml.cs <\/b>durch die folgende Ereignisprozedur implementiert:<\/p>\n<pre>private void OnNewBestellung(object sender, EventArgs e) {\r\n     BestelldetailsAnzeigen();\r\n}<\/pre>\n<p>Damit steigen wir in die Methode <b>BestelldetailsAnzeigen <\/b>ein, die wir ebenfalls in der Klasse <b>MainWindow.xaml.cs <\/b>finden. Diese erstellt ein neues Objekt auf Basis der Seite <b>BestelldetailsAnzeigen <\/b>und &uuml;bergibt den Parameter <b>bestellungID<\/b>, der hier <b>0 <\/b>ist. Dann abonniert sie vier Ereignisse, n&auml;mlich <b>ItemChanged<\/b>, <b>Cancelled<\/b>, <b>NewItem <\/b>und <b>ItemDoubleClicked<\/b>. Die ersten beiden sind f&uuml;r die beiden Schaltfl&auml;chen <b>Speichern <\/b>und <b>Verwerfen<\/b>, die hinteren beiden f&uuml;r die Schaltfl&auml;chen <b>Neue Bestellposition <\/b>und <b>Bestellposition l&ouml;schen<\/b>, die zum DataGrid zur Anzeige der Bestellpositionen geh&ouml;ren (siehe Bild 5). Nach dem Abonnieren der Ereignisse weist die Methode das neu erstellte <b>Page<\/b>-Objekt auf Basis der Klasse <b>BestellungDetails <\/b>noch der Eigenschaft <b>Content <\/b>des <b>Frame<\/b>-Objekts <b>Workzone <\/b>zu, welches die Seite dann anzeigt:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_84_006.png\" alt=\"Entwurf der Bestelldetails samt DataGrid f&uuml;r die Bestellpositionen\" width=\"349,7625\" height=\"351,9553\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Entwurf der Bestelldetails samt DataGrid f&uuml;r die Bestellpositionen<\/span><\/b><\/p>\n<pre>private void BestelldetailsAnzeigen(long bestellungID = 0) {\r\n     bestellungDetails = new BestellungDetails(bestellungID);\r\n     bestellungDetails.ItemChanged += new BestellungDetails.EventHandlerItemChanged(OnBestellungChanged);\r\n     bestellungDetails.Cancelled += new BestellungDetails.EventHandlerCancelled(OnBestellungCancelled);\r\n     bestellungDetails.NewItem += new BestellungDetails.EventHandlerNewItem(OnNewBestellposition);\r\n     bestellungDetails.ItemDoubleClicked += new BestellungDetails.EventHandlerItemDoubleClicked(OnBestellpositionDoubleClicked);\r\n     WorkZone.Content = bestellungDetails;\r\n}<\/pre>\n<h2>Felder in den Bestelldetails definieren<\/h2>\n<p>Die Seite <b>BestellungDetails.xaml <\/b>besteht aus drei Bereichen: den oberen Steuerelementen zur Eingabe der Bestelldetails, dem DataGrid zur Anzeige der Bestellpositionen und den Schaltfl&auml;chen zum Hinzuf&uuml;gen und L&ouml;schen von Bestellpositionen sowie den beiden Schaltfl&auml;chen zum Speichern oder Verwerfen des aktuell angezeigten Objekts aus der Tabelle <b>Bestellungen<\/b>. Schauen wir uns zun&auml;chst die drei Steuer-elemente an. Die TextBox mit dem Bezeichnungsfeld <b>ID <\/b>ist an das Feld <b>Bestellung.ID <\/b>gebunden. Das hei&szlig;t, dass wir in der Code behind-Datei ein Objekt namens <b>Bestellung <\/b>bereitstellen m&uuml;ssen &#8211; dazu sp&auml;ter mehr. Interessant ist die ComboBox. Hier haben wir nicht wie &uuml;blich nur ein einziges Feld als anzuzeigenden Inhalt angegeben, sondern einen aus den beiden Feldern <b>Nachname <\/b>und <b>Vorname <\/b>bestehenden Ausdruck, also etwa <b>Minhorst, Andr&eacute;<\/b>. Dies erledigen wir, indem wir das Attribut <b>DisplayMemberPath <\/b>weglassen und stattdessen ein Unterelement namens <b>ComboBox.DataTemplate <\/b>einf&uuml;gen. Dieses soll ein <b>TextBlock<\/b>-Element enthalten, dessen Eigenschaftselement <b>Text <\/b>wir mit einem Multibinding der beiden Felder <b>Nachname <\/b>und <b>Vorname <\/b>in der mit <b>StringFormat <\/b>angegebenen Formatierung ausgeben:<\/p>\n<pre>&lt;Label Grid.Row=\"0\"&gt;ID:&lt;\/Label&gt;\r\n&lt;TextBox Grid.Column=\"1\" Width=\"50\" HorizontalAlignment=\"Left\"  Text=\"{Binding bestellung.ID, Mode=TwoWay, ValidatesOnExceptions=true}\" &gt;&lt;\/TextBox&gt;\r\n&lt;Label Grid.Row=\"1\"&gt;Kunde ausw&auml;hlen:&lt;\/Label&gt;\r\n&lt;ComboBox x:Name=\"cboKunden\" Grid.Column=\"1\" HorizontalAlignment=\"Stretch\" TabIndex=\"0\" Height=\"23\" Grid.Row=\"1\" \r\n             ItemsSource=\"{Binding Kunden}\"\r\n             SelectedItem=\"{Binding bestellung.Kunden, ValidatesOnDataErrors=True}\" \r\n             SelectedValuePath=\"ID\" SelectionChanged=\"cboKunden_SelectionChanged\"&gt;\r\n     &lt;ComboBox.ItemTemplate&gt;\r\n         &lt;DataTemplate&gt;\r\n             &lt;TextBlock&gt;\r\n                 &lt;TextBlock.Text&gt;\r\n                     &lt;MultiBinding StringFormat=\"{}{0}, {1}\"&gt;\r\n                         &lt;Binding Path=\"Nachname\" \/&gt;\r\n                         &lt;Binding Path=\"Vorname\" \/&gt;\r\n                     &lt;\/MultiBinding&gt;\r\n                 &lt;\/TextBlock.Text&gt;\r\n             &lt;\/TextBlock&gt;\r\n         &lt;\/DataTemplate&gt;\r\n     &lt;\/ComboBox.ItemTemplate&gt;\r\n&lt;\/ComboBox&gt;\r\n&lt;Label Grid.Row=\"2\"&gt;Bestelldatum:&lt;\/Label&gt;\r\n&lt;DatePicker Grid.Row=\"2\" Grid.Column=\"1\" Width=\"120\" HorizontalAlignment=\"Left\" \r\n     Text=\"{Binding bestellung.Bestelldatum, Mode=TwoWay, ValidatesOnExceptions=true}\" &gt;&lt;\/DatePicker&gt;<\/pre>\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>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 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:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000084\/\">\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=\"\/data\/wp\/v2\/posts\/55000084?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<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000084\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"7c46eb013a\"\/>\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>Auch in dieser Ausgabe geht es mit unserer Beispiell&ouml;sung Bestellverwaltung weiter. Nachdem wir bereits Kunden, Produkte und Kategorien verwalten k&ouml;nnen, nehmen wir uns nun die Bestellungen und Bestellpositionen vor. Dabei brauchen wir ein paar neue Seiten, um die Details einer Bestellung mit den Bestellpositionen und die Details einer neuen oder zu bearbeitenden Bestellposition anzuzeigen. Damit werden wir erstmal die Bearbeitung von Daten einer m:n-Beziehung erm&ouml;glichen.<\/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":[66022017,662017,44000002,44000008,44000027],"tags":[],"yst_prominent_words":[],"class_list":["post-55000084","post","type-post","status-publish","format-standard","hentry","category-66022017","category-662017","category-Benutzeroberflaeche_mit_WPF","category-Datenzugriffstechnik","category-Excel_programmieren"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000084","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000084"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000084\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000084"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000084"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000084"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000084"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}