{"id":55001174,"date":"2019-02-01T00:00:00","date_gmt":"2020-05-13T21:05:41","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1174"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\/","title":{"rendered":"HTML-Kreuztabelle 3: Neue Zeilen und Spalten"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/360640d49ca34d1ab5ce17966f50aff6\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>In den ersten beiden Teilen der Beitragsreihe haben wir gezeigt, wie Sie die Daten einer Tabelle in Form einer Kreuztabelle ausgeben k&ouml;nnen. Das ist nat&uuml;rlich auch per Kreuztabellenabfrage m&ouml;glich, aber wir haben in diesem Fall das Webbrowser-Steuerelement mit einer entsprechenden HTML-Seite verwendet. Der Hintergrund ist, dass wir so Funktionen zum direkten Bearbeiten der Eintr&auml;ge hinzuf&uuml;gen k&ouml;nnen &#8211; vorausgesetzt, dass die Kreuztabelle nur die Werte einer Kombination anzeigt und nicht etwa Dom&auml;nenfunktionen wie Summen oder Mittelwerte. Wir wollen also die bereits vorhandene Darstellung noch um Funktionen zum Bearbeiten sowie zum Hinzuf&uuml;gen neuer Spalten oder Zeilen erweitern.<\/b><\/p>\n<p>Ausgangspunkt ist die in den bereits genannten Beitr&auml;gen <b>HTML-Kreuztabelle 1: Basics <\/b>(<b>www.access-im-unternehmen.de\/1161<\/b>) und <b>HTML-Kreuztabelle 2: Werte bearbeiten <\/b>(<b>www.access-im-unternehmen.de\/1162<\/b>) erarbeitete L&ouml;sung. Hier wollen wir nun folgende Erweiterungen hinzuf&uuml;gen:<\/p>\n<ul>\n<li>In der oberen Zeile mit den Spaltenk&ouml;pfen wollen wir rechts ein Plus-Zeichen anzeigen, mit dem der Benutzer eine neue Spalte hinzuf&uuml;gen kann.<\/li>\n<li>In der linken Zeile mit den Zeilenk&ouml;pfen wollen wir unten ebenfalls ein Plus-Zeichen unterbringen, das per Mausklick die M&ouml;glichkeit zum Anlegen einer neuen Zeile erm&ouml;glicht.<\/li>\n<li>Ein Doppelklick auf einen der Werte soll den entsprechenden Datensatz der Tabelle <b>tblMaterialpreise <\/b>in einem eigenen Formular &ouml;ffnen.<\/li>\n<\/ul>\n<h2>Neue Zeilen und Spalten anlegen<\/h2>\n<p>F&uuml;r das Anlegen neuer Zeilen und Spalten haben wir uns weiter oben vorgenommen, rechts neben den Spalten&uuml;berschriften und unter den Zeilen&uuml;berschriften jeweils ein Plus-Zeichen anzuzeigen, &uuml;ber das wir eine neue Zeile oder Spalte hinzuf&uuml;gen k&ouml;nnen. Wir k&ouml;nnten dann, wenn der Benutzer auf eines der beiden Plus-Zeichen klickt, einfach die neue Zeile hinzuf&uuml;gen. Aber geht das wirklich so einfach Nein: Denn unser Algorithmus aus der Prozedur <b>KreuztabelleAnlegen <\/b>f&uuml;gt nur Spalten und Zeilen an f&uuml;r H&ouml;hen- oder Breitenangaben, zu denen es auch bereits mindestens eine Preisangabe gibt. Dementsprechend haben wir auch gar keine M&ouml;glichkeit, Daten so in der Tabelle <b>tblMaterialpreise <\/b>zu speichern, dass diese allein in der Anzeige einer neuen Zeile oder Spalte m&uuml;nden, ohne selbst einen Preis f&uuml;r die Kombination aus H&ouml;he und Breite zu enthalten.<\/p>\n<p>Also m&uuml;ssen wir uns einen alternativen Weg ausdenken, der wie folgt aussieht k&ouml;nnte: Wenn der Benutzer einen Preis f&uuml;r eine Kombination aus H&ouml;he und Breite angeben m&ouml;chte, von denen entweder die H&ouml;he oder die Breite oder auch beides noch nicht vorhanden ist, muss er eben einen neuen Datensatz in der Tabelle <b>tblMaterialpreise <\/b>einf&uuml;gen, der die gew&uuml;nschten Werte f&uuml;r H&ouml;he und Breite enth&auml;lt.<\/p>\n<p>Letztlich w&auml;re es aber intuitiver, wenn der Benutzer einfach auf ein Plus-Zeichen zum Erstellen einer neuen Zeile oder Spalte klickt und dann durch einen Klick auf die entstehenden Zellen mit dem Minus-Zeichen den neuen Preis eingibt.<\/p>\n<p>Was aber ben&ouml;tigen wir, um dies zu realisieren Richtig, wir m&uuml;ssten die verf&uuml;gbaren Werte f&uuml;r die H&ouml;hen und Breiten in jeweils einer weiteren Tabelle vorhalten. In der aktuellen Konstellation ist das auch m&ouml;glich, denn wir gehen ja erstmal von einem einzigen Material aus. In der Praxis ist unser Ansatz aber nat&uuml;rlich zu kurz gedacht &#8211; wir werden auch verschiedene Materialien ber&uuml;cksichtigen m&uuml;ssen, die wir in einer weiteren Tabelle speichern, die etwa <b>tblMaterialien <\/b>hei&szlig;t. Auf diese Tabelle verweisen wir dann von der Tabelle <b>tblMaterialpreise <\/b>aus per Fremdschl&uuml;sselfeld. Ebenso k&ouml;nnen wir auf diese Tabelle dann von den beiden Tabellen zum Speichern von H&ouml;hen und Breiten verweisen. Also legen wir diese Tabellen an. Auf das Hinzuf&uuml;gen neuer Zeilen und Spalten kommen wir sp&auml;ter zur&uuml;ck &#8211; vorher sind noch einige Vorbereitungen und Erweiterungen zu erledigen.<\/p>\n<h2>Tabelle zum Speichern der Materialien<\/h2>\n<p>Die Tabelle <b>tblMaterialien <\/b>soll die verschiedenen Materialien aufnehmen, damit wir die Materialpreise nicht nur in Abh&auml;ngigkeit der Kombinationen von H&ouml;he und Breite, sondern auch in Abh&auml;ngigkeit von verschiedenen Materialien erfassen k&ouml;nnen, also etwa 17 mm und 19 mm dicke Spanplatten. Die Tabelle enth&auml;lt zwei Felder: Das Feld <b>MaterialID <\/b>ist das Prim&auml;rschl&uuml;sselfeld, das Feld <b>Bezeichnung <\/b>legt den Namen des Materials fest. F&uuml;r dieses Feld legen wir einen eindeutigen Index fest, damit jede Bezeichnung nur einmal eingegeben werden kann (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1174_006.png\" alt=\"Die Tabelle tblMaterialien\" width=\"549,6265\" height=\"367,7149\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Die Tabelle tblMaterialien<\/span><\/b><\/p>\n<h2>Tabellen zum Speichern von H&ouml;hen und Breiten<\/h2>\n<p>Die Tabelle zum Speichern der H&ouml;hen hei&szlig;t <b>tblHoehen<\/b>. Sie enth&auml;lt ein Prim&auml;rschl&uuml;sselfeld namens <b>HoeheID<\/b>, das Feld <b>Hoehe <\/b>zum Angeben der H&ouml;he und das Fremdschl&uuml;sselfeld <b>MaterialID<\/b>, &uuml;ber das die H&ouml;he einem Datensatz der Tabelle <b>tblMaterialien <\/b>zugeordnet wird. F&uuml;r die beiden Felder <b>Hoehe <\/b>und <b>MaterialID <\/b>legen wir einen eindeutigen, zusammengesetzten Schl&uuml;ssel fest. So verhindern wir, dass f&uuml;r ein Material die gleiche H&ouml;he doppelt angelegt wird (siehe Bild 2). <\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1174_007.png\" alt=\"Die Tabelle tblHoehen\" width=\"599,593\" height=\"380,4934\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Die Tabelle tblHoehen<\/span><\/b><\/p>\n<p>Die Tabelle <b>tblBreiten <\/b>bauen wir analog zur Tabelle <b>tblHoehen <\/b>auf.<\/p>\n<h2>Materialpreis nach Material<\/h2>\n<p>Schlie&szlig;lich wollen wir der Tabelle <b>tblMaterialpreise <\/b>noch ein Fremdschl&uuml;sselfeld namens <b>MaterialID <\/b>hinzuf&uuml;gen, mit dem wir den entsprechenden Eintrag der Tabelle <b>tblMaterialien <\/b>ausw&auml;hlen. Auch hier m&uuml;ssen wir das neue Feld <b>Material-ID <\/b>in den eindeutigen Index integrieren. Die neue Version der Tabelle sieht nun wie in Bild 3 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1174_008.png\" alt=\"Die angepasste Tabelle tblMaterialpreise\" width=\"549,6265\" height=\"401,1745\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Die angepasste Tabelle tblMaterialpreise<\/span><\/b><\/p>\n<p>Das Datenmodell enth&auml;lt nun vier Tabellen, die wie in Bild 4 miteinander verkn&uuml;pft sind.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1174_009.png\" alt=\"Aktueller Stand des Datenmodells\" width=\"549,6265\" height=\"259,4634\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Aktueller Stand des Datenmodells<\/span><\/b><\/p>\n<h2>Material anlegen<\/h2>\n<p>Nun f&uuml;gen wir einige Eintr&auml;ge zur Tabelle <b>tblMaterialien<\/b> hinzu, zum Beispiel <b>Spanplatte 17 mm <\/b>und <b>Spanplatte 19 mm<\/b>. Anschlie&szlig;end verbinden wir alle Datens&auml;tze der Tabelle <b>tblMaterialpreise<\/b>, die wir bisher angelegt haben, &uuml;ber das Feld <b>MaterialID <\/b>mit dem ersten der beiden neu angelegten Datens&auml;tze der Tabelle <b>tblMaterialien<\/b>. Das Ergebnis sieht in der Tabelle <b>tblMaterialpreise <\/b>dann etwa wie in Bild 5 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1174_010.png\" alt=\"Inhalt der Tabelle tblMaterialpreise\" width=\"424,7115\" height=\"298,058\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Inhalt der Tabelle tblMaterialpreise<\/span><\/b><\/p>\n<p>Au&szlig;erdem f&uuml;gen wir in den beiden Tabellen <b>tblHoehen <\/b>und <b>tblBreiten <\/b>die Werte ein, die bereits in der Tabelle <b>tblMaterialpreise <\/b>vorliegen.<\/p>\n<h2>H&ouml;hen und Breiten verkn&uuml;pfen<\/h2>\n<p>An dieser Stelle fragen wir uns auch: Sollten wir nicht die Felder <b>Hoehe <\/b>und <b>Breite <\/b>der Tabelle <b>tblMaterialpreise <\/b>mit den entsprechenden Datens&auml;tzen der Tabelle <b>tblHoehen <\/b>und <b>tblBreiten <\/b>verkn&uuml;pfen Und w&uuml;rde es dann nicht sogar Sinn machen, hier einmal auf einen Autowert in den Prim&auml;rschl&uuml;sselfeldern der beiden Tabellen <b>tblHoehen <\/b>und <b>tblBreiten <\/b>zu verzichten und direkt die Werte der H&ouml;hen und Breiten in das Prim&auml;rschl&uuml;sselfeld einzutragen Dann h&auml;tten wir die f&uuml;r uns interessanten Werte direkt in den gebundenen Spalten der Fremdschl&uuml;sselfelder und m&uuml;ssten gar keine Lookup-Abfragen t&auml;tigen, um auf die Werte der Tabellen <b>tblHoehen <\/b>und <b>tblBreiten <\/b>zugreifen &#8211; diese w&uuml;rden dann lediglich zur Beschr&auml;nkung der m&ouml;glichen Werte dienen, die in den Fremdschl&uuml;sselfeldern <b>Hoehe <\/b>und <b>Breite <\/b>eingegeben beziehungsweise ausgew&auml;hlt werden k&ouml;nnen.<\/p>\n<p>Das erledigen wir schlie&szlig;lich, indem wir die Beziehungen wie in Bild 6 hinzuf&uuml;gen. Vorher haben wir die Prim&auml;rschl&uuml;sselfelder <b>HoeheID <\/b>und <b>BreiteID <\/b>aus den Tabellen <b>tblHoehen <\/b>und <b>tblBreiten <\/b>entfernt und die Felder <b>Hoehe <\/b>und <b>Breite <\/b>in Prim&auml;rschl&uuml;sselfelder ohne Autowert umgewandelt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1174_011.png\" alt=\"Neue Verkn&uuml;pfungen im Datenmodell\" width=\"549,6265\" height=\"306,9987\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Neue Verkn&uuml;pfungen im Datenmodell<\/span><\/b><\/p>\n<h2>Werte f&uuml;r neues Material hinzuf&uuml;gen<\/h2>\n<p>Damit wir neue Daten zum Spielen haben, f&uuml;gen wir der Tabelle <b>tblMaterialien<\/b> einen zweiten Datensatz hinzu (siehe Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1174_013.png\" alt=\"Neuer Datensatz in der Tabelle tblMaterialien\" width=\"424,7115\" height=\"157,071\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Neuer Datensatz in der Tabelle tblMaterialien<\/span><\/b><\/p>\n<p>Au&szlig;erdem f&uuml;gen wir in den beiden Tabellen <b>tblHoehen <\/b>und <b>tblBreiten <\/b>einige neue Datens&auml;tze mit Werten f&uuml;r die neue Materialart ein. Zur Unterscheidung von den Datens&auml;tzen f&uuml;r die bereits vorhandene Materialart nutzen wir hier kleinere Werte (100 bis 300) &#8211; siehe Bild 8.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1174_014.png\" alt=\"Neue Werte f&uuml;r H&ouml;he und Breite f&uuml;r das zuletzt hinzugef&uuml;gte Material\" width=\"549,6265\" height=\"276,7624\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Neue Werte f&uuml;r H&ouml;he und Breite f&uuml;r das zuletzt hinzugef&uuml;gte Material<\/span><\/b><\/p>\n<p>Schlie&szlig;lich legen wir einige neue Datens&auml;tze in der Tabelle <b>tblMaterialpreise <\/b>f&uuml;r das neue Material an (siehe Bild 9).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1174_016.png\" alt=\"Materialpreise f&uuml;r neues Material\" width=\"424,7115\" height=\"167,5391\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Materialpreise f&uuml;r neues Material<\/span><\/b><\/p>\n<p>Wenn wir nun das Formular mit der Kreuztabelle &ouml;ffnen, sieht dieses wie in Bild 10 aus. Hier werden nun alle Ma&szlig;e und alle Preise angezeigt &#8211; sowohl f&uuml;r die 17 mm als auch f&uuml;r die 19 mm dicken Spanplatten. Leider kann man diese aktuell nur dadurch auseinanderhalten, dass wir f&uuml;r die eine Spanplatte die kleineren H&ouml;hen und Breiten und f&uuml;r die andere die gr&ouml;&szlig;eren festgelegt haben.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1174_017.png\" alt=\"Kreuztabelle mit neuen Daten\" width=\"424,7115\" height=\"243,5716\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Kreuztabelle mit neuen Daten<\/span><\/b><\/p>\n<p>Damit nur die Werte f&uuml;r eines der Materialien angezeigt werden, f&uuml;gen wir dem Formular nun ein Kombinationsfeld hinzu, mit dem der Benutzer das Material ausw&auml;hlen kann. Das neue Kombinationsfeld nennen wir <b>cboMaterial-ID<\/b>. F&uuml;r seine Eigenschaft <b>Datensatzherkunft <\/b>legen wir die folgende Abfrage fest:<\/p>\n<pre>SELECT MaterialID, Bezeichnung FROM tblMaterialien \r\nORDER BY Bezeichnung;<\/pre>\n<p>Damit nur das Feld <b>Bezeichnung <\/b>im Kombinationsfeld angezeigt wird und nicht das Prim&auml;rschl&uuml;sselfeld <b>Material-ID<\/b>, stellen wir die Eigenschaft <b>Spaltenanzahl <\/b>auf <b>2 <\/b>und <b>Spaltenbreiten <\/b>auf <b>0cm <\/b>ein.<\/p>\n<p><!--30percent--><\/p>\n<p>Nun ben&ouml;tigen wir noch eine Ereignisprozedur, die nach der Auswahl eines neuen Eintrags im Kombinationsfeld die Kreuztabelle neu f&uuml;llt. Der dazu aufgerufenen Prozedur <b>KreuztabelleErstellen <\/b>m&uuml;ssen wir auch noch an irgendeiner Stelle die Information mitgeben, f&uuml;r welches Material das Webbrowser-Steuerelement die Preise anzeigen soll.<\/p>\n<p>Die Ereignisprozedur implementieren wir wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboMaterialID_AfterUpdate()\r\n     KreuztabelleErstellen Me!cboMaterialID\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Hier haben wir bereits vorgegriffen, auf welche Art wir das betroffene Material &uuml;bergeben &#8211; n&auml;mlich als Parameter der Prozedur <b>KreuztabelleErstellen<\/b>. Diese erweitern wir um den entsprechenden Parameter. Au&szlig;erdem f&uuml;gen wir der Abfrage, welche die anzuzeigenden Daten f&uuml;r die Kreuztabelle in der Prozedur <b>KreuztabelleErstellen <\/b>ermittelt, ein <b>WHERE<\/b>-Kriterium mit dem Wert des Parameters hinzu. Das sieht dann gek&uuml;rzt wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>KreuztabelleErstellen(lngMaterialID<span style=\"color:blue;\"> As Long<\/span>)\r\n     ...\r\n     <span style=\"color:blue;\">Set<\/span> rstSpaltenkoepfe = db.OpenRecordset( _\r\n          \"SELECT  DISTINCT Hoehe FROM tblMaterialpreise  WHERE MaterialID = \" _\r\n          & lngMaterialID & \"  ORDER BY Hoehe\", dbOpenDynaset)\r\n     ...\r\n     <span style=\"color:blue;\">Set<\/span> rstZeilen = db.OpenRecordset( _\r\n          \"SELECT DISTINCT  Breite FROM tblMaterialpreise  WHERE MaterialID = \" _\r\n          & lngMaterialID & \"  ORDER BY Breite\", dbOpenDynaset)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rstZeilen.EOF\r\n         ...\r\n         <span style=\"color:blue;\">Set<\/span> rstWerte = db.OpenRecordset( _\r\n               \"SELECT  MaterialpreisID, Preis, Hoehe  FROM tblMaterialpreise WHERE MaterialID = \"  _\r\n               & lngMaterialID & \" AND Breite = \" &  rstZeilen!Breite & \" ORDER BY Hoehe\", dbOpenDynaset)\r\n         ...\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Au&szlig;erdem m&uuml;ssen wir noch die Prozedur anpassen, die beim &ouml;ffnen des Formulars das Webbrowser-Steuerelement f&uuml;llt und dazu die Prozedur <b>KreuztabelleErstellen <\/b>aufruft:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Timer()\r\n     ...\r\n     Me!cboMaterialID = Me!cboMaterialID.ItemData(0)\r\n     KreuztabelleErstellen Me!cboMaterialID\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit sorgen wir nun daf&uuml;r, dass erstens beim Anzeigen des Formulars, was auch das Ereignis <b>Form_Timer <\/b>ausl&ouml;st (siehe erster Teil der Beitragsreihe) der erste Eintrag des Kombinationsfeldes eingestellt wird und zweitens daf&uuml;r, dass die Prozedur <b>KreuztabelleErstellen <\/b>mit dem Prim&auml;rschl&uuml;sselwert des gew&auml;hlten Eintrags aufgerufen wird. Dies f&uuml;hrt dann beispielsweise zu einer Ansicht wie in Bild 11.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1174_018.png\" alt=\"Preise nur f&uuml;r die gew&auml;hlte Materialart\" width=\"424,7115\" height=\"193,4504\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Preise nur f&uuml;r die gew&auml;hlte Materialart<\/span><\/b><\/p>\n<p>Wenn wir nun mit dem Kombinationsfeld den zweiten Eintrag ausw&auml;hlen, geschieht allerdings etwas Unerwartetes &#8211; siehe Bild 12. Die Kreuztabelle f&uuml;r die neu ausgew&auml;hlte Materialart wird unten angef&uuml;gt! Dies k&ouml;nnen wir allerdings leicht &auml;ndern. Dazu f&uuml;gen wir vor der Anweisung, mit der wir das neue Tabellenelement anlegen, einen Befehl ein, der die Eigenschaft <b>innerHTML <\/b>des <b>body<\/b>-Elements auf eine leere Zeichenkette einstellt:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1174_019.png\" alt=\"Zwei Kreuztabellen untereinander\" width=\"424,7115\" height=\"276,1065\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Zwei Kreuztabellen untereinander<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>KreuztabelleErstellen(lngMaterialID<span style=\"color:blue;\"> As Long<\/span>)\r\n     ...\r\n     objDocument.body.innerHTML = \"\"\r\n     <span style=\"color:blue;\">Set<\/span> objTable = objDocument.createElement(\"Table\")\r\n     ...<\/pre>\n<p>Damit k&ouml;nnen wir dann &uuml;ber das Kombinationsfeld leicht zwischen den Materialarten wechseln.<\/p>\n<h2>Prozedur anpassen, damit auch nicht verwendete Werte in der Kreuztabelle erscheinen<\/h2>\n<p>Nun folgt ein weiterer wichtiger Schritt: Wir haben ja bereits die Tabellen <b>tblHoehen <\/b>und <b>tblBreiten <\/b>angelegt, damit wir auch schon H&ouml;hen und Breiten eingeben k&ouml;nnen, f&uuml;r die der Benutzer vielleicht noch gar keine Preise festgelegt hat. Dementsprechend werden die H&ouml;hen und Breiten auch beim Anzeigen der Spalten und Zeilen in der Kreuztabelle noch nicht ber&uuml;cksichtigt &#8211; dort ber&uuml;cksichtigen wir nur die Werte, die bereits in der Tabelle <b>tblMaterialpreise <\/b>enthalten sind.<\/p>\n<p>Das wollen wir aber nun &auml;ndern, damit auch die noch nicht mit Preisen versehenen Kombinationen aus H&ouml;he und Breite bereits angezeigt und dann vom Benutzer in der Kreuztabelle bearbeitet werden k&ouml;nnen.<\/p>\n<p>Dazu m&uuml;ssen wir wiederum nur zwei Zeilen in der Prozedur <b>KreuztabelleErstellen <\/b>anpassen. Dabei handelt es sich um die Erstellung der ersten beiden Recordsets, in denen wir lediglich die Tabelle <b>tblMaterialpreise <\/b>durch die Tabellen <b>tblHoehen <\/b>und <b>tblBreiten <\/b>ersetzen m&uuml;ssen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>KreuztabelleErstellen(lngMaterialID<span style=\"color:blue;\"> As Long<\/span>)\r\n     ...\r\n     <span style=\"color:blue;\">Set<\/span> rstSpaltenkoepfe = db.OpenRecordset( _\r\n          \"SELECT DISTINCT Hoehe FROM tblHoehen  WHERE MaterialID = \" _\r\n          & lngMaterialID & \"  ORDER BY Hoehe\", dbOpenDynaset)\r\n     ...\r\n     <span style=\"color:blue;\">Set<\/span> rstZeilen = db.OpenRecordset( _\r\n          \"SELECT DISTINCT  Breite FROM tblBreiten WHERE MaterialID = \" _\r\n          & lngMaterialID & \" ORDER BY Breite\", dbOpenDynaset)\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wenn wir in der Tabelle <b>tblHoehen <\/b>nun eine neue H&ouml;he von 400 mm f&uuml;r das Material mit 19 mm Dicke und in der Tabelle <b>tblBreiten <\/b>eine neue Breite von 400 mm f&uuml;r das gleiche Material einstellen, sollten eine leere Zeile und eine leere Spalte daf&uuml;r angezeigt werden (siehe Bild 13).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1174_022.png\" alt=\"Neue H&ouml;he und Breite\" width=\"424,7115\" height=\"278,915\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Neue H&ouml;he und Breite<\/span><\/b><\/p>\n<p>Wenn wir nun das Formular mit der Kreuztabelle &ouml;ffnen, sieht das Ergebnis wie in Bild 14 aus. Das Ergebnis haben wir uns genau so vorgestellt!<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1174_020.png\" alt=\"Leere Zeilen und Spalten\" width=\"424,7115\" height=\"195,209\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Leere Zeilen und Spalten<\/span><\/b><\/p>\n<h2>&auml;ndern von Eintr&auml;gen<\/h2>\n<p>Um die Eintr&auml;ge zu &auml;ndern, m&uuml;ssen wir ebenfalls &auml;nderungen vornehmen. Wenn wir etwa einen neuen Preis f&uuml;r die Kombination 400\/100 vornehmen wollen, erhalten wir die Fehlermeldung aus Bild 15. Der Fehler tritt in dieser Zeile in der Prozedur <b>m_div_onfocusout <\/b>auf:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1174_023.png\" alt=\"Fehler beim Versuch, einen neuen Preis einzugeben\" width=\"424,7115\" height=\"241,078\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 15: Fehler beim Versuch, einen neuen Preis einzugeben<\/span><\/b><\/p>\n<pre>db.Execute \"INSERT INTO tblMaterialpreise(Preis, Hoehe, Breite) VALUES(\" _\r\n     & CCur(Abs(strText)) & \",\" & m_Hoehe & \", \" & m_Breite & \")\", dbFailOnError<\/pre>\n<p>Logisch &#8211; wir versuchen hier einen Datensatz in die Tabelle <b>tblMaterialpreise <\/b>einzutragen, ohne die <b>MaterialID <\/b>anzugeben. Die geh&ouml;rt aber zum zusammengesetzten, eindeutigen Index der Tabelle. Dazu erweitern wir zun&auml;chst die Klasse <b>clsDivWrapper <\/b>um eine entsprechende Variable:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>m_MaterialID<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>&uuml;ber die folgende <b>Property Let<\/b>-Prozedur kann man den Wert dieser Variablen f&uuml;llen:<\/p>\n<pre><span style=\"color:blue;\">Public Property Let <\/span>MaterialID(lng<span style=\"color:blue;\"> As Long<\/span>)\r\n     m_MaterialID = lng\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Das F&uuml;llen erledigen wir beim Erstellen der Kreuztabelle in der Prozedur <b>KreuztabelleErstellen<\/b>:<\/p>\n<pre><span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> rstWerte.NoMatch<span style=\"color:blue;\"> Then<\/span>\r\n     ...\r\n     objDivWrapper.MaterialID = lngMaterialID\r\n     ...\r\n<span style=\"color:blue;\">Else<\/span>\r\n     ...\r\n     objDivWrapper.MaterialID = lngMaterialID\r\n     ...\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Au&szlig;erdem integrieren wir die Variable <b>m_MaterialID <\/b>in die Abfrage, die soeben zum Fehler gef&uuml;hrt hat, indem wir sie in die Liste der beim Anlegen zu f&uuml;llenden Felder hinzuf&uuml;gen:<\/p>\n<pre>db.Execute \"INSERT INTO tblMaterialpreise(Preis,  Hoehe, Breite, MaterialID) VALUES(\" _\r\n     & CCur(Abs(strText))  & \",\" & m_Hoehe & \", \" & m_Breite & \", \" & m_MaterialID  & \")\", _\r\n     dbFailOnError<\/pre>\n<h2>Anpassen der &auml;nderung eines Preises in Abh&auml;ngigkeit vom Material<\/h2>\n<p>Wenn Sie einen der vorhandenen Eintr&auml;ge &auml;ndern, l&ouml;st dies &uuml;berraschenderweise keinen Fehler aus. Kein Wunder: Der Datensatz ist bereits vorhanden und wir &auml;ndern ja nur den Preis f&uuml;r den Datensatz mit dem aus <b>m_Div.id <\/b>ermittelten Prim&auml;rschl&uuml;sselwert. Wir m&uuml;ssen also keine &auml;nderungen vornehmen:<\/p>\n<pre>db.Execute \"UPDATE tblMaterialpreise SET Preis = \" & CCur(Abs(strText)) _\r\n     & \" WHERE MaterialpreisID = \" & m_Div.id, dbFailOnError<\/pre>\n<p>Gleiches gilt &uuml;brigens f&uuml;r das L&ouml;schen eines Datensatzes durch Entfernen des entsprechenden Eintrags in der Kreuztabelle.<\/p>\n<h2>Anlegen neuer H&ouml;hen und Breiten &uuml;ber die Kreuztabelle<\/h2>\n<p>Nun kommt ein interessanter Teil: Wir wollen endlich die Plus-Symbole in die oberste Zeile und die linke Spalte integrieren, mit denen wir dem Benutzer erm&ouml;glichen wollen, neue Breiten und H&ouml;hen anzulegen.<\/p>\n<p>In der Zwischenzeit hat sich die Idee allerdings in eine noch praktischere Richtigung gewechselt: Wir f&uuml;gen dort etwa den Text <b>[Neu] <\/b>ein und lassen den Benutzer einfach den Wert f&uuml;r die neue H&ouml;he und Breite eingeben. Nach dem Verlassen der jeweiligen Zelle soll der entsprechende Datensatz in der Tabelle <b>tblHoehe <\/b>beziehungsweise <b>tblBreite <\/b>gespeichert werden und an der richtigen Stelle zwischen den &uuml;brigen Spalten- und Zeilenk&ouml;pfen einsortiert werden.<\/p>\n<p>Die Befehle f&uuml;r das Hinzuf&uuml;gen des Eintrags <b>[Neu] <\/b>unter den letzten Zeilenkopf f&uuml;gen wir wie folgt an das Ende der Prozedur <b>KreuztabelleErstellen <\/b>ein:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>KreuztabelleErstellen(lngMaterialID<span style=\"color:blue;\"> As Long<\/span>)\r\n     ...\r\n     <span style=\"color:blue;\">Set<\/span> objRow = objTable.insertRow\r\n     <span style=\"color:blue;\">Set<\/span> objCell = objRow.insertCell\r\n     objCell.className = \"rowHeader\"\r\n     <span style=\"color:blue;\">Set<\/span> objDivNeueBreite = objDocument.createElement(\"Div\")\r\n     objDivNeueBreite.contentEditable = \"true\"\r\n     objCell.appendChild objDivNeueBreite\r\n     objDivNeueBreite.innerText = \"[Neue Breite]\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die hier verwendete Variable <b>objDivNeueBreite <\/b>deklarieren wir wie folgt im Modulkopf:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>WithEvents objDivNeueBreite<span style=\"color:blue;\"> As <\/span>MSHTML.HTMLDivElement<\/pre>\n<p>Die neuen Zeilen f&uuml;gen zun&auml;chst eine neue Zeile an die Tabelle an und f&uuml;gen dieser eine Zelle hinzu. Der Klassenname wird auf <b>rowHeader <\/b>eingestellt, damit auch der Inhalt dieser Zelle fett angezeigt wird.<\/p>\n<p>Dann legen wir ein neues <b>Div<\/b>-Element an, das wir mit der Variablen <b>objDivNeueBreite <\/b>referenzieren. Wir stellen wieder <b>contentEditable <\/b>auf <b>true <\/b>ein, damit der Benutzer den Text dieser Zelle bearbeiten kann. Schlie&szlig;lich erh&auml;lt das <b>div<\/b>-Element noch den Text <b>[Neue Breite]<\/b>. Das Ergebnis sieht wie in Bild 16 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1174_024.png\" alt=\"Text zum Anlegen einer neuen Breite\" width=\"499,6607\" height=\"212,8185\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 16: Text zum Anlegen einer neuen Breite<\/span><\/b><\/p>\n<p>Nun fehlt noch eine Ereignisprozedur, die bei &auml;nderung dieses Textes die neue Breite in der Tabelle <b>tblBreiten<\/b> speichert und die Anzeige der Kreuztabelle aktualisiert. Diese legen wir f&uuml;r die Objektvariable <b>objDivNeueBreite <\/b>&uuml;ber die beiden Kombinationsfelder im oberen Teil des Codefensters der Klasse <b>Form_frmKreuztabelleHTML<\/b> an und f&uuml;llen diese wie in Listing 1.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objDivNeueBreite_onfocusout()\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>strText<span style=\"color:blue;\"> As String<\/span>\r\n     strText = objDivNeueBreite.textContent\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> (strText = \"[Neue Breite]\")<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNumeric(strText) And <span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strText) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Ung&uuml;ltiger Text: \" & strText\r\n             objDivNeueBreite.textContent = \"[Neue Breite]\"\r\n             <span style=\"color:blue;\">Exit Sub<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strText) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             db.Execute \"INSERT INTO tblBreiten(Breite, MaterialID) VALUES(\" _\r\n                 & CCur(Abs(strText)) & \", \" _\r\n                 & Me!cboMaterialID & \")\", dbFailOnError\r\n             KreuztabelleErstellen Me!cboMaterialID\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Prozedur, die nach dem Anlegen einer neuen Breite ausgel&ouml;st wird<\/span><\/b><\/p>\n<p>Die Prozedur pr&uuml;ft zun&auml;chst in einer <b>If&#8230;Then<\/b>-Bedingung, ob sich der eingegebene Text tats&auml;chlich vom urspr&uuml;nglichen Text <b>[Neue Breite] <\/b>unterscheidet.<\/p>\n<p>Ist dies der Fall, pr&uuml;ft die Routine in einer untergeordneten <b>If&#8230;Then<\/b>-Bedingung, ob der Text des <b>div<\/b>-Elements nicht numerisch oder leer ist. Anderenfalls w&uuml;rde die Prozedur eine entsprechende Meldung anzeigen und den urspr&uuml;nglichen Wert <b>[Neue Breite] <\/b>wieder einstellen.<\/p>\n<p>War die Eingabe jedoch g&uuml;ltig, wird der Text per <b>INSERT INTO<\/b>-Anweisung in das Feld <b>Breite <\/b>der Tabelle <b>tblBreiten <\/b>eingetragen, und zwar im Kontext des aktuell mit <b>cboMaterialID <\/b>ausgew&auml;hlten Materials. Danach wird die Kreuztabelle mit <b>KreuztabelleErstellen <\/b>neu erstellt.<\/p>\n<p>Fehler bei bereits vorhandene Breiten<\/p>\n<p>Beim Experimentieren mit dem neuen Feature haben wir einmal eine Breite eingegeben, die zwar noch nicht f&uuml;r das Material <b>Spanplatte 19 mm <\/b>vorhanden war, aber schon f&uuml;r <b>Spanplatte 17 mm<\/b>. Dies l&ouml;ste dann einen Fehler wegen einer Prim&auml;rschl&uuml;sselverletzung aus (siehe Bild 17).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1174_025.png\" alt=\"Fehler durch eine Prim&auml;rschl&uuml;sselverletzung\" width=\"649,559\" height=\"382,518\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 17: Fehler durch eine Prim&auml;rschl&uuml;sselverletzung<\/span><\/b><\/p>\n<p>Auch das ist nicht verwunderlich. Wir haben zwar noch den zusammengesetzten, eindeutigen Schl&uuml;ssel mit den beiden Feldern <b>Breite <\/b>und <b>MaterialID <\/b>der Tabelle <b>tblBreiten <\/b>aus der vorherigen Version her&uuml;bergerettet, aber gleichzeitig das Feld <b>Breite <\/b>als Prim&auml;rschl&uuml;sselfeld behalten &#8211; und wenn dort ein Wert auftaucht, der bereits vorhanden ist, l&ouml;st dies den oben genannten Fehler aus. <\/p>\n<p>Also m&uuml;ssen wir hier noch etwas am Tabellendesign &auml;ndern: Die beiden Felder <b>Breite <\/b>und <b>MaterialID <\/b>der Tabelle <b>tblBreiten <\/b>m&uuml;ssen als gemeinsamer Prim&auml;rschl&uuml;ssel definiert werden.<\/p>\n<p>Das gelingt allerdings nicht so einfach: Als Erstes m&uuml;ssen wir bestehenden Beziehung f&uuml;r das Prim&auml;rschl&uuml;sselfeld zwischen den Tabellen <b>tblBreiten <\/b>und <b>tblMaterialpreise <\/b>im Beziehungen-Fenster entfernen.<\/p>\n<p>Danach k&ouml;nnen wir das Prim&auml;rschl&uuml;sselfeld in einen aus den beiden Feldern <b>Breite <\/b>und <b>MaterialID <\/b>bestehenden Prim&auml;rschl&uuml;ssel &auml;ndern (siehe Bild 18). Den noch vorhandenen eindeutigen Schl&uuml;ssel aus diesen beiden Feldern k&ouml;nnen Sie nun entfernen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1174_026.png\" alt=\"Zusammengesetzter Prim&auml;rschl&uuml;ssel\" width=\"549,6265\" height=\"133,2707\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 18: Zusammengesetzter Prim&auml;rschl&uuml;ssel<\/span><\/b><\/p>\n<p>Anschlie&szlig;end stellen wir im Beziehungen-Fenster die Beziehung zwischen den beiden Tabellen <b>tblMaterialpreise <\/b>und <b>tblBreiten <\/b>&uuml;ber die beiden Felder <b>Breite <\/b>und <b>Material-ID <\/b>wieder her.<\/p>\n<p>Nun k&ouml;nnen wir etwa f&uuml;r das Material <b>Spanplatte 19 mm <\/b>die Breite 700 mm neu anlegen, obwohl diese bereits f&uuml;r das Material <b>Spanplatte 17 mm <\/b>vorhanden ist.<\/p>\n<h2>Eintrag f&uuml;r neue Spalte hinzuf&uuml;gen<\/h2>\n<p>Nun wollen wir analog zur neuen Zeile mit einem neuen Wert f&uuml;r die Breite noch einen Eintrag mit dem Text <b>[Neue H&ouml;he] <\/b>als letzten Spaltenkopf der obersten Zeile hinzuf&uuml;gen.<\/p>\n<p>Dazu m&uuml;ssen wir erst einmal die Stelle finden, an der wir den entsprechenden Code eintragen. Die neue Zelle soll in einer neuen Spalte der ersten Zeile landen. Wo legen wir diese im Code der Prozedur <b>KreuztabelleAnlegen <\/b>an Direkt in der ersten <b>Do While<\/b>-Schleife!<\/p>\n<p>Also platzieren wir die neuen Anweisungen direkt hinter der <b>Loop<\/b>-Anweisung dieser Schleife:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>KreuztabelleErstellen(lngMaterialID<span style=\"color:blue;\"> As Long<\/span>)\r\n     ...\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rstSpaltenkoepfe.EOF\r\n         <span style=\"color:blue;\">Set<\/span> objCell = objRow.insertCell\r\n         objCell.className = \"columnHeader\"\r\n         objCell.innerText = rstSpaltenkoepfe!Hoehe\r\n         rstSpaltenkoepfe.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objCell = objRow.insertCell\r\n     objCell.className = \"columnHeader\"\r\n     <span style=\"color:blue;\">Set<\/span> objDivNeueHoehe = objDocument.createElement(\"Div\")\r\n     objDivNeueHoehe.contentEditable = \"true\"\r\n     objCell.appendChild objDivNeueHoehe\r\n     objDivNeueHoehe.innerText = \"[Neue H&ouml;he]\"\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>In diesem Fall f&uuml;gen wir keine neue Zeile hinzu wie bei der Zelle f&uuml;r die neue Breite, sondern nur eine neue Zelle. Diese versehen wir mit der Klasse <b>ColumnHeader<\/b> und verfahren ansonsten wie bei der vorherigen Zelle. Die hier verwendete Objektvariable <b>objDivNeueHoehe <\/b>m&uuml;ssen wir nat&uuml;rlich auch im Kopf der Formularklasse deklarieren:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>WithEvents objDivNeueHoehe<span style=\"color:blue;\"> As <\/span>MSHTML.HTMLDivElement<\/pre>\n<p>Schlie&szlig;lich legen wir auch noch eine Ereignisprozedur an, die durch das Ereignis <b>onfocusout <\/b>des Objekts <b>obj-DivNeueHoehe <\/b>ausgel&ouml;st wird. Diese &uuml;bernimmt grunds&auml;tzlich die gleichen Aufgaben wie <b>objDivNeueBreite_onfocusout<\/b>, legt aber einen neuen Datensatz in der Tabelle <b>tblHoehen <\/b>an.<\/p>\n<h2>Aktionen bei Doppelklick auf die Werte<\/h2>\n<p>Wenn Sie nicht nur die Werte in der &uuml;bersicht anschauen und bearbeiten m&ouml;chten, k&ouml;nnen wir noch eine Funktion oben draufsetzen. Dabei handelt es sich um das Aktivieren eines der Eintr&auml;ge per Doppelklick.<\/p>\n<p>Damit k&ouml;nnen Sie etwa f&uuml;r einen der Eintr&auml;ge zwischen den Spalten- und Zeilenk&ouml;pfen ein Detailformular mit dem kompletten Datensatz der zugrunde liegenden Tabelle <b>tblMaterialpreise <\/b>aufrufen. Wir wollen es an dieser Stelle etwas einfacher halten und nach einem Doppelklick lediglich ein Meldungsfenster mit dem Prim&auml;rschl&uuml;sselwert des angeklickten Elements anzeigen.<\/p>\n<p>Dazu legen Sie in der Klasse <b>clsDivWrapper <\/b>einfach nur die folgende Ereignisprozedur an:<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>m_Div_ondblclick()<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> m_Div.id = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Sie haben den Eintrag mit der MaterialID \" _\r\n             & m_Div.id & \" doppelt angeklickt.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Diese pr&uuml;ft, ob f&uuml;r die angeklickte Zelle ein Prim&auml;rschl&uuml;sselwert hinterlegt und somit &uuml;berhaupt ein Wert angezeigt wird. In diesem Fall gibt es den Prim&auml;rschl&uuml;sselwert der Zelle per Meldungsfenster aus. Diesen Befehl k&ouml;nnen Sie nat&uuml;rlich auch durch eine <b>DoCmd.OpenForm<\/b>-Anweisung ersetzen, mit der Sie ein Detailformular zum aktuellen Datensatz &ouml;ffnen.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Mit dem Formular und dem Webbrowser-Steuerelement zur Anzeige von Daten in einer Kreuztabelle haben wir eine L&ouml;sung entwickelt, die es so vermutlich noch nicht so oft gibt.<\/p>\n<p>Sie k&ouml;nnen zwar Abfragen im Format einer Kreuztabelle entwickeln, die bez&uuml;glich der Anzeige ihrer Werte noch m&auml;chtiger sind als unsere L&ouml;sung, denn sie k&ouml;nnen die im mittleren Bereich angezeigten Daten sogar noch also Summe, Mittelwert und so weiter anzeigen.<\/p>\n<p>Diese Werte k&ouml;nnten wir auch liefern, allerdings sind diese dann nat&uuml;rlich nicht mehr bearbeitbar. Dies ist nur m&ouml;glich, wenn es jede Kombination aus Spaltenkopf und Zeilenkopf nur einmal in den Daten der zugrunde liegenden Tabellen gibt.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>HTMLKreuztabelleBearbeiten.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/84444B06-261B-4244-A948-D1F862A956D0\/aiu_1174.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In den ersten beiden Teilen der Beitragsreihe haben wir gezeigt, wie Sie die Daten einer Tabelle in Form einer Kreuztabelle ausgeben k&ouml;nnen. Das ist nat&uuml;rlich auch per Kreuztabellenabfrage m&ouml;glich, aber wir haben in diesem Fall das Webbrowser-Steuerelement mit einer entsprechenden HTML-Seite verwendet. Der Hintergrund ist, dass wir so Funktionen zum direkten Bearbeiten der Eintr&auml;ge hinzuf&uuml;gen k&ouml;nnen &#8211; vorausgesetzt, dass die Kreuztabelle nur die Werte einer Kombination anzeigt und nicht etwa Dom&auml;nenfunktionen wie Summen oder Mittelwerte. Wir wollen also die bereits vorhandene Darstellung noch um Funktionen zum Bearbeiten sowie zum Hinzuf&uuml;gen neuer Spalten oder Zeilen erweitern.<\/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":[66012019,662019,44000023],"tags":[],"class_list":["post-55001174","post","type-post","status-publish","format-standard","hentry","category-66012019","category-662019","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>HTML-Kreuztabelle 3: Neue Zeilen und Spalten - 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\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"HTML-Kreuztabelle 3: Neue Zeilen und Spalten\" \/>\n<meta property=\"og:description\" content=\"In den ersten beiden Teilen der Beitragsreihe haben wir gezeigt, wie Sie die Daten einer Tabelle in Form einer Kreuztabelle ausgeben k&ouml;nnen. Das ist nat&uuml;rlich auch per Kreuztabellenabfrage m&ouml;glich, aber wir haben in diesem Fall das Webbrowser-Steuerelement mit einer entsprechenden HTML-Seite verwendet. Der Hintergrund ist, dass wir so Funktionen zum direkten Bearbeiten der Eintr&auml;ge hinzuf&uuml;gen k&ouml;nnen - vorausgesetzt, dass die Kreuztabelle nur die Werte einer Kombination anzeigt und nicht etwa Dom&auml;nenfunktionen wie Summen oder Mittelwerte. Wir wollen also die bereits vorhandene Darstellung noch um Funktionen zum Bearbeiten sowie zum Hinzuf&uuml;gen neuer Spalten oder Zeilen erweitern.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-13T21:05:41+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/360640d49ca34d1ab5ce17966f50aff6\" \/>\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=\"21\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"HTML-Kreuztabelle 3: Neue Zeilen und Spalten\",\"datePublished\":\"2020-05-13T21:05:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\\\/\"},\"wordCount\":3706,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/360640d49ca34d1ab5ce17966f50aff6\",\"articleSection\":[\"1\\\/2019\",\"2019\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\\\/\",\"name\":\"HTML-Kreuztabelle 3: Neue Zeilen und Spalten - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/360640d49ca34d1ab5ce17966f50aff6\",\"datePublished\":\"2020-05-13T21:05:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/360640d49ca34d1ab5ce17966f50aff6\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/360640d49ca34d1ab5ce17966f50aff6\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"HTML-Kreuztabelle 3: Neue Zeilen und Spalten\"}]},{\"@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":"HTML-Kreuztabelle 3: Neue Zeilen und Spalten - 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\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\/","og_locale":"de_DE","og_type":"article","og_title":"HTML-Kreuztabelle 3: Neue Zeilen und Spalten","og_description":"In den ersten beiden Teilen der Beitragsreihe haben wir gezeigt, wie Sie die Daten einer Tabelle in Form einer Kreuztabelle ausgeben k&ouml;nnen. Das ist nat&uuml;rlich auch per Kreuztabellenabfrage m&ouml;glich, aber wir haben in diesem Fall das Webbrowser-Steuerelement mit einer entsprechenden HTML-Seite verwendet. Der Hintergrund ist, dass wir so Funktionen zum direkten Bearbeiten der Eintr&auml;ge hinzuf&uuml;gen k&ouml;nnen - vorausgesetzt, dass die Kreuztabelle nur die Werte einer Kombination anzeigt und nicht etwa Dom&auml;nenfunktionen wie Summen oder Mittelwerte. Wir wollen also die bereits vorhandene Darstellung noch um Funktionen zum Bearbeiten sowie zum Hinzuf&uuml;gen neuer Spalten oder Zeilen erweitern.","og_url":"https:\/\/access-im-unternehmen.de\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-13T21:05:41+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/360640d49ca34d1ab5ce17966f50aff6","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"21\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"HTML-Kreuztabelle 3: Neue Zeilen und Spalten","datePublished":"2020-05-13T21:05:41+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\/"},"wordCount":3706,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/360640d49ca34d1ab5ce17966f50aff6","articleSection":["1\/2019","2019","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\/","url":"https:\/\/access-im-unternehmen.de\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\/","name":"HTML-Kreuztabelle 3: Neue Zeilen und Spalten - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/360640d49ca34d1ab5ce17966f50aff6","datePublished":"2020-05-13T21:05:41+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/360640d49ca34d1ab5ce17966f50aff6","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/360640d49ca34d1ab5ce17966f50aff6"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/HTMLKreuztabelle_3_Neue_Zeilen_und_Spalten\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"HTML-Kreuztabelle 3: Neue Zeilen und Spalten"}]},{"@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\/55001174","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=55001174"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001174\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001174"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001174"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001174"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}