{"id":55001189,"date":"2019-06-01T00:00:00","date_gmt":"2020-05-13T20:54:41","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1189"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Flexible_HTMLTabellen_mit_fester_Kopfzeile","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\/","title":{"rendered":"Flexible HTML-Tabellen mit fester Kopfzeile"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/ab940634dd7d42c4ab452b35e8aee9a9\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Im Beitrag &#8222;HTML-Tabellen mit fester Kopfzeile&#8220; haben wir gezeigt, wie Sie Daten aus einer bestimmten Abfrage in einem Webbrowser-Steuerelement so anzeigen, dass die Spaltenk&ouml;pfe oben fixiert bleiben, w&auml;hrend der Benutzer den Inhalt der Tabelle, also die eigentlichen Datens&auml;tze, nach unten scrollt. Wir wollen das Beispiel aus diesem Beitrag nun so erweitern, dass Sie die scrollbare HTML-Tabelle f&uuml;r beliebige Tabellen oder Abfragen als Datenquelle nutzen k&ouml;nnen. Diese sollen per Parameter beim &Ouml;ffnen des Formulars festgelegt werden. Das Layout der Tabellen sowie die anzuzeigenden Daten sollen dann automatisch ermittelt werden &#8211; samt den enthaltenen Feldnamen oder &#8211;bezeichnungen als Spaltenk&ouml;pfen.<\/b><\/p>\n<p>Das Ziel dieses Beitrags ist, die L&ouml;sung aus dem Artikel <b>HTML-Tabellen mit fester Kopfzeile <\/b>(<b>www.access-im-unternehmen.de\/1188<\/b>) so anzupassen, dass Sie damit Daten aus beliebigen Tabellen oder Abfragen in einer -scrollbaren HTML-Tabelle anzeigen k&ouml;nnen.<\/p>\n<p>Das Ergebnis soll dann etwa so aussehen, dass Sie wie in Bild 1 einfach die anzuzeigende Tabelle oder Abfrage aus einem Kombinationsfeld ausw&auml;hlen k&ouml;nnen, und das Webbrowser-Steuerelement eine Tabelle mit den Daten der gew&auml;hlten Tabelle oder Abfrage anzeigt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_03\/pic_1189_001.png\" alt=\"HTML-Tabelle mit Scrollbalken\" width=\"549,6265\" height=\"619,4525\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: HTML-Tabelle mit Scrollbalken<\/span><\/b><\/p>\n<h2>Auswahl der Datenquelle<\/h2>\n<p>Dazu ben&ouml;tigen wir zun&auml;chst einmal ein Kombinationsfeld, mit dem Sie die Datenquelle ausw&auml;hlen k&ouml;nnen.<\/p>\n<p>Dieses f&uuml;gen wir dem Kopf des Formulars wie in Bild 2 hinzu und stellen die Eigenschaft <b>Name<\/b> auf <b>cboDatenquelle <\/b>ein.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_03\/pic_1189_002.png\" alt=\"Hinzuf&uuml;gen des Kombinationsfeldes zur Auswahl der Datenquelle\" width=\"549,6265\" height=\"337,8777\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Hinzuf&uuml;gen des Kombinationsfeldes zur Auswahl der Datenquelle<\/span><\/b><\/p>\n<p>Als Datensatzherkunft des Kombinationsfeldes verwenden wir die folgende Abfrage:<\/p>\n<pre>SELECT Name FROM MSysObjects WHERE Type In (1,5) And <span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Left<\/span>(Name,1)=''~'' And <span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Left<\/span>(Name,4)=''MSys'' And <span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Left<\/span>(Name,2)=''f_'' ORDER BY Name;<\/pre>\n<p>Diese Abfrage ermittelt alle Tabellen und Abfragen aus der Systemtabelle <b>MSysObjects<\/b> und sortiert diese nach dem Namen. Das Kombinationsfeld zeigt die Eintr&auml;ge dann etwa wie in Bild 3 an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_03\/pic_1189_003.png\" alt=\"Auswahl der Datenquelle f&uuml;r die HTML-Tabelle\" width=\"649,559\" height=\"300,3679\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Auswahl der Datenquelle f&uuml;r die HTML-Tabelle<\/span><\/b><\/p>\n<h2>Daten beim &Ouml;ffnen des Formulars anzeigen<\/h2>\n<p>Beim &Ouml;ffnen des Formulars soll das Webbrowser-Steuerelement direkt die Daten der ersten Datenquelle des Kombinationsfeldes anzeigen.<\/p>\n<p>Dazu sorgen wir daf&uuml;r, dass direkt der erste Eintrag im Kombinationsfeld vorausgew&auml;hlt wird, und zwar durch die zweite Zeile der Ereignisprozedur <b>Form_Open<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Open(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Set<\/span> objWebbrowser = Me!ctlWebbrowser.Object\r\n     Me!cboDatenquelle = Me!cboDatenquelle.ItemData(0)\r\n     Me.TimerInterval = 50\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Durch Einstellen der Eigenschaft <b>TimerInterval <\/b>auf den Wert <b>50 <\/b>wird 50 Millisekunden nach dem &Ouml;ffnen des Formulars die folgende <b>Form_Timer<\/b>-Prozedur ausgel&ouml;st:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Timer()\r\n     objWebbrowser.Navigate \"about:blank\"\r\n     <span style=\"color:blue;\">Set<\/span> objDocument = objWebbrowser.Document\r\n     Me.TimerInterval = 0\r\n     DoEvents\r\n     objDocument.body.innerHTML = HTMLCode(Me!cboDatenquelle)\r\n     Inzwischenablage objDocument.body.innerHTML\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese unterscheidet sich in einem Detail von der entsprechenden Prozedur, die wir im oben genannten Beitrag vorgestellt haben. Sie &uuml;bergibt beim Aufruf der Funktion <b>HTMLCode<\/b>, welche den HTML-Code f&uuml;r die Darstellung der Tabelle zusammensetzt, f&uuml;r den Parameter <b>strDatenquelle <\/b>den Namen der Datenquelle.<\/p>\n<p>Das Gleiche geschieht auch in der Prozedur, die der Benutzer durch einen Mausklick auf die Schaltfl&auml;che <b>cmdAktualisieren <\/b>ausl&ouml;st. Die Ereignisprozedur ruft ebenfalls die Funktion <b>HTMLCode <\/b>mit dem Wert des Kombinationsfeldes <b>cboDatenquelle <\/b>als Parameter auf. Diese Prozedur wird dazu wie folgt ge&auml;ndert:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAktualisieren_Click()\r\n     objDocument.body.innerHTML = HTMLCode(Me!cboDatenquelle)\r\n     Inzwischenablage objDocument.body.innerHTML\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Schlie&szlig;lich m&ouml;chten wir auch, dass der Inhalt des Web-browser-Steuerelements auch beim Aktualisieren der ausgew&auml;hlten Datenquelle &uuml;ber das Kombinationsfeld <b>cboDatenquelle <\/b>aktualisiert wird, was wir mit der folgenden Ereignisprozedur realisieren:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboDatenquelle_AfterUpdate()\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(Me!cboDatenquelle) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         objDocument.body.innerHTML =  HTMLCode(Me!cboDatenquelle)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>HTML-Code datenquellenabh&auml;ngig zusammenstellen<\/h2>\n<p>Damit kommen wir zum interessanten Teil, n&auml;mlich dem Code, mit dem wir den HTML-Code abh&auml;ngig von der gew&auml;hlten Datenquelle zusammenstellen. Den ersten Teil dieser Funktion finden Sie in Listing 1.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>HTMLCode(strDatenquelle<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database, rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset, fld<span style=\"color:blue;\"> As <\/span>DAO.Field\r\n     <span style=\"color:blue;\">Dim <\/span>strHTML<span style=\"color:blue;\"> As String<\/span>, strFeldname<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT TOP 100 * FROM \" & strDatenquelle, dbOpenDynaset)\r\n     strHTML = strHTML & HTMLStyle(rst)\r\n     strHTML = strHTML & \"&lt;table class=\"\"tableheaders\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strHTML = strHTML & \"  &lt;thead&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strHTML = strHTML & \"    &lt;tr&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     For Each fld In rst.Fields\r\n         Select Case fld.Type\r\n             <span style=\"color:blue;\">Case <\/span>dbInteger, dbLong, dbText, dbMemo, dbCurrency, dbDate, dbSingle, dbDouble, dbBoolean\r\n                 strFeldname = \"\"\r\n                 On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n                 strFeldname = fld.Properties(\"Caption\")\r\n                 <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n                 <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strFeldname) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                     strFeldname = fld.Name\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n                 i = i + 1\r\n                 strHTML = strHTML & \"      &lt;th class=\"\"th\" & i & \"\"\" scope=\"\"col\"\"&gt;\" & strFeldname & \"&lt;\/th&gt; \" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n             <span style=\"color:blue;\">Case Else<\/span>\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> fld\r\n     strHTML = strHTML & \"    &lt;\/tr&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strHTML = strHTML & \"  &lt;\/thead&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     ...\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Listing zum Zusammenstellen des HTML-Codes, Teil 1<\/span><\/b><\/p>\n<p>Die Funktion erwartet den Namen der mit dem Kombinationsfeld ausgew&auml;hlten Tabelle oder Abfrage als Parameter. Sie erstellt ein <b>Database<\/b>-Objekt namens <b>db <\/b>sowie ein <b>Recordset<\/b>-Objekt namens <b>rst<\/b>, welches die ersten 100 Datens&auml;tze der gew&auml;hlten Datenquelle ausw&auml;hlt. Die Erstellung des HTML-Codes dauert f&uuml;r gr&ouml;&szlig;ere Datenmengen relativ lange, daher haben wir diese Beschr&auml;nkung f&uuml;r die Beispieldatei eingef&uuml;gt. Sie k&ouml;nnen <b>TOP 100 <\/b>in der folgenden Anweisung entfernen, wenn Sie immer alle Datens&auml;tze laden wollen:<\/p>\n<pre>     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT TOP 100 * FROM \"  & strDatenquelle, dbOpenDynaset)<\/pre>\n<p>Danach ruft die Funktion eine weitere Funktion namens <b>HTMLStyle <\/b>auf und &uuml;bergibt dieser das Recordset als Parameter. Die Beschreibung dieser Funktion, die den CSS-Code in Abh&auml;ngigkeit der Datenquelle zusammenstellt, finden Sie weiter unten.<\/p>\n<p>Danach f&uuml;gt die Funktion die ersten HTML-Elemente f&uuml;r den Kopfbereich der Tabelle beziehungsweise die umfassende Tabelle an. Nach dem Anlegen der ersten drei Elemente <b>table<\/b>, <b>thead <\/b>und <b>tr <\/b>folgenden die Spalten&uuml;berschriften f&uuml;r die Felder der Datenquelle.<\/p>\n<p>Um dabei auf die jeweiligen Felder der gew&auml;hlten Datenquelle zuzugreifen, durchlaufen wir die Felder des <b>Recordset<\/b>-Objekts <b>rst <\/b>in einer <b>For Each<\/b>-Schleife und weisen das jeweilige <b>Field<\/b>-Objekt der Variablen <b>fld <\/b>zu. Innerhalb dieser Schleife pr&uuml;fen wir in einer <b>Select Case<\/b>-Bedingung den Typ des jeweiligen Feldes. Wir wollen nicht alle Felddatentypen in der Tabelle auff&uuml;hren &#8211; so schlie&szlig;en wir beispielsweise OLE- und Anlagefelder aus. Die erste <b>Case<\/b>-Bedingung behandelt somit die Datentypen <b>Integer<\/b>, <b>Long<\/b>, <b>Text<\/b>, <b>Memo<\/b>, <b>Currency<\/b>, <b>Date<\/b>, <b>Single<\/b>, <b>Double <\/b>und <b>Boolean<\/b>. Weitere Datentypen k&ouml;nnen Sie nach Bedarf hinzuf&uuml;gen. Sollten Sie die Funktion in einer eigenen Anwendung einsetzen und die dort gew&auml;hlte Datenquelle enth&auml;lt ein Feld mit einem Datentyp, der hier nicht behandelt wird, gibt die Prozedur die Nummer des Datentyps im Direktbereich des VBA-Editors aus &#8211; dies geschieht im <b>Else<\/b>-Zweig der <b>Select Case<\/b>-Bedingung.<\/p>\n<p>Handelt es sich bei <b>fld<\/b> um ein Feld mit einem unterst&uuml;tzten Datentyp, ermittelt die Funktion entweder den Feldnamen des Feldes oder, falls vorhanden, den Wert der Eigenschaft <b>Beschriftung<\/b>, den Sie in den Feldeigenschaften im Tabellenentwurf einstellen k&ouml;nnen.<\/p>\n<p>Wir stellen die Variable <b>strFeldname<\/b>, die den Feldnamen aufnimmt, zun&auml;chst auf eine leere Zeichenkette ein. Dann schalten wir die Fehlerbehandlung tempor&auml;r aus, und zwar f&uuml;r den Versuch, den Wert der Eigenschaft <b>Caption <\/b>&uuml;ber die <b>Properties<\/b>-Auflistung des Feldes zu ermitteln.<\/p>\n<p>Gelingt dies, enth&auml;lt <b>strFeldname <\/b>danach die Beschriftung dieses Feldes. Dies pr&uuml;fen wir in der folgenden <b>If&#8230;Then<\/b>-Bedingung. Hat <b>strFeldname <\/b>dort eine L&auml;nge ungleich <b>0<\/b>, tragen wir den Feldnamen aus der Eigenschaft <b>Name <\/b>in die Variable <b>strFeldname <\/b>ein und verwenden diesen als Spalten&uuml;berschrift. Nun erh&ouml;hen wir eine Z&auml;hlervariable namens <b>i <\/b>um den Wert <b>1 <\/b>und stellen die HTML-Zeile f&uuml;r die aktuelle Spalten&uuml;berschrift zusammen. Diese sieht dann etwa wie folgt aus:<\/p>\n<pre>      &lt;th class=\"th1\" scope=\"col\"&gt;ArtikelID&lt;\/th&gt; <\/pre>\n<p>Danach durchlaufen wir die &uuml;brigen Felder des Recordsets und stellen so die Spalten&uuml;berschriften zusammen. Es folgen die schlie&szlig;enden Elemente wie <b>&lt;\/tr&gt; <\/b>und <b>&lt;\/thead&gt;<\/b>, bevor sich der folgende Teil um die Darstellung der Daten in der HTML-Tabelle k&uuml;mmert.<\/p>\n<h2>Daten in die HTML-Tabelle schreiben<\/h2>\n<p>Damit kommen wir zum zweiten Teil der Prozedur, den Sie in Listing 2 finden.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>HTMLCode(strDatenquelle<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     ...\r\n     strHTML = strHTML & \"  &lt;tbody&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strHTML = strHTML & \"    &lt;tr&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strHTML = strHTML & \"      &lt;td colspan=\"\"\" & rst.Fields.Count & \"\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strHTML = strHTML & \"        &lt;div class=\"\"scrolling\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strHTML = strHTML & \"          &lt;table class=\"\"tablecontent\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strHTML = strHTML & \"            &lt;tbody&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         <span style=\"color:blue;\">If <\/span>rst.AbsolutePosition <span style=\"color:blue;\">Mod<\/span> 2 = 0<span style=\"color:blue;\"> Then<\/span>\r\n             strHTML = strHTML & \"              &lt;tr&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             strHTML = strHTML & \"              &lt;tr class=\"\"dk\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         i = 0\r\n         For Each fld In rst.Fields\r\n             i = i + 1\r\n             Select Case fld.Type\r\n                 <span style=\"color:blue;\">Case <\/span>dbInteger, dbLong, dbText, dbMemo, dbDate\r\n                     strHTML = strHTML & \"                &lt;td class=\"\"td\" & i & \"\"\"&gt;\" & fld.Value & \"&lt;\/td&gt;\" _\r\n                         & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                 <span style=\"color:blue;\">Case <\/span>dbCurrency\r\n                     strHTML = strHTML & \"                &lt;td class=\"\"td\" & i & \"\"\"&gt;\" & Format(fld.Value, \"0.00 &euro;\") _\r\n                         & \"&lt;\/td&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                 <span style=\"color:blue;\">Case <\/span>dbSingle, dbDouble\r\n                     strHTML = strHTML & \"                &lt;td class=\"\"td\" & i & \"\"\"&gt;\" & Format(fld.Value, \"0.00\") _\r\n                         & \"&lt;\/td&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                 <span style=\"color:blue;\">Case <\/span>dbBoolean\r\n                     strHTML = strHTML & \"                &lt;td class=\"\"td\" & i & \"\"\"&gt;\" & IIf(fld.Value = -1, _\r\n                         \"Ja\", \"Nein\") & \"&lt;\/td&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                 <span style=\"color:blue;\">Case Else<\/span>\r\n                     <span style=\"color:blue;\">Debug.Print<\/span> fld.Type\r\n             <span style=\"color:blue;\">End Select<\/span>\r\n         <span style=\"color:blue;\">Next<\/span> fld\r\n         strHTML = strHTML & \"              &lt;\/tr&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     strHTML = strHTML & \"            &lt;\/tbody&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strHTML = strHTML & \"          &lt;\/table&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strHTML = strHTML & \"        &lt;\/div&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strHTML = strHTML & \"      &lt;\/td&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strHTML = strHTML & \"    &lt;\/tr&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strHTML = strHTML & \"  &lt;\/tbody&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strHTML = strHTML & \"&lt;\/table&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     HTMLCode = strHTML\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Listing zum Zusammenstellen des HTML-Codes, Teil 2<\/span><\/b><\/p>\n<p>Hier legen wir zun&auml;chst die umgebenden Elemente wie <b>&lt;tbody&gt;<\/b>, <b>&lt;tr&gt; <\/b>und <b>&lt;td&gt; <\/b>zusammen, wobei wir den Wert f&uuml;r das Attribut <b>colspan<\/b> aus der Anzahl der Felder aus der Variablen <b>i <\/b>ermitteln, welche f&uuml;r jedes ber&uuml;cksichtigte Feld um den Wert <b>1 <\/b>erh&ouml;ht wurde und nicht die Anzahl der tats&auml;chlichen Felder wiedergibt, sondern die Anzahl der Felder mit geeignetem Datentyp. Dies ist wichtig, weil wir in dieser Zelle die untergeordnete Tabelle einf&uuml;gen, deren Inhalte wir scrollen wollen. Dementsprechend weisen wir in der folgenden Anweisung auch die Klasse <b>scrolling <\/b>zu. Nun folgen die einleitenden Elemente der Tabelle, n&auml;mlich <b>&lt;table&gt; <\/b>mit der Klasse <b>tablecontent <\/b>und <b>&lt;tbody&gt;<\/b>.<\/p>\n<p>Und damit starten wir in die Schleife &uuml;ber alle Datens&auml;tze des Recordsets mit der Datenquelle der Tabelle. Hier ermitteln wir mit einer <b>If&#8230;Then<\/b>-Bedingung zun&auml;chst, ob es sich um eine ungerade oder gerade Position handelt und stellen dementsprechend f&uuml;r das nun hinzugef&uuml;gte <b>tr<\/b>-Element die Klasse <b>dk <\/b>ein oder auch nicht &#8211; diese Klasse wird sp&auml;ter per CSS mit einer alternierenden Hintergrundfarbe versehen.<\/p>\n<p>Schlie&szlig;lich durchlaufen wir die Felder des Recordsets f&uuml;r den aktuellen Datensatzes in einer <b>For Each<\/b>-Schleife mit der Laufvariablen <b>fld<\/b>, die das jeweilige Feld referenziert. Wir erh&ouml;hen dabei zun&auml;chst den Wert der Variablen <b>i <\/b>um den Wert <b>1<\/b>. Dann pr&uuml;fen wir wieder, welchen Felddatentyp das Feld aufweist.<\/p>\n<p>Hier unterscheiden wir etwas feiner als weiter oben, wo wir nur nach den zu ber&uuml;cksichtigenden Felddatentypen und den nicht zu ber&uuml;cksichtigenden Felddatentypen unterschieden haben. Im ersten <b>Case<\/b>-Teil der <b>Select Case<\/b>-Bedingung f&uuml;gen wir die Werte f&uuml;r die Datentypen <b>Integer<\/b>, <b>Long<\/b>, <b>Text<\/b>, <b>Memo <\/b>und <b>Datum <\/b>hinzu. Daraus entsteht dann beispielsweise eine Zeile wie die folgende:<\/p>\n<pre>&lt;td class=\"td2\"&gt;Getr&auml;nke&lt;\/td&gt;<\/pre>\n<p>Die Zahl <b>2 <\/b>in der Bezeichnung der Klasse <b>td2 <\/b>stammt dabei aus der Variablen <b>i<\/b>, der f&uuml;r jedes Feld der Wert <b>1<\/b> hinzugef&uuml;gt wird.<\/p>\n<p>Bei Feldern des Typs <b>W&auml;hrung <\/b>f&uuml;gen wir mit der <b>Format<\/b>-Funktion noch eine Formatierung hinzu, bei der wie die Anzahl der Nachkommastellen auf <b>2 <\/b>einstellen und au&szlig;erdem das W&auml;hrungszeichen <b>&euro; <\/b>hinzuf&uuml;gen:<\/p>\n<pre>&lt;td class=\"td6\"&gt;7,50 &euro;&lt;\/td&gt;<\/pre>\n<p>F&uuml;r Zahlenfelder der Typen <b>Single <\/b>oder <b>Double <\/b>stellen wir ebenfalls per <b>Format<\/b>-Anweisung die Anzahl der Nachkommastellen auf <b>2 <\/b>ein (<b>Format(fld.Value, &#8222;0.00&#8220;)<\/b>).<\/p>\n<p>Schlie&szlig;lich m&uuml;ssen wir uns noch etwas dazu einfallen lassen, wie wir die Werte von <b>Boolean<\/b>-Feldern darstellen wollen. Wir w&auml;hlen die einfache L&ouml;sung und geben f&uuml;r den Wert <b>-1<\/b>\/<b>True <\/b>einfach den Text <b>Ja <\/b>und f&uuml;r den Wert <b>0<\/b>\/<b>False <\/b>den Text <b>Nein <\/b>aus.<\/p>\n<p>F&uuml;r alle anderen Felddatentypen geben wir den Wert der Eigenschaft <b>Type <\/b>des Feldes im Direktbereich aus. Sie k&ouml;nnen diese dann gegebenenfalls noch zus&auml;tzlich implementieren. Denken Sie dabei daran, dass Sie diesen in allen <b>Select Case<\/b>-Bedingungen ber&uuml;cksichtigen m&uuml;ssen &#8211; also in den beiden der Funktion <b>HTMLCode <\/b>und auch in der <b>Select Case<\/b>-Bedingung der Funktion <b>HTMLStyle<\/b>.<\/p>\n<p>Nachdem auf diese Weise alle Felder f&uuml;r den aktuellen Datensatz durchlaufen wurden, folgen die &uuml;brigen Datens&auml;tze der <b>Do While<\/b>-Schleife. Nach dem Durchlaufen aller Datens&auml;tze erg&auml;nzt die Funktion noch die schlie&szlig;enden Elemente.<\/p>\n<p>F&uuml;r die Tabelle <b>tblArtikel <\/b>der Beispieldatenbank sieht das Ergebnis dann etwa wie in Bild 4 aus. F&uuml;r die Fremdschl&uuml;sselfelder <b>LieferantID <\/b>und <b>KategorieID <\/b>werden hier nur die Zahlenwerte ausgegeben. Wenn hier Werte aus den verkn&uuml;pften Tabellen ausgegeben werden sollen, haben wir zwei M&ouml;glichkeiten:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_03\/pic_1189_004.png\" alt=\"Ausgabe der Daten der Tabelle tblArtikel\" width=\"700\" height=\"264,0719\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Ausgabe der Daten der Tabelle tblArtikel<\/span><\/b><\/p>\n<ul>\n<li>Wir erstellen eine Abfrage &uuml;ber die Tabelle <b>tblArtikel <\/b>und die Tabellen mit den verkn&uuml;pften Daten und w&auml;hlen diese statt der Tabelle <b>tblArtikel <\/b>aus.<\/li>\n<li>Oder wir erg&auml;nzen den Code der Funktion <b>HTMLCode <\/b>noch so, dass er automatisch erkennt, wenn er ein Nachschlagefeld vor sich hat, und die relevanten Daten aus der verkn&uuml;pften Tabelle einliest.<\/li>\n<\/ul>\n<p>Erstere Variante k&ouml;nnen Sie selbst durchf&uuml;hren, die zweite m&uuml;ssen wir hinzuprogrammieren. Dazu &auml;ndern wir schlicht den <b>Case<\/b>-Zweig f&uuml;r die Elemente, zu denen auch <b>dbLong <\/b>geh&ouml;rt (was in fast jedem Fall als Datentyp f&uuml;r Fremdschl&uuml;sselfelder verwendet wird), wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Case <\/span>dbInteger, dbLong, dbText, dbMemo, dbDate\r\n     <span style=\"color:blue;\">If <\/span>IstNachschlagefeld(fld)<span style=\"color:blue;\"> Then<\/span>\r\n         strWert = Nachschlagewert(db, fld)\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         strWert = fld.Value\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     strHTML = strHTML & \"                &lt;td class=\"\"td\"  & i & \"\"\"&gt;\" & strWert & \"&lt;\/td&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span><\/pre>\n<p>Hier rufen wir zuerst die Funktion <b>IstNachschlagefeld <\/b>auf, die wie folgt aussieht:<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>IstNachschlagefeld(fld<span style=\"color:blue;\"> As <\/span>DAO.Field) <span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>prp<span style=\"color:blue;\"> As <\/span>DAO.Property\r\n     <span style=\"color:blue;\">Dim <\/span>strProperty<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolIstNachschlagefeld<span style=\"color:blue;\"> As Boolean<\/span>\r\n     strProperty = \"\"\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     strProperty = fld.Properties(\"DisplayControl\")\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strProperty) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span>fld.Properties(\"DisplayControl\") = acComboBox<span style=\"color:blue;\"> Then<\/span>\r\n             bolIstNachschlagefeld = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             bolIstNachschlagefeld = <span style=\"color:blue;\">False<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         bolIstNachschlagefeld = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     IstNachschlagefeld = bolIstNachschlagefeld\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Diese Funktion nimmt das zu untersuchende Feld als Parameter mit dem Typ <b>Field <\/b>entgegen und liefert einen <b>Boolean<\/b>-Wert als Ergebnis zur&uuml;ck. Wichtig ist die Information, dass ein Feld, wenn es als Nachschlagefeld ausgelegt wurde, meist den Wert <b>acComboBox <\/b>f&uuml;r die Eigenschaft <b>DisplayControl <\/b>aufweist. Das pr&uuml;fen wir hier zuerst. Das Problem dabei ist, dass diese Eigenschaft auch nur f&uuml;r Felder angelegt wird, die nicht den Standardtyp f&uuml;r die Ausgabe aufweisen, n&auml;mlich das Textfeld. Wenn wir also einfach &uuml;ber die Auflistung <b>Properties <\/b>auf die Eigenschaft <b>DisplayControl<\/b> zugreifen und diese ist nicht vorhanden, l&ouml;sen wir damit einen Fehler aus. Wir k&ouml;nnen also auf zwei Arten auf diese Eigenschaft zugreifen: Entweder wir durchlaufen alle Elemente der <b>Property<\/b>-Auflistung und pr&uuml;fen f&uuml;r jedes, ob der Name <b>DisplayControl <\/b>ist. Oder wir greifen einfach bei deaktivierter Fehlerbehandlung darauf zu und schauen, ob diese einen Wert enth&auml;lt.<\/p>\n<p>Wir w&auml;hlen die letztere Methode und f&uuml;hren die Anweisung <b>On Error Resume Next <\/b>auf, bevor wir auf <b>fld.Properties(&#8222;DisplayControl&#8220;) <\/b>zugreifen, um den Inhalt in der Variablen <b>strProperty <\/b>zu speichern. Danach aktivieren wir die eingebaute Fehlerbehandlung wieder mit <b>On Error Goto 0 <\/b>und pr&uuml;fen dann, ob ein Wert in der Variablen <b>strProperty <\/b>angelegt wurde. Ist das der Fall, pr&uuml;fen wir, ob es sich bei dem Wert um die Zahl <b>111 <\/b>handelt, welche der Konstanten <b>acComboBox <\/b>entspricht. Nur dann stellen wir den Wert der Variablen <b>bolIstNachschlagefeld <\/b>auf <b>True <\/b>ein, der dann auch als Ergebnis der Funktion zur&uuml;ckgegeben wird.<\/p>\n<p>Blicken wir auf den relevanten Ausschnitt der aufrufenden Funktion zur&uuml;ck:<\/p>\n<pre>     <span style=\"color:blue;\">If <\/span>IstNachschlagefeld(fld)<span style=\"color:blue;\"> Then<\/span>\r\n         strWert = Nachschlagewert(db, fld)<\/pre>\n<p>Wenn <b>IstNachschlagefeld <\/b>den Wert <b>True <\/b>liefert, rufen wir die Funktion <b>Nachschlagewert <\/b>auf, um den in dieser Zelle der HTML-Tabelle anzuzeigenden Wert zu ermitteln. Diese Funktion sieht so aus:<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>Nachschlagewert(db<span style=\"color:blue;\"> As <\/span>DAO.Database,  fld<span style=\"color:blue;\"> As <\/span>DAO.Field)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>strDatenquelle<span style=\"color:blue;\"> As String<\/span>\r\n     strDatenquelle = fld.Properties(\"RowSource\")\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(strDatenquelle,  dbOpenDynaset)\r\n     rst.FindFirst rst.Fields(0).Name & \" = \" & fld.Value\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> rst.NoMatch<span style=\"color:blue;\"> Then<\/span>\r\n         Nachschlagewert = rst.Fields(1)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Sie erwartet Verweise auf das aktuelle <b>Database<\/b>-Objekt (<b>db<\/b>) sowie das zu untersuchende Nachschlagefeld (<b>fld<\/b>). Hier gehen wir vereinfachend davon aus, dass Nachschlagefelder immer so angelegt sind, dass die Datensatzherkunft im ersten Feld den Prim&auml;rschl&uuml;sselfeld der verkn&uuml;pften Tabelle enth&auml;lt und im zweiten Feld den anzuzeigenden Wert &#8211; also etwa so wie in Bild 5. Ist das bei Ihnen regelm&auml;&szlig;ig nicht der Fall, m&uuml;ssten Sie die Funktion noch erheblich erweitern und die Eigenschaften <b>Gebundene Spalte<\/b>, <b>Spaltenanzahl <\/b>und <b>Spaltenbreiten <\/b>des Nachschlagefeldes untersuchen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_03\/pic_1189_005.png\" alt=\"Eigenschaften eines Nachschlagefeldes\" width=\"499,6607\" height=\"387,9941\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Eigenschaften eines Nachschlagefeldes<\/span><\/b><\/p>\n<p>Die Funktion ermittelt dann &uuml;ber die Eigenschaft <b>RowSource <\/b>zun&auml;chst die SQL-Anweisung f&uuml;r die Datensatzherkunft und speichert diese in der Variablen <b>strDatenquelle<\/b>. Dann erstellt sie ein Recordset auf Basis dieser Datenquelle und sucht mit der <b>FindFirst<\/b>-Methode nach dem ersten Datensatz, dessen erstes Feld (also nach unserer Annahme das Prim&auml;rschl&uuml;sselfeld) den Wert des zu untersuchenden Fremdschl&uuml;sselfeldes enth&auml;lt. Danach pr&uuml;ft die Funktion, ob ein passender Eintrag im Recordset gefunden wurde. Falls ja, schreibt die Prozedur den Wert der zweiten Spalte des Recordsets als R&uuml;ckgabewert in die Variable <b>Nachschlagewert<\/b>.<\/p>\n<p>Dieser Wert landet dann in der aufrufenden Funktion <b>HTMLCode <\/b>in der Variablen <b>strWert<\/b>. Hat <b>IstNachschlagefeld <\/b>den Wert <b>False <\/b>geliefert, tr&auml;gt die Funktion einfach den Wert des aktuellen Feldes in <b>strWert <\/b>ein.<\/p>\n<h2>HTML-Code f&uuml;r die CSS-Anweisungen zusammenstellen<\/h2>\n<p>Die Funktion zum Zusammenstellen der CSS-Anweisungen finden Sie in Listing 3. Die Prozedur erwartet mit dem Parameter <b>rst <\/b>das von der aufrufenden Funktion <b>HTMLCode <\/b>&uuml;bergebene <b>Recordset<\/b>-Objekt.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>HTMLStyle(rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strHTML<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>fld<span style=\"color:blue;\"> As <\/span>DAO.Field\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strHTMLHeaders<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strHTMLRecords<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intPercent<span style=\"color:blue;\"> As Integer<\/span>\r\n     strHTML = strHTML & \"&lt;style&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strHTML = strHTML & \"  .tableheaders {width:100%; border-collapse:collapse; font-family:calibri; \" _\r\n         & \"background:#666; border:1px solid #fff; color:#fff;}\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     For Each fld In rst.Fields\r\n         i = i + 1\r\n         Select Case fld.Type\r\n             <span style=\"color:blue;\">Case <\/span>dbInteger, dbLong, dbText, dbMemo, dbCurrency, dbDate, dbSingle, dbDouble, dbBoolean\r\n                 Select Case fld.Type\r\n                     <span style=\"color:blue;\">Case <\/span>dbInteger, dbLong, dbCurrency, dbDate, dbSingle, dbDouble, dbBoolean\r\n                         <span style=\"color:blue;\">If <\/span>IstNachschlagefeld(fld)<span style=\"color:blue;\"> Then<\/span>\r\n                             intPercent = 10\r\n                         <span style=\"color:blue;\">Else<\/span>\r\n                             intPercent = 5\r\n                         <span style=\"color:blue;\">End If<\/span>\r\n                     <span style=\"color:blue;\">Case <\/span>dbText\r\n                         intPercent = 10\r\n                     <span style=\"color:blue;\">Case <\/span>dbMemo\r\n                         intPercent = 20\r\n                     <span style=\"color:blue;\">Case Else<\/span>\r\n                         <span style=\"color:blue;\">MsgBox<\/span> \"Type \" & fld.Type & \" fehlt.\"\r\n                 <span style=\"color:blue;\">End Select<\/span>\r\n                 strHTMLHeaders = strHTMLHeaders & \"  .th\" & i & \" {width:\" & intPercent & \"%;text-align:left;}\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                 strHTMLRecords = strHTMLRecords & \"  .td\" & i & \" {width:\" & intPercent & \"%;text-align:left;}\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n             <span style=\"color:blue;\">Case Else<\/span>\r\n                 <span style=\"color:blue;\">Debug.Print<\/span> fld.Type\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> fld\r\n     strHTML = strHTML & strHTMLHeaders\r\n     strHTML = strHTML & \"  .tablecontent {width:100%; height:100%; border-collapse:collapse;font-family:calibri}\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strHTML = strHTML & strHTMLRecords\r\n     strHTML = strHTML & \"  .tableheaders tbody {background:#888; color:#fff;}\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strHTML = strHTML & \"  .tableheaders td {border:1px solid #fff; color:#fff; font-size:12px;}\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strHTML = strHTML & \"  .tableheaders th, .tabletwo th {text-align:left; font-size:13px;}\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strHTML = strHTML & \"  .tablecontent td {background:#eee; color:#000;}\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strHTML = strHTML & \"  .tablecontent tr.dk td {background:#ddd; color:#000;}\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strHTML = strHTML & \"  .scrolling {height:500px;overflow:auto;}\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strHTML = strHTML & \"&lt;\/style&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     HTMLStyle = strHTML\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Listing zum Zusammenstellen des HTML-Codes f&uuml;r den CSS-Teil<\/span><\/b><\/p>\n<p>Die Funktion stellt zun&auml;chst die allgemeinen Informationen f&uuml;r die CSS-Definition zusammen, zum Beispiel das <b>&lt;style&gt;<\/b>-Objekt und die Definition der <b>.tableheaders<\/b>-Klasse. Danach wird es interessant, denn wir m&uuml;ssen f&uuml;r die verschiedenen Spalten die Definition der CSS-Klassen <b>th <\/b>und <b>td <\/b>definieren. Dazu durchlaufen wir in einer <b>For Each<\/b>-Schleife alle Felder des Recordsets. Dabei erh&ouml;hen wir bei jedem Durchlauf den Wert der Variablen <b>i <\/b>um <b>1<\/b>.<\/p>\n<p>Auch hier wollen wir den Typ des jeweiligen Feldes ermitteln. Warum das Weil wir f&uuml;r die unterschiedlichen Datentypen verschiedene Spaltenbreiten definieren wollen. Dabei untersuchen wir in einer &auml;u&szlig;eren <b>Select Case<\/b>-Bedingung zun&auml;chst, ob der Datentyp auf <b>Integer<\/b>, <b>Long<\/b>, <b>Text<\/b>, <b>Memo<\/b>, <b>Currency<\/b>, <b>Single<\/b>, <b>Double <\/b>oder <b>Boolean <\/b>lautet.<\/p>\n<p>Innerhalb der <b>Select Case<\/b>-Bedingung differenzieren wir exakter zwischen den Datentypen. F&uuml;r die Datentypen <b>Integer<\/b>, <b>Long<\/b>, <b>Currency<\/b>, <b>Date<\/b>, <b>Single<\/b>, <b>Double <\/b>und <b>Boolean <\/b>wollen wir eine Breite von <b>5% <\/b>festlegen. F&uuml;r Textfelder legen wir mit <b>10% <\/b>die doppelte Breite fest und f&uuml;r Memofelder nochmals die doppelte Breite (<b>20%<\/b>). F&uuml;r hier nicht ber&uuml;cksichtigte Datentypen geben wir ein Meldungsfenster mit der Nummer des Felddatentyps aus, damit dieser in einem der <b>Case<\/b>-Zweige nachgetragen werden kann.<\/p>\n<p>Nach der Ermittlung der Spaltenbreiten in Prozent legen wir diese in den Definitionen der Klassen <b>.th <\/b>und <b>.td <\/b>beispielhaft wie folgt fest:<\/p>\n<pre>.th1 {width:5%;text-align:left;}\r\n...\r\n.td1 {width:5%;text-align:left;}<\/pre>\n<p>Die &uuml;brigen Anweisungen dieser Funktion f&uuml;gen einfach die ben&ouml;tigten CSS-Befehle zusammen und geben den so zusammengestellten String an die aufrufende Funktion <b>HTMLCode <\/b>zur&uuml;ck.<\/p>\n<h2>Abweichende Spaltenbreiten in &Uuml;berschriften und Inhalten<\/h2>\n<p>In manchen F&auml;llen befinden sich die &Uuml;berschriften der Spalten und die Inhalte der Spalten nicht genau untereinander &#8211; etwa so wie in Bild 6. Das ist der Fall, wenn das Webbrowser-Steuerelement nicht breit genug ist und die &Uuml;berschriften breiter sind als der &uuml;ber die prozentualen Anteile vergebene Platz f&uuml;r die Spalten mit den Daten in der scrollbaren Tabelle.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_03\/pic_1189_006.png\" alt=\"Verschobene Spalten&uuml;berschriften und Inhalte\" width=\"700\" height=\"282,0639\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Verschobene Spalten&uuml;berschriften und Inhalte<\/span><\/b><\/p>\n<p>In diesem Fall gibt es nur zwei M&ouml;glichkeiten: Die erste ist, einfach das Formular mit dem an beiden Seiten verankerten Webbrowser-Steuerelement zu vergr&ouml;&szlig;ern. Dann werden auch die Spalten mit den &Uuml;berschriften und den Daten auseinandergezogen (siehe Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_03\/pic_1189_007.png\" alt=\"Versatz am rechten Ende der Tabelle\" width=\"700\" height=\"242,7062\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Versatz am rechten Ende der Tabelle<\/span><\/b><\/p>\n<p>Die zweite M&ouml;glichkeit ist, alle Spalten&uuml;berschriften so zu gestalten, dass diese schmaler als der breiteste Inhalt sind.<\/p>\n<p>Die Abbildung zeigt &uuml;brigens ein kleines Problem, das wir nicht so einfach l&ouml;sen k&ouml;nnen: Dadurch, dass wir die untere Tabelle scrollbar gestaltet haben, erscheint dort am rechten Rand bei Bedarf die Bildlaufleiste.<\/p>\n<p>Dadurch gibt es in der umschlie&szlig;enden Tabelle mit den Spalten&uuml;berschriften mehr Platz entsprechend der Breite der Bildlaufleiste, der gleichm&auml;&szlig;ig auf die Spalten&uuml;berschriften aufgeteilt wird.<\/p>\n<p>Am linken Rand f&auml;llt das noch nicht auf, aber am rechten sind die Spalten&uuml;berschriften etwa um die Breite der Bildlaufleiste nach rechts versetzt.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Mit den hier vorgestellten Techniken k&ouml;nnen Sie in einem Formular die Daten aus allen Tabellen oder Abfragen einer Datenbank in einer HTML-Tabelle darstellen. Diese HTML-Tabelle ist dann auch noch scrollbar, ohne dass die Spalten&uuml;berschriften beim Scrollen aus dem sichtbaren Bereich verschwinden.<\/p>\n<p>Die dargestellten Daten k&ouml;nnte man noch erweitern, etwa indem man diese mit einem <b>Beim Klicken<\/b>-Ereignis versieht und dar&uuml;ber die Details zum jeweiligen Datensatz in einem Detailformular anzeigt.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>FlexibleHTMLTabelleMitFesterKopfzeile.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/67EBE594-CF76-4917-A5AD-A6D6C2131BBC\/aiu_1189.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Beitrag &#8222;HTML-Tabellen mit fester Kopfzeile&#8220; haben wir gezeigt, wie Sie Daten aus einer bestimmten Abfrage in einem Webbrowser-Steuerelement so anzeigen, dass die Spaltenk&ouml;pfe oben fixiert bleiben, w&auml;hrend der Benutzer den Inhalt der Tabelle, also die eigentlichen Datens&auml;tze, nach unten scrollt. Wir wollen das Beispiel aus diesem Beitrag nun so erweitern, dass Sie die scrollbare HTML-Tabelle f&uuml;r beliebige Tabellen oder Abfragen als Datenquelle nutzen k&ouml;nnen. Diese sollen per Parameter beim &Ouml;ffnen des Formulars festgelegt werden. Das Layout der Tabellen sowie die anzuzeigenden Daten sollen dann automatisch ermittelt werden &#8211; samt den enthaltenen Feldnamen oder -bezeichnungen als Spaltenk&ouml;pfen.<\/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":[662019,66032019,44000026],"tags":[],"class_list":["post-55001189","post","type-post","status-publish","format-standard","hentry","category-662019","category-66032019","category-Interaktiv"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Flexible HTML-Tabellen mit fester Kopfzeile - 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\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Flexible HTML-Tabellen mit fester Kopfzeile\" \/>\n<meta property=\"og:description\" content=\"Im Beitrag &quot;HTML-Tabellen mit fester Kopfzeile&quot; haben wir gezeigt, wie Sie Daten aus einer bestimmten Abfrage in einem Webbrowser-Steuerelement so anzeigen, dass die Spaltenk&ouml;pfe oben fixiert bleiben, w&auml;hrend der Benutzer den Inhalt der Tabelle, also die eigentlichen Datens&auml;tze, nach unten scrollt. Wir wollen das Beispiel aus diesem Beitrag nun so erweitern, dass Sie die scrollbare HTML-Tabelle f&uuml;r beliebige Tabellen oder Abfragen als Datenquelle nutzen k&ouml;nnen. Diese sollen per Parameter beim &Ouml;ffnen des Formulars festgelegt werden. Das Layout der Tabellen sowie die anzuzeigenden Daten sollen dann automatisch ermittelt werden - samt den enthaltenen Feldnamen oder -bezeichnungen als Spaltenk&ouml;pfen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-13T20:54:41+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/ab940634dd7d42c4ab452b35e8aee9a9\" \/>\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=\"20\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Flexible HTML-Tabellen mit fester Kopfzeile\",\"datePublished\":\"2020-05-13T20:54:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\\\/\"},\"wordCount\":3034,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/ab940634dd7d42c4ab452b35e8aee9a9\",\"articleSection\":[\"2019\",\"3\\\/2019\",\"Interaktiv\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\\\/\",\"name\":\"Flexible HTML-Tabellen mit fester Kopfzeile - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/ab940634dd7d42c4ab452b35e8aee9a9\",\"datePublished\":\"2020-05-13T20:54:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/ab940634dd7d42c4ab452b35e8aee9a9\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/ab940634dd7d42c4ab452b35e8aee9a9\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Flexible HTML-Tabellen mit fester Kopfzeile\"}]},{\"@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":"Flexible HTML-Tabellen mit fester Kopfzeile - 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\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\/","og_locale":"de_DE","og_type":"article","og_title":"Flexible HTML-Tabellen mit fester Kopfzeile","og_description":"Im Beitrag \"HTML-Tabellen mit fester Kopfzeile\" haben wir gezeigt, wie Sie Daten aus einer bestimmten Abfrage in einem Webbrowser-Steuerelement so anzeigen, dass die Spaltenk&ouml;pfe oben fixiert bleiben, w&auml;hrend der Benutzer den Inhalt der Tabelle, also die eigentlichen Datens&auml;tze, nach unten scrollt. Wir wollen das Beispiel aus diesem Beitrag nun so erweitern, dass Sie die scrollbare HTML-Tabelle f&uuml;r beliebige Tabellen oder Abfragen als Datenquelle nutzen k&ouml;nnen. Diese sollen per Parameter beim &Ouml;ffnen des Formulars festgelegt werden. Das Layout der Tabellen sowie die anzuzeigenden Daten sollen dann automatisch ermittelt werden - samt den enthaltenen Feldnamen oder -bezeichnungen als Spaltenk&ouml;pfen.","og_url":"https:\/\/access-im-unternehmen.de\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-13T20:54:41+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/ab940634dd7d42c4ab452b35e8aee9a9","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"20\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Flexible HTML-Tabellen mit fester Kopfzeile","datePublished":"2020-05-13T20:54:41+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\/"},"wordCount":3034,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/ab940634dd7d42c4ab452b35e8aee9a9","articleSection":["2019","3\/2019","Interaktiv"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\/","url":"https:\/\/access-im-unternehmen.de\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\/","name":"Flexible HTML-Tabellen mit fester Kopfzeile - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/ab940634dd7d42c4ab452b35e8aee9a9","datePublished":"2020-05-13T20:54:41+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/ab940634dd7d42c4ab452b35e8aee9a9","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/ab940634dd7d42c4ab452b35e8aee9a9"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Flexible_HTMLTabellen_mit_fester_Kopfzeile\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Flexible HTML-Tabellen mit fester Kopfzeile"}]},{"@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\/55001189","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=55001189"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001189\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001189"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001189"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001189"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}