{"id":55000751,"date":"2010-12-01T00:00:00","date_gmt":"2020-05-22T22:08:38","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=751"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Berichte_ohne_Datenherkunft","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Berichte_ohne_Datenherkunft\/","title":{"rendered":"Berichte ohne Datenherkunft"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/c809897c5f47438d83095b583e865fcc\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Haben Sie schon einmal einen Access-Bericht missbraucht Um beispielsweise ein Kalenderblatt zu erstellen oder ein Sudoku zu drucken Dann haben Sie sicher auf eine entsprechende Datenherkunft zur&uuml;ckgegriffen, denn ohne diese lassen Berichte sich nur bedingt mit Informationen f&uuml;llen. Dieser Beitrag zeigt, wie Sie auch ohne Daten eine Menge mit Berichten anstellen. Dabei sollen zun&auml;chst der Inhalt einer Textdatei und sp&auml;ter der eines Moduls in Berichtsform abgebildet werden &#8211; Letzteres mit entsprechender F&auml;rbung von Kommentarzeilen und Schl&uuml;sselw&ouml;rtern!<\/b><\/p>\n<p>Normalerweise l&auml;uft die Berichtserstellung etwa so ab: Sie &uuml;berlegen sich den Aufbau des Berichts, stellen dann die ben&ouml;tigten Tabellen in einer Abfrage zusammen (oder auch in mehreren, wenn Unterberichte zum Einsatz kommen) und positionieren dann die an die Datenherkunft gebundenen Steuerelemente im Bericht.<\/p>\n<p>Was aber, wenn die auszugebenden Daten gar nicht in Tabellenform vorliegen Vielleicht m&ouml;chten Sie ja einfach mal eine Textdatei in Berichtsform abbilden oder auch ein Codemodul (wobei dies den Charme h&auml;tte, dass man bestimmte Code-Elemente farbig darstellen k&ouml;nnte &#8211; der VBA-Editor bietet diese M&ouml;glichkeit nicht).<\/p>\n<p>Zun&auml;chst k&uuml;mmern wir uns um die Anzeige einer einfachen Textdatei in einem Bericht. In diesem Fall haben wir einfach den Inhalt einer Prozedur in eine Textdatei geschrieben. Diese soll nun wie in Bild 1 in einem Bericht dargestellt werden.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/BerichteOhneDatenherkunft-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Dieser Bericht druckt den Inhalt einer Textdatei.<\/span><\/b><\/p>\n<p>Zur einfachen Auswahl der Textdatei finden Sie in der Beispielanwendung ein kleines Formular mit einem Textfeld zur Anzeige des Dateinamens und einer Schaltfl&auml;che zum &Ouml;ffnen eines Dateiauswahl-Dialogs (s. Bild 2). Die Schaltfl&auml;che mit der Beschriftung <b>Datei in Bericht anzeigen <\/b>erledigt nichts weiter als das &Ouml;ffnen des Berichts <b>rptTextdatei <\/b>in der Vorschauansicht. Dabei &uuml;bergibt die durch die Schaltfl&auml;che ausgel&ouml;ste Prozedur den Namen der anzuzeigenden Textdatei als &Ouml;ffnungsparameter an den Bericht (da dies erst ab Access 2002 m&ouml;glich ist, pr&uuml;ft der Bericht beim &Ouml;ffnen, ob <b>OpenArgs<\/b> einen Wert enth&auml;lt, und fragt gegebenenfalls direkt den Inhalt des Textfelds mit dem Dateinamen ab).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/BerichteOhneDatenherkunft-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Die Auswahl der auszugebenden Textdatei erfolgt komfortabel per Formular.<\/span><\/b><\/p>\n<p><b>Bericht aus Datei f&uuml;llen<\/b><\/p>\n<p>Damit bewegen wir uns nun aus der Komfortzone der bekannten Techniken heraus und betrachten die Vorgehensweise, einen Bericht zeilenweise mit dem Inhalt einer Textdatei zu f&uuml;llen.<\/p>\n<p>Die Daten sollen in einem Bericht namens <b>rptTextdatei<\/b> erscheinen. Diesen legen Sie neu an und stellen die Gr&ouml;&szlig;e seiner Bereiche etwa wie in Bild 3 ein.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/BerichteOhneDatenherkunft-web-images\/pic009.png\" alt=\"pic009.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Entwurf des Berichts zur Ausgabe von Textdateien<\/span><\/b><\/p>\n<p>Danach ben&ouml;tigen Sie zwei Variablen, die Sie gleich oben im Klassenmodul des Berichts unterbringen. Das Klassenmodul f&uuml;gen Sie am einfachsten zum Bericht hinzu, indem Sie die Berichtseigenschaft <b>Enth&auml;lt Modul <\/b>auf <b>Ja <\/b>einstellen. Die Variablen speichern den Namen der Textdatei sowie die aktuell bearbeitete Zeile der Textdatei:<\/p>\n<pre>Dim strTextdatei As String\r\nDim strTextzeile As String<\/pre>\n<p>Im Prinzip durchlaufen wir dann die Textdatei auf die gewohnte Weise, also etwa mit folgenden Anweisungen:<\/p>\n<pre>Open strTextdatei For Input As #1\r\nDo While Not EOF(1)\r\n    Line Input #1, strTextzeile\r\n    ''was mit dem Text machen\r\nLoop\r\nClose #1<\/pre>\n<p>Allein die Aufteilung und die Realisierung der Schleife sieht anders aus. Beginnen wir mit dem &Ouml;ffnen des Berichts und somit auch der Textdatei. Beim &Ouml;ffnen des Berichts soll das Ereignis <b>Beim &Ouml;ffnen <\/b>ausgel&ouml;st werden, weshalb Sie dem gleichnamigen Ereignis den Wert <b>[Ereignisprozedur] <\/b>zuweisen und nach einem Klick auf die Schaltfl&auml;che rechts von der Eigenschaft den automatisch angelegten Prozedurrumpf wie folgt erg&auml;nzen:<\/p>\n<pre>Private Sub Report_Open(Cancel As Integer)\r\n    If Not IsNull(Me.OpenArgs) Then\r\n        strTextdatei = Me.OpenArgs\r\n    Else\r\n        If IstFormularGeoeffnet(&quot;frmDateiDrucken&quot;) Then\r\n            strTextdatei = Forms!frmDateidrucken!txtDatei\r\n        Else\r\n            MsgBox &quot;Keine Datei!&quot;\r\n            Cancel = True\r\n        End If\r\n    End If\r\n    Open strTextdatei For Input As #1\r\nEnd Sub<\/pre>\n<p>Diese Prozedur pr&uuml;ft, ob das &Ouml;ffnungsargument einen Dateinamen enth&auml;lt. Falls nein, wird dieser direkt aus dem Textfeld <b>txtDatei<\/b> des aufrufenden Formulars ermittelt. Ist dieses gar nicht ge&ouml;ffnet, bricht die Anzeige des Berichts an dieser Stelle mit einer kurzen Meldung ab. Ist jedoch eine Textdatei angegeben, wird ihr Name in die Variable <b>strTextdatei <\/b>eingetragen. Die letzte Zeile &ouml;ffnet die Datei schlie&szlig;lich f&uuml;r den lesenden Zugriff. Nun pr&uuml;ft der Bericht, ob er irgendwelche Daten in den Detailbereich schreiben soll. Auch wenn die Datenherkunft des Berichts wie in diesem Fall leer ist, l&ouml;st er dabei trotzdem zumindest einmalig die beiden Ereignisse <b>Beim Formatieren <\/b>und <b>Beim Drucken <\/b>des Detailbereichs aus. Wenn Sie keine au&szlig;ergew&ouml;hnlichen Anweisungen in den entsprechenden Ereignisprozeduren hinterlegen, geschieht nichts und der Bericht wird ohne Daten im Detailbereich angezeigt.<\/p>\n<p>Das gilt es zu verhindern: Wir wollen daf&uuml;r sorgen, dass der Bericht im Detailbereich die Zeilen unserer Textdatei anzeigt. Dazu gibt es nun zwei M&ouml;glichkeiten:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Wir zeigen alle Zeilen in einem entsprechend gro&szlig;en Detailbereich an.<\/li>\n<li class=\"aufz-hlung\">Der Detailbereich soll mehrmals gef&uuml;llt werden, und zwar mit jeweils einer Zeile der Textdatei.<\/li>\n<\/ul>\n<p>Die erste Variante w&auml;re einfach, denn dies k&ouml;nnen wir durch einen schlichten Aufruf der <b>Print<\/b>-Methode des Berichts erledigen. Wir m&uuml;ssen einfach nur den Detailbereich so gro&szlig; wie m&ouml;glich machen, damit dieser (mit ein wenig Gl&uuml;ck) die komplette Textdatei fasst.<\/p>\n<p>Aber was geschieht, wenn die Datei nicht auf eine Berichtsseite passt Der Rest wird schlicht abgeschnitten. Dem k&ouml;nnen wir nur entgegenwirken, indem wir berechnen, wie viele Zeilen in einen Detailbereich passen, und den Inhalt der Textdatei darauf aufteilen. Das scheint kompliziert zu sein, also schauen wir uns zun&auml;chst die zweite Variante an.<\/p>\n<p>Wenn wir jede Zeile in einen Detailbereich schreiben, gibt es kaum Probleme &#8211; zumindest, wenn sich der Bericht beim Hinzuf&uuml;gen von Inhalten mit der <b>Print<\/b>-Methode genau so verh&auml;lt wie sonst: Er sollte einen Detailbereich, der nicht mehr auf die aktuelle Seite passt, einfach auf die folgende Seite verschieben.<\/p>\n<p>Bleibt das Problem, dass wir nicht wissen, wie wir den Bericht dazu bewegen, auch ohne Datenquelle mehr als einen Detailbereich anzuzeigen.<\/p>\n<p>Hier kommen zwei Eigenschaften des Berichts zum Tragen. Diese k&ouml;nnen Sie jeweils im <b>Beim Formatieren<\/b>-Ereignis der einzelnen Berichtsereignisse unterbringen:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>MoveLayout<\/b>: Diese Eigenschaft legt fest, ob der Bericht zum n&auml;chsten zu druckenden Bereich wechselt. Das bedeutet in der Regel, dass er nach der Ausgabe eines Bereichs eine Zeile weiter unten am linken Rand mit dem folgenden Bereich fortf&auml;hrt.<\/li>\n<li class=\"aufz-hlung\"><b>NextRecord<\/b>: Diese Eigenschaft legt fest, ob der n&auml;chste Datensatz der Datenherkunft zum F&uuml;llen des aktuellen Bereichs herangezogen werden soll &#8211; abh&auml;ngig davon, ob es &uuml;berhaupt noch einen weiteren Datensatz gibt.<\/li>\n<\/ul>\n<p>Diese beiden Eigenschaften machen wir uns zunutze: Mit <b>Me.MoveLayout = True <\/b>sorgen wir daf&uuml;r, dass die folgende Zeile der Textdatei links unter der aktuellen Zeile ausgegeben wird. Dazu muss es aber erst einmal kommen: Der Bericht druckt n&auml;mlich den Detailbereich nur einmal, wenn die Datenherkunft keine weiteren Daten enth&auml;lt. Und in unserem Fall enth&auml;lt diese ja gar keine Daten &#8211; nach dem ersten Durchlauf w&auml;re also eigentlich Schluss.<\/p>\n<p>Dieser hier unerw&uuml;nschten Arbeitsverweigerung des Berichts k&ouml;nnen wir durch Setzen der Eigenschaft <b>Me.NextRecord <\/b>auf <b>False <\/b>vorbeugen: Dann versucht der Bericht n&auml;mlich nicht, zum nicht vorhandenen zweiten Datensatz zu springen, sondern druckt den aktuellen Bereich nochmals.<\/p>\n<p>Im Detail profitieren wir davon in den beiden Ereignisprozeduren <b>Beim Formatieren <\/b>und <b>Beim Drucken<\/b>. In <b>Beim Formatieren <\/b>lesen wir jeweils eine Zeile der Textdatei ein. Dort stellen wir auch die H&ouml;he des Bereichs auf einen passenden Wert ein. Schlie&szlig;lich erh&auml;lt die Eigenschaft <b>MoveLayout <\/b>den Wert <b>True<\/b>, wenn noch die letzte Zeile eingelesen wurde, und <b>False<\/b>, wenn dies die letzte Zeile war. Sprich: Enth&auml;lt die Textdatei noch ungedruckte Zeilen, mache noch einen Detailbereich auf und fahre fort.<\/p>\n<p>Die Eigenschaft <b>NextRecord <\/b>best&uuml;cken wir mit dem umgekehrten Wert der Eigenschaft <b>MoveLayout<\/b>: Wenn noch Zeilen vorliegen, soll der Bericht nicht zum n&auml;chsten Datensatz springen. Dort w&uuml;rde er ja bemerken, dass eigentlich gar keine Daten vorliegen, und die Ausgabe gegebenenfalls mit dem &uuml;brigen Bereich wie etwa dem Seitenfu&szlig; beenden:<\/p>\n<pre>Private Sub Detailbereich_Format(Cancel As _\r\n    Integer, FormatCount As Integer)\r\n    Line Input #1, strTextzeile\r\n    Me.Detailbereich.Height = 200\r\n    Me.MoveLayout = Not EOF(1)\r\n    Me.NextRecord = Not Me.MoveLayout\r\nEnd Sub<\/pre>\n<p>Im Ereignis <b>Beim Drucken <\/b>erfolgt schlie&szlig;lich die eigentliche Ausgabe der aktuellen Zeile der Textdatei. Vorher stellen wir jedoch noch einige Texteigenschaften ein und geben dann mit der <b>Print<\/b>-Methode des Berichts den Inhalt der Textzeile in den Bericht aus:<\/p>\n<pre>Private Sub Detailbereich_Print(Cancel As Integer, PrintCount As Integer)\r\n    Me.FontSize = 8\r\n    Me.FontBold = False\r\n    Me.FontName = &quot;Courier New&quot;\r\n    Me.Print strTextzeile\r\nEnd Sub<\/pre>\n<p>Diese beiden Prozeduren werden entsprechend der Zeilenzahl der Textdatei wiederholt. Probieren Sie dies sp&auml;ter ruhig auch mit einer Textdatei aus, die mehr als eine Berichtsseite lang ist &#8211; der Bericht wird die Zeilen, die nicht auf die erste Seite passen, auf den folgenden Seiten ausgeben. Schlie&szlig;lich soll der Bericht im Seitenkopfbereich den Namen der Datei anzeigen. Das ist leicht: Die Ereignisprozedur <b>Seitenkopfbereich_Print <\/b>braucht dazu nur die Schrifteigenschaften nach Wunsch einzustellen und den Dateinamen mit der <b>Print<\/b>-Methode auszugeben:<\/p>\n<pre>Private Sub Seitenkopfbereich_Print(Cancel As Integer, PrintCount As Integer)\r\n    Me.FontSize = 10\r\n    Me.FontBold = True\r\n    Me.Print strTextdatei\r\nEnd Sub<\/pre>\n<p>Schlie&szlig;lich soll beim Schlie&szlig;en des Berichts noch die Textdatei geschlossen werden:<\/p>\n<pre>Private Sub Report_Close()\r\n    Close #1\r\nEnd Sub<\/pre>\n<p><b>Offene Baustellen<\/b><\/p>\n<p>Das hat doch schon was, oder Textdateien einfach mal so in einem Access-Bericht anzeigen Immerhin lassen sich diese nach Gusto mit zus&auml;tzlichen Informationen ausstatten, zum Beispiel mit einer Zeilenzahl, mit Seitenzahlen et cetera. Alles Dinge, die der geneigte Access-Entwickler schneller programmiert, als er die entsprechenden Konfigurationsm&ouml;glichkeiten im Texteditor seiner Wahl gefunden hat.<\/p>\n<p>Leider hat die L&ouml;sung noch eine kleine Schwachstelle: Wenn n&auml;mlich eine Zeile l&auml;nger als die Berichtsbreite ist, wird sie einfach abgeschnitten. Die L&auml;nge der Zeile k&ouml;nnen wir in Abh&auml;ngigkeit von Schriftgr&ouml;&szlig;e et cetera mit der Funktion <b>TextWidth <\/b>des Berichts ermitteln. Aber wie genau nutzen wir das Wissen um die Breite der Textzeile Wir k&ouml;nnten ungef&auml;hr festlegen, auf wie viele Zeilen wir den Text aufteilen m&uuml;ssen, damit er nicht abgeschnitten wird.<\/p>\n<p>Aber wie schneiden wir die Textzeilen auseinander Am einfachsten wird es wohl sein, zun&auml;chst nur &uuml;berlange Textzeilen mit einer kleinen Spezialbehandlung zu versehen. Dabei m&uuml;ssen wir zun&auml;chst pr&uuml;fen, wann eine Zeile nicht mehr in die Spaltenbreite des Berichts passt. In diesem Falle muss der Text umbrochen, die H&ouml;he des Detailbereichs angepasst und erst dann der Text in den Bericht gedruckt werden.<\/p>\n<p><b>Textzeilen umbrechen<\/b><\/p>\n<p>Die Version des Berichts mit der Funktion zum Umbrechen &uuml;berlanger Textzeilen finden Sie in der Beispieldatenbank unter dem Namen <b>rptTextdateiMitZeilenumbruch<\/b>.<\/p>\n<p>Den Hauptteil der &auml;nderungen finden Sie in der Ereignisprozedur <b>Beim Formatieren <\/b>(s. <span class=\"querverweisohneumbruch\"><a href=\"#anker-25-anchor\">Listing 1<\/a><\/span>). Hier werden wie gehabt zun&auml;chst der Inhalt der aktuellen Textzeile ermittelt und die Schrifteigenschaften festgelegt. Dann kommt frischer Code: Die <b>TextWidth<\/b>-Funktion des Berichtsobjekts ermittelt die Breite des aktuell in der Variablen <b>strTextzeile <\/b>enthaltenen Textes. Ist diese breiter als die Berichtsspalte, unterzieht die Prozedur den Text einer Sonderbehandlung in der Funktion <b>NarrowText<\/b>. Diese haben wir bereits im Beitrag <b>Zeichenketten zerlegen <\/b>(<b>www.access-im-unternehmen.de\/560<\/b>) vorgestellt. Die Funktion erwartet einen Text und die maximale Zeichenanzahl pro Zeile. Die Prozedur liefert einen an den Leerzeichen umbrochenen Text zur&uuml;ck. Der Aufruf<\/p>\n<p class=\"listingueberschrift\">Listing 1: Formatieren des Detailbereichs und optimieren des Textes im Hinblick auf die Spaltenbreite<\/p>\n<pre>Private Sub Detailbereich_Format(Cancel As Integer, FormatCount As Integer)\r\n    Dim intFontWeight As Integer\r\n    Dim intZeilen As Integer\r\n    Dim lngX As Long\r\n    Dim lngY As Long\r\n    Line Input #1, strTextzeile\r\n    Me.FontSize = 8\r\n    Me.FontBold = False\r\n    Me.FontName = &quot;Courier New&quot;\r\n    If Me.TextWidth(strTextzeile) &gt; Me.Width Then\r\n        strTextzeile = NarrowText(strTextzeile, 80, intZeilen)\r\n    End If\r\n    Me.Detailbereich.Height = Me.TextHeight(strTextzeile)\r\n    Me.MoveLayout = Not EOF(1)\r\n    Me.NextRecord = Not Me.MoveLayout\r\nEnd Sub\r\nDebug.Print NarrowText(&quot;bla bla bla bla bla&quot;, 12)<\/pre>\n<p><!--30percent--><\/p>\n<p>wird bei Angabe einer maximalen Zeichenanzahl von <b>12<\/b> etwa folgenden Text liefern:<\/p>\n<pre>bla bla bla\r\nbla bla<\/pre>\n<p>Nach dem Umbrechen des Textes mit einer Breite von maximal 80 Zeichen ermittelt die Funktion <b>TextHeight <\/b>die H&ouml;he des Textes, die gleich im Anschluss der Eigenschaft <b>Height <\/b>des Detailbereichs zugewiesen wird. Nun folgen die &uuml;brigen Schritte, also das Pr&uuml;fen auf die letzte Zeile der Textdatei sowie das Drucken der aktuellen Zeile in den Bericht.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Begrenzte Print-Kapazit&auml;t<\/p>\n<p>Wenn Sie ein wenig mit dem Bericht experimentieren und dabei zuf&auml;llig eine recht lange Zeile abdrucken m&ouml;chten, sto&szlig;en Sie auf einen Fehler: Die <b>Print<\/b>-Anweisung kann nur eine begrenzte Anzahl Zeichen im Bericht ausgeben. Dummerweise ist diese nicht fix vorgegeben, sondern h&auml;ngt anscheinend von weiteren Faktoren wie der Schriftgr&ouml;&szlig;e ab. Wir fangen dies ab, indem wir die <b>Beim Drucken<\/b>-Ereignisprozedur des Berichts wie in <span class=\"querverweisohneumbruch\"><a href=\"#anker-30-anchor\">Listing 2<\/a><\/span> erweitern.<\/p>\n<p class=\"listingueberschrift\">Listing 2: Wenn der Text zu lang f&uuml;r die Print-Methode ist, zeigt diese Prozedur eine Fehlermeldung an.<\/p>\n<pre>Private Sub Detailbereich_Print(Cancel As Integer, PrintCount As Integer)\r\n    On Error Resume Next\r\n    Me.Print strTextzeile\r\n    If Not Err.Number = 0 Then\r\n        MsgBox &quot;Die folgende Zeile kann nicht gedruckt werden, da sie zu lang ist:&quot; _\r\n            &amp; vbCrLf &amp; vbCrLf &amp; &quot;''&quot; &amp; strTextzeile &amp; &quot;''&quot;\r\n    End If\r\nEnd Sub<\/pre>\n<p>Die dort im Fehlerfall ausgel&ouml;ste <b>MsgBox<\/b>-Anweisung liefert eine Meldung wie in Bild 4.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/BerichteOhneDatenherkunft-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Hinweismeldung beim Versuch, einen &uuml;berlangen Text abzudrucken<\/span><\/b><\/p>\n<p>Sollten Sie Dokumente mit &uuml;berlangen Zeilen wie in diesem Beitrag per Bericht ausgeben wollen, k&ouml;nnen Sie diese Zeilen theoretisch auf mehrere Detailbereiche aufteilen. Aus Platzgr&uuml;nden gehen wir auf die dazu notwendigen Anpassungen an dieser Stelle nicht ein.<\/p>\n<p><b>Wechsel von der Vorschau zur Druckansicht<\/b><\/p>\n<p>In der jetzigen Form k&ouml;nnen Sie den Bericht nicht von der Vorschauansicht aus drucken. Der Bericht wird zum Drucken erneut gerendert, was ein erneutes Ausl&ouml;sen der Ereignisprozeduren zur Folge hat. Der Ablauf beim &Ouml;ffnen, Einlesen und Schlie&szlig;en der Datei m&uuml;sste speziell an das aufeinanderfolgende Rendern der Vorschau- und der Druckvariante angepasst werden.<\/p>\n<p><b>Code-Dokumentation per Bericht<\/b><\/p>\n<p>Nat&uuml;rlich k&ouml;nnen Sie nicht nur Texte aus Dokumenten, sondern beliebige Texte in Berichten ausgeben &#8211; Hauptsache, diese liegen in Zeilenform vor. Als N&auml;chstes nehmen wir uns die Module beziehungsweise den Code einer Anwendung vor. Wir wollen zun&auml;chst grunds&auml;tzlich die Module und den enthaltenen Code strukturiert ausgeben und dann Elemente wie Schl&uuml;sselw&ouml;rter oder Kommentare einf&auml;rben.<\/p>\n<p>Die L&ouml;sung soll eines oder alle Module ausgeben. Um einzelne Module f&uuml;r die Ausgabe auszuw&auml;hlen, sollen diese in einem Formular per Kombinationsfeld ausw&auml;hlbar sein. F&uuml;r den Zugriff auf die Module und sp&auml;ter auf deren Inhalte ben&ouml;tigen Sie einen Verweis auf die Bibliothek <b>Microsoft Visual Basic for Applications Extensibility 5.3<\/b> (s. Bild 5).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/BerichteOhneDatenherkunft-web-images\/pic004.png\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Verweis auf die Bibliothek f&uuml;r den Zugriff auf das VBA-Projekt und die enthaltenen Module<\/span><\/b><\/p>\n<p>Schauen wir uns den ersten Anlauf f&uuml;r das Modul des Berichts selbst an. Praktischerweise zeigt der Screenshot mit dem Ergebnis aus Bild 6 gleich den Code, der diesen hervorgerufen hat.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/BerichteOhneDatenherkunft-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Ausgabe eines kompletten Code-Moduls per Bericht<\/span><\/b><\/p>\n<p>Es gibt kaum Unterschiede zu der Variante des Berichts, der den Inhalt einer Textdatei anzeigte. Hier ben&ouml;tigen wir je eine Objektvariable f&uuml;r die aktive VB-Komponente und das enthaltene <b>CodeModule<\/b>-Objekt sowie eine Z&auml;hlervariable namens <b>intLine<\/b>, welche die aktuell bearbeitete Zeilennummer speichert. Diese wird im <b>Beim Formatieren<\/b>-Ereignis des Detailbereichs jeweils um eins erh&ouml;ht. Die folgenden Zeilen brechen wieder zu lange Textzeilen um und passen die H&ouml;he des Detailbereichs an. Schlie&szlig;lich erhalten die Eigenschaften <b>MoveLayout <\/b>und <b>NextRecordset <\/b>des Berichtsobjekts wieder die Werte, die dazu f&uuml;hren, dass solange Detailbereiche mit Codezeilen gef&uuml;llt werden, bis das Ende des Moduls erreicht wurde. F&uuml;r die Ausgabe ist wiederum die <b>Print<\/b>-Methode in der Ereignisprozedur <b>Beim Drucken <\/b>verantwortlich.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Ausbauf&auml;hig<\/p>\n<p>Mit dieser Basisversion k&ouml;nnen wir uns an den Ausbau machen. Aktuell zeigt der Bericht nur den Inhalt des Moduls an. Damit wir uns mit jemandem &uuml;ber den Code unterhalten k&ouml;nnen, w&auml;ren Zeilennummern hilfreich. F&uuml;r den Beginn geben wir uns mit durchlaufenden Zeilennummern zufrieden, die Vielfache von Zehn sind und im Format <b>0000<\/b> angezeigt werden &#8211; also etwa so wie in Bild 7<\/a><\/span>. Dazu erweitern Sie die Prozedur <b>Detailbereich_Print<\/b> der vorherigen Version um einige Zeilen (s. <span class=\"querverweisohneumbruch\"><a href=\"#anker-37-anchor\">Listing 3).<\/p>\n<p class=\"listingueberschrift\">Listing 3: Erweiterung des Beim Drucken-Ereignisses zur Ausgabe von Zeilennummern<\/p>\n<pre>Private Sub Detailbereich_Print(Cancel As Integer, PrintCount As Integer)\r\n    If bolZeilennummern Then\r\n        Me.Print Format(intLine * 10, &quot;0000&quot;)\r\n        Me.CurrentX = 600\r\n    Else\r\n        Me.CurrentX = 0\r\n    End If\r\n    Me.CurrentY = 0\r\n    Me.Print strTextzeile\r\nEnd Sub<\/pre>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/BerichteOhneDatenherkunft-web-images\/pic006.png\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Modulcode mit Zeilennummern<\/span><\/b><\/p>\n<p>Hier kommen erstmals die beiden Eigenschaften <b>CurrentX <\/b>und <b>CurrentY <\/b>ins Spiel. Diese legen fest, in welcher Position die n&auml;chste Ausgabe etwa mit der <b>Print<\/b>-Methode landet. Die Prozedur pr&uuml;ft den Wert der Variablen <b>bolZeilennummern<\/b>, der an geeigneter Stelle eingestellt werden muss (in diesem Fall schlicht im Ereignis <b>Beim &Ouml;ffnen <\/b>des Formulars).<\/p>\n<p>Hat dieser den Wert <b>True<\/b>, sorgt eine erste <b>Print<\/b>-Anweisung f&uuml;r die Ausgabe der Zeilenzahl, die auf dem Wert der Z&auml;hlervariablen <b>intLine <\/b>basiert. Die <b>CurrentX<\/b>-Eigenschaft verschiebt die X-Position f&uuml;r den folgenden Aufruf von <b>Print <\/b>entsprechend nach rechts. Weil nach dem ersten <b>Print<\/b>-Befehl der in <b>CurrentY <\/b>gespeicherte Wert entsprechend der Zeilenh&ouml;he des ausgegebenen Textes eingestellt wird, w&uuml;rde der eigentliche, mit der folgenden <b>Print<\/b>-Anweisung ausgegebene Text um eine Zeile nach unten verschoben. Damit dies nicht geschieht, stellen wir <b>CurrentY <\/b>wieder auf <b>0<\/b>. Erst danach wird der eigentliche Code der Zeile ausgegeben.<\/p>\n<p><b>Zeilenschlucker<\/b><\/p>\n<p>Dummerweise geht bei mehrseitigen Listings zwischen zwei Seiten immer genau eine Zeile verloren. Dies verhindern wir, indem wir das Ereignis <b>Seitenkopf_Print <\/b>um die folgenden drei Zeilen erweitern und somit den Zeilenz&auml;hler korrigieren:<\/p>\n<pre>If intLine &gt; 0 Then\r\n    intLine = intLine - 1\r\nEnd If<\/pre>\n<p><b>Umbrochene Zeilen optimieren<\/b><\/p>\n<p>Der Zeilenumbruch mit der Funktion <b>NarrowText<\/b> liefert nicht ganz das gew&uuml;nschte Ergebnis. Wenn eine damit bearbeitete Zeile n&auml;mlich f&uuml;hrende Leerzeichen enth&auml;lt, werden diese entfernt.<\/p>\n<p>Dadurch wird die Einr&uuml;ckung der Zeile zunichte gemacht. &Uuml;berdies werden die folgenden, neu umbrochenen Zeilen garantiert nicht einger&uuml;ckt dargestellt.<\/p>\n<p>Um die Einr&uuml;ckung wiederherzustellen, nehmen wir eine &auml;nderung an der Prozedur <b>Beim Formatieren <\/b>des Detailbereichs vor. Die erste Zeile ermittelt dabei den vorhandenen Einschub, indem sie die L&auml;nge der um die f&uuml;hrenden Leerzeichen erleichterte Textzeile von der L&auml;nge der unber&uuml;hrten Textzeile subtrahiert:<\/p>\n<pre>intEinschub = Len(strTextzeile) - Len(LTrim(strTextzeile))<\/pre>\n<p>Die durch die <b>NarrowText<\/b>-Funktion bearbeitete Zeichenkette in <b>strTextzeile <\/b>besitzt nun mindestens zwei Zeilen, von denen keine einen Einzug aufweist. Wir f&uuml;gen also zuerst den entsprechenden Einzug zur ersten Zeile hinzu, indem wir der Zeichenkette mit der <b>Space<\/b>-Funktion die ben&ouml;tigte Anzahl Leerzeichen voranstellen.<\/p>\n<p>Bei den folgenden Zeilen erledigen wir das auf einen Rutsch: Wir ersetzen einfach die Konstante f&uuml;r den Zeilenumbruch <b>vbCrLf <\/b>durch die gleiche Konstante plus der notwendigen Menge Leerzeichen, wieder bereitgestellt durch die <b>Space<\/b>-Funktion:<\/p>\n<pre>If Me.TextWidth(strTextzeile) &gt; Me.Width Then\r\n    strTextzeile = NarrowText(strTextzeile, 80)\r\n    strTextzeile = Space(intEinschub) &amp; strTextzeile\r\n    strTextzeile = Replace(strTextzeile, vbCrLf, vbCrLf &amp; Space(intEinschub))\r\nEnd If<\/pre>\n<p><b>Kommentarzeilen gr&uuml;n f&auml;rben<\/b><\/p>\n<p>Damit sich Kommentarzeilen farblich von den &uuml;brigen Zeilen abheben, f&auml;rben wir diese gr&uuml;n ein. Dies soll wie in Bild 8 aussehen (in der gedruckten Fassung m&ouml;glicherweise nicht erkennbar &#8211; schauen Sie sich in diesem Fall den Bericht <b>rptEinModul_Zeilennummern_Kommentarzeilen <\/b>der Beispieldatenbank an).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/BerichteOhneDatenherkunft-web-images\/pic007.png\" alt=\"pic007.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 8: Bericht mit gr&uuml;nen Kommentarzeilen<\/span><\/b><\/p>\n<p>Die Vorgehensweise ist ebenfalls recht einfach: Wir pr&uuml;fen, ob das erste Zeichen hinter eventuellen f&uuml;hrenden Leerzeichen ein Hochkomma ist, und stellen in diesem Fall die Farbe mit der <b>ForeColor<\/b>-Eigenschaft auf einen Wert ein, welcher der Farbe Gr&uuml;n entspricht. Ist dies nicht der Fall, muss die Farbe nat&uuml;rlich wieder auf Schwarz umgestellt werden.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Kommentare hinter Befehlen gr&uuml;n f&auml;rben<\/p>\n<p>Etwas schwieriger wird es bei Kommentaren, die sich rechts neben einem Befehl befinden. Das Ermitteln des Hochkommas, das den Kommentar hinter der Anweisung einleitet, ist recht kompliziert: Es kann n&auml;mlich vorkommen, dass bereits in einer Anweisung ein Hochkomma verwendet wird &#8211; beispielsweise innerhalb eines durch Anf&uuml;hrungszeichen eingefassten Ausdrucks.<\/p>\n<p>In diesem Fall m&uuml;ssen wir zun&auml;chst ermitteln, an welcher Position sich das Kommentar-Hochkomma befindet, und dann den ersten Teil der Zeile ab dem Kommentar gr&uuml;n einf&auml;rben (s. Bild 9).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/BerichteOhneDatenherkunft-web-images\/pic008.png\" alt=\"pic008.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 9: Auch Kommentare hinter Anweisungen werden eingef&auml;rbt.<\/span><\/b><\/p>\n<p>Als Erstes schauen wir uns eine Funktion an, welche die Position des Kommentarzeichens ermittelt &#8211; wenn denn eines vorliegt. Die Funktion hei&szlig;t <b>KommentarHinterBefehl <\/b>und befindet sich im Modul <b>mdlGlobal <\/b>der Beispieldatenbank (s. <span class=\"querverweisohneumbruch\"><a href=\"#anker-39-anchor\">Listing 4<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 4: Behandlung von Kommentaren hinter Anweisungen<\/p>\n<pre>Public Function KommentarHinterBefehl(strTextzeile As String, intPositionHochkomma As Integer) As Boolean\r\n    Dim intPos As Integer\r\n    Dim strTextzeileBisHochkomma As String\r\n    intPos = InStr(1, strTextzeile, &quot;''&quot;)\r\n    Do While Not intPos = 0\r\n        strTextzeileBisHochkomma = Left(strTextzeile, intPos)\r\n        If (Len(strTextzeileBisHochkomma) - Len(Replace(strTextzeileBisHochkomma, &quot;&quot;&quot;&quot;, &quot;&quot;))) _\r\n            Mod 2 = 0 Then\r\n            intPositionHochkomma = intPos\r\n            KommentarHinterBefehl = True\r\n            Exit Function\r\n        End If\r\n        intPos = InStr(intPos + 1, strTextzeile, &quot;''&quot;)\r\n    Loop\r\nEnd Function<\/pre>\n<p>Die Funktion liefert als R&uuml;ckgabewert eine Boolean-Variable, die angibt, ob die Zeile einen Kommentar enth&auml;lt. Au&szlig;erdem enth&auml;lt sie einen R&uuml;ckgabeparameter, der die Position des relevanten Hochkommas festlegt. Diesen definieren Sie vor dem Aufruf etwa so:<\/p>\n<pre>Dim intPositionHochkomma As Integer<\/pre>\n<p>Sp&auml;ter arbeiten Sie diese Variable in den Aufruf mit ein:<\/p>\n<pre>If KommentarHinterBefehl(strTextzeile, intPositionHochkomma) Then<\/pre>\n<p>Den kompletten neuen Block finden Sie in Bild 9. Dort erkennen Sie auch gleich ein Beispiel f&uuml;r das erfolgreiche Einf&auml;rben eines Kommentars hinter einer Anweisung.<\/p>\n<p>Im Detail druckt der Bericht nach dem Ermitteln der Position des Hochkommas zun&auml;chst den Teil bis zum Hochkomma in Schwarz und dann den Rest in Gr&uuml;n.<\/p>\n<p>Der Clou hierbei ist, dass hinter dem ersten <b>Print<\/b>-Befehl ein Semikolon folgt (;). Dies signalisiert, dass die folgende <b>Print<\/b>-Anweisung ihren Text gleich an den vorhergehenden anh&auml;ngt. So m&uuml;ssen Sie zwischendurch nur die Farbe mit der Eigenschaft <b>ForeColor<\/b> auf Gr&uuml;n umstellen.<\/p>\n<p><b>Schl&uuml;sselw&ouml;rter f&auml;rben<\/b><\/p>\n<p>Bislang haben wir etwa den Stand erreicht, den auch die Anzeige im VBA-Editor liefert. Es fehlt lediglich noch das Einf&auml;rben der VBA-Schl&uuml;sselw&ouml;rter in Blau.<\/p>\n<p>Der Code, der diese Farbgebung hervorruft, muss zun&auml;chst einmal alle VBA-Schl&uuml;sselw&ouml;rter kennen. Zweitens muss er die Codezeilen noch genauer untersuchen als f&uuml;r die F&auml;rbung der Kommentarzeilen: Immerhin k&ouml;nnen Schl&uuml;sselw&ouml;rter sowohl als VBA-Befehle als auch als Bestandteil anderer Texte auftreten &#8211; beispielsweise in Variablennamen oder in Zeichenketten.<\/p>\n<p>Wie also unterscheiden wir die echten von den unechten Schl&uuml;sselw&ouml;rtern Nun: Wir klammern gleich alle Bereiche aus, die sich innerhalb von Anf&uuml;hrungszeichen befinden.<\/p>\n<p>F&uuml;r den Rest gilt: Keines der Schl&uuml;sselw&ouml;rter darf ein f&uuml;hrendes oder folgendes alphanumerisches Zeichen enthalten. Damit sind Ausnahmen wie etwa Klammern genehmigt.<\/p>\n<p>Wie gehen wir vor, um die betroffenen Schl&uuml;sselw&ouml;rter farbig zu markieren Als Erstes werden wir dort ein Sonderzeichen voranstellen, wo die Farbe f&uuml;r Schl&uuml;sselw&ouml;rter eingesetzt werden soll, und ein weiteres Sonderzeichen f&uuml;r das Ende eines Schl&uuml;sselworts. Wir m&uuml;ssen vor dem Drucken also einfach alle Vorkommen von Schl&uuml;sselw&ouml;rtern einer Zeile finden und diese durch entsprechende Sonderzeichen einrahmen. Aus der Zeile<\/p>\n<pre>Private Sub Report_Open(Cancel As Integer)<\/pre>\n<p>soll dann beispielsweise folgende Zeile werden:<\/p>\n<pre>\\@Private\\\\ \\@Sub\\\\ Report_Open(Cancel \\@As Integer\\\\<\/pre>\n<p>Mit diesen Sonderzeichen (<b>\\@<\/b> f&uuml;r den Beginn, <b>\\\\<\/b> f&uuml;r das Ende eines Schl&uuml;sselworts) k&ouml;nnen wir die Zeile dann wiederum aufteilen und mit mehreren <b>Print<\/b>-Methoden, unterbrochen durch die entsprechenden &auml;nderungen der Eigenschaft <b>ForeColor<\/b>, im Bericht ausgeben.<\/p>\n<p>Die Anreicherung des Modulinhalts um die Sonderzeichen-Markierungen erfolgt in einer Funktion namens <b>SchluesselwoerterErsetzen<\/b>, die regul&auml;re Ausdr&uuml;cke einsetzt und im Beitrag <b>Suchen und Ersetzen mit regul&auml;ren Ausdr&uuml;cken <\/b>(<b>www.access-im-unternehmen.de\/753<\/b>).<\/p>\n<p>Gegen&uuml;ber dem Bericht, der lediglich die Kommentarzeilen gr&uuml;n f&auml;rbt, ergeben sich einige &auml;nderungen. Zun&auml;chst hinterlegen wir zwei Variablen, welche die Markierungen <b>\\@ <\/b>und <b>\\\\ <\/b>speichern:<\/p>\n<pre>Dim cStart As String\r\nDim cEnde As String<\/pre>\n<p>Diese werden im Ereignis <b>Report_Open <\/b>wie folgt gef&uuml;llt:<\/p>\n<pre>cStart = Chr(92) &amp; Chr(64)\r\ncEnde = Chr(92) &amp; Chr(92)<\/pre>\n<p>Warum schreiben wir diese Zeichen nicht einfach im Volltext in den Code Weil diese sonst beim Drucken genau dieses Moduls als Start- und Endzeichen f&uuml;r Schl&uuml;sselw&ouml;rter erkannt w&uuml;rden statt als Elemente des Codes. Also verwenden wir in den Prozeduren, welche die Zeichenkombinationen <b>\\@ <\/b>und <b>\\\\ <\/b>erkennen sollen, nur die entsprechenden Variablen. Diese werden auch extra &uuml;ber die entsprechenden <b>Chr<\/b>-Funktionen gef&uuml;llt.<\/p>\n<p>Die Prozedur <b>Report_Open <\/b>pr&uuml;ft desweiteren den Wert der <b>OpenArgs<\/b>-Eigenschaft, mit welcher der Name des im Bericht zu druckenden Moduls &uuml;bergeben werden soll.<\/p>\n<p><b>Aus Schwarz-Gr&uuml;n wird bunt<\/b><\/p>\n<p>Die Prozedur <b>Detailbereich_Print <\/b>ist nach wie vor das Arbeitstier, was die Ausgabe der Codezeilen angeht, aber sie erh&auml;lt Unterst&uuml;tzung von der Prozedur <b>Codefaerber<\/b>.<\/p>\n<p>Schauen wir uns zun&auml;chst <b>Detailbereich_Print <\/b>an (s. <span class=\"querverweisohneumbruch\"><a href=\"#anker-42-anchor\">Listing 5<\/a><\/span>). Diese druckt zun&auml;chst die Zeilennummer und pr&uuml;ft dann, ob die komplette Zeile eine Kommentarzeile ist.<\/p>\n<p class=\"listingueberschrift\">Listing 5: Drucken und f&auml;rben von Modulen mit VBA-Schl&uuml;sselw&ouml;rtern<\/p>\n<pre>Private Sub Detailbereich_Print(Cancel As Integer, PrintCount As Integer)\r\n    If bolZeilennummern Then\r\n        Me.Print Format(intLine * 10, &quot;0000&quot;)\r\n        Me.CurrentX = 600\r\n    Else\r\n        Me.CurrentX = 0\r\n    End If\r\n    Me.CurrentY = 0\r\n    ''Hier werden Kommentarzeilen gr&uuml;n eingef&auml;rbt:\r\n    If Left(LTrim(strTextzeile), 1) = &quot;''&quot; Then\r\n        ''Gr&uuml;n f&uuml;r Kommentare, ...\r\n        Me.ForeColor = RGB(0, 128, 0)\r\n        Me.Print strTextzeile ''Ausgabe mit Kommentar\r\n        Me.ForeColor = RGB(0, 0, 0)\r\n    Else\r\n        ''... Schwarz f&uuml;r den Rest.\r\n        Dim intPositionHochkomma As Integer ''lala\r\n        If KommentarHinterBefehl(strTextzeile, intPositionHochkomma) Then\r\n            Codefaerber Left(strTextzeile, intPositionHochkomma - 1)\r\n            Me.ForeColor = RGB(0, 128, 0)\r\n            Me.Print Mid(strTextzeile, intPositionHochkomma)\r\n            Me.ForeColor = RGB(0, 0, 0)\r\n        Else\r\n            Me.ForeColor = RGB(0, 0, 0)\r\n            Codefaerber strTextzeile\r\n            Me.Print\r\n        End If\r\n    End If\r\nEnd Sub<\/pre>\n<p>Falls ja, wird diese gr&uuml;n gedruckt und der Fall ist erledigt. Falls nein, geht es mit der Pr&uuml;fung weiter, ob die Zeile zuerst Code und zum Schluss einen Kommentar enth&auml;lt. Dann wird zun&auml;chst die Funktion <b>Codefaerber <\/b>aufgerufen, die sich mit dem F&auml;rben der Schl&uuml;sselw&ouml;rter besch&auml;ftigt &#8211; mehr dazu im Anschluss. Danach druckt die Prozedur den gr&uuml;n gef&auml;rbten Kommentar aus.<\/p>\n<p>Der dritte Fall ist eine kommentarfreie Zeile: Diese wird kompett der Funktion <b>Codefaerber <\/b>&uuml;bergeben und von dieser in den entsprechenden Farben gedruckt.<\/p>\n<p><b>Schl&uuml;sselw&ouml;rter erkennen<\/b><\/p>\n<p>Die Funktion <b>Codefaerber <\/b>finden Sie in <span class=\"querverweisohneumbruch\"><a href=\"#anker-43-anchor\">Listing 6<\/a><\/span>. Sie erwartet den Inhalt der zu druckenden Zeile als Parameter und pr&uuml;ft zun&auml;chst, ob die Zeile &uuml;berhaupt das Startzeichen f&uuml;r ein Schl&uuml;sselwort, also <b>\\@<\/b>, enth&auml;lt. Dessen Position wird mit der <b>InStr<\/b>-Funktion ermittelt und in die Variable <b>intPosStart <\/b>geschrieben. Enth&auml;lt diese im Anschluss den Wert <b>0<\/b>, bedeutet dies, dass die Zeile kein \\@enth&auml;lt und komplett gedruckt werden kann.<\/p>\n<p class=\"listingueberschrift\">Listing 6: Diese Prozedur druckt farbige und schwarze Codezeilen.<\/p>\n<pre>Private Sub Codefaerber(str As String)\r\n    Dim intPosStart As Integer\r\n    Dim intPosEnde As Integer\r\n    intPosStart = InStr(1, str, cStart)\r\n    Me.ForeColor = RGB(0, 0, 0)\r\n    If intPosStart = 0 Then\r\n        Me.Print str;\r\n    Else\r\n        If intPosStart &gt; 1 Then\r\n            Me.Print Mid(str, 1, intPosStart - 1);\r\n        End If\r\n        Do While intPosStart &gt; 0\r\n            Me.ForeColor = RGB(0, 0, 255)\r\n            intPosEnde = InStr(intPosStart, str, cEnde)\r\n            Me.Print Replace(Replace(Mid(str, intPosStart, intPosEnde - intPosStart), _\r\n                cStart, &quot;&quot;), cEnde, &quot;&quot;);\r\n            intPosStart = InStr(intPosEnde, str, cStart)\r\n            Me.ForeColor = RGB(0, 0, 0)\r\n            If intPosStart &gt; 0 Then\r\n                Me.Print Mid(str, intPosEnde + 2, intPosStart - intPosEnde - 2);\r\n            Else\r\n                If intPosEnde &lt; Len(str) Then\r\n                    Me.Print Replace(Replace(Mid(str, intPosEnde), cEnde, &quot;&quot;), cStart, &quot;&quot;);\r\n                End If\r\n            End If\r\n        Loop\r\n    End If\r\nEnd Sub<\/pre>\n<p>Dies erledigt die Funktion mit folgender Anweisung, wobei besonderes Augenmerk auf dem Semikolon liegt:<\/p>\n<pre>    Me.Print str;<\/pre>\n<p>Dieses sorgt n&auml;mlich daf&uuml;r, dass die folgende <b>Print<\/b>-Anweisung in der gleichen Zeile weiterdruckt. Das Komplettieren der Zeile erledigt schlie&szlig;lich die <b>Me.Print<\/b>-Anweisung in der aufrufenden Prozedur <b>Detailbereich_Print<\/b>.<\/p>\n<p>Falls die Zeile mindestens ein Schl&uuml;sselwort enth&auml;lt, ist <b>intPosStart <\/b>gr&ouml;&szlig;er als <b>1<\/b>. Dann druckt die Funktion zun&auml;chst alle Zeichen, die sich vor der durch <b>intPosStart <\/b>repr&auml;sentierten Position befinden &#8211; und zwar in der Farbe Schwarz, da dieser Text ja noch kein Schl&uuml;sselwort enth&auml;lt.<\/p>\n<p>War <b>intPosStart <\/b>gr&ouml;&szlig;er als <b>0<\/b>, wird die Druckfarbe auf Blau eingestellt. Au&szlig;erdem ermittelt die Funktion die Position des ersten auf <b>\\@ <\/b>folgenden Auftretens von <b>\\\\<\/b>, also der Markierung f&uuml;r das Ende des Schl&uuml;sselworts, und speichert diese in der Variablen <b>intPosEnde<\/b>.<\/p>\n<p>Die Zeichen zwischen <b>intPosStart <\/b>und <b>intPosEnde <\/b>werden nun gedruckt, allerdings erst nach dem Ersetzen von <b>\\@ <\/b>und <b>\\\\<\/b> durch leere Zeichenketten.<\/p>\n<p>Dann sucht die Prozedur nach einem weiteren Exemplar der Zeichenkombination <b>\\@<\/b>. Die Position wird wieder in <b>intPosStart <\/b>gespeichert und die Farbe auf Schwarz eingestellt. Falls es ein weiteres Schl&uuml;sselwort gibt, wird der Bereich zwischen <b>intPosEnde<\/b> des zuvor gefundenen und <b>intPosStart <\/b>des neuen Schl&uuml;sselworts entsprechend in Schwarz gedruckt. Wird kein <b>\\@<\/b> mehr gefunden, gibt die Funktion den Text bis zum Ende der Zeile in Schwarz aus, au&szlig;erdem ist die Abbruchbedingung der <b>Do While<\/b>-Schleife erf&uuml;llt und die Funktion wird beendet.<\/p>\n<p>Wenn jedoch ein neues <b>\\@ <\/b>gefunden wird, durchl&auml;uft die Funktion die <b>Do While<\/b>-Schleife ein weiteres Mal und gibt weitere Texte in den entsprechenden Farben aus. Das Ergebnis zeigt Bild 10.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/BerichteOhneDatenherkunft-web-images\/pic010.png\" alt=\"pic010.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 10: Auszug eines Moduls mit blau markierten Schl&uuml;sselw&ouml;rtern<\/span><\/b><\/p>\n<p><b>Module zum Drucken ausw&auml;hlen<\/b><\/p>\n<p>Die Beispieldatenbank enth&auml;lt ein Formular namens <b>frmModulDrucken<\/b>, mit dem Sie eines der Module der Datenbank ausw&auml;hlen und entweder in der Vorschau anzeigen oder drucken k&ouml;nnen. Das Drucken aus der Vorschau heraus funktioniert, wie bereits erw&auml;hnt, nicht!<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>W&auml;hrend das Ausgeben von Textdateien in Berichten eher dem Warmwerden diente, ist das Drucken von Modulen mit gef&auml;rbten Kommentarzeilen und Schl&uuml;sselw&ouml;rtern schon eine recht komplizierte Sache. Allerdings zeigen beide Beispiele, dass aus Berichten mit ein wenig Programmierung mehr herauszuholen ist, als man annehmen m&ouml;chte.<\/p>\n<p>Gerade die Ausgabe der Module weckt eine ganze Reihe weiterer W&uuml;nsche: So k&ouml;nnten Sie etwa die erste Zeile einer jeden Prozedur fett ausgeben, bestimmte Bereiche wie etwa die typische Fehlerbehandlung f&uuml;r den Ausdruck ausblenden oder alternative Farben f&uuml;r Schl&uuml;sselw&ouml;rter und Kommentare ausw&auml;hlen.<\/p>\n<p>Die Schl&uuml;sselw&ouml;rter sind noch nicht komplett in der Prozedur <b>SchluesselwoerterErsetzen <\/b>vorhanden und es tauchen trotz einiger Tests immer noch Codezeilen auf, die nicht sauber oder an der richtigen Stelle umbrochen werden.<\/p>\n<p>Wer mag, kann gern eigene Optimierungen vornehmen und uns per E-Mail an <b>info@access-im-unternehmen.de <\/b>zusenden &#8211; wir werden diese testen und gegebenenfalls ver&ouml;ffentlichen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>DebugToReport00.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{D99790F4-1D93-4CC4-BEC0-6E64CCD1D339}\/aiu_751.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Haben Sie schonmal einen Access-Bericht missbraucht Um beispielsweise ein Kalenderblatt zu erstellen oder ein Sudoku zu drucken Dann haben Sie sicher auf eine entsprechende Datenherkunft zur&uuml;ckgegriffen, denn ohne eine solche lassen Berichte sich nur bedingt mit Informationen f&uuml;llen. Dieser Beitrag zeigt, wie Sie auch ohne Daten eine Menge mit Berichten anstellen. Dabei sollen zun&auml;chst der Inhalt einer Textdatei und sp&auml;ter der eines Moduls in Berichtsform abgebildet werden &#8211; Letzteres mit entsprechender F&auml;rbung von Kommentarzeilen und Schl&uuml;sselw&ouml;rtern!<\/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":[662010,66062010,44000024],"tags":[],"class_list":["post-55000751","post","type-post","status-publish","format-standard","hentry","category-662010","category-66062010","category-Berichte_und_Reporting"],"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>Berichte ohne Datenherkunft - 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\/Berichte_ohne_Datenherkunft\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Berichte ohne Datenherkunft\" \/>\n<meta property=\"og:description\" content=\"Haben Sie schonmal einen Access-Bericht missbraucht Um beispielsweise ein Kalenderblatt zu erstellen oder ein Sudoku zu drucken Dann haben Sie sicher auf eine entsprechende Datenherkunft zur&uuml;ckgegriffen, denn ohne eine solche lassen Berichte sich nur bedingt mit Informationen f&uuml;llen. Dieser Beitrag zeigt, wie Sie auch ohne Daten eine Menge mit Berichten anstellen. Dabei sollen zun&auml;chst der Inhalt einer Textdatei und sp&auml;ter der eines Moduls in Berichtsform abgebildet werden - Letzteres mit entsprechender F&auml;rbung von Kommentarzeilen und Schl&uuml;sselw&ouml;rtern!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Berichte_ohne_Datenherkunft\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:08:38+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/c809897c5f47438d83095b583e865fcc\" \/>\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=\"27\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Berichte_ohne_Datenherkunft\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Berichte_ohne_Datenherkunft\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Berichte ohne Datenherkunft\",\"datePublished\":\"2020-05-22T22:08:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Berichte_ohne_Datenherkunft\\\/\"},\"wordCount\":4608,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Berichte_ohne_Datenherkunft\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/c809897c5f47438d83095b583e865fcc\",\"articleSection\":[\"2010\",\"6\\\/2010\",\"Berichte und Reporting\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Berichte_ohne_Datenherkunft\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Berichte_ohne_Datenherkunft\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Berichte_ohne_Datenherkunft\\\/\",\"name\":\"Berichte ohne Datenherkunft - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Berichte_ohne_Datenherkunft\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Berichte_ohne_Datenherkunft\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/c809897c5f47438d83095b583e865fcc\",\"datePublished\":\"2020-05-22T22:08:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Berichte_ohne_Datenherkunft\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Berichte_ohne_Datenherkunft\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Berichte_ohne_Datenherkunft\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/c809897c5f47438d83095b583e865fcc\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/c809897c5f47438d83095b583e865fcc\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Berichte_ohne_Datenherkunft\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Berichte ohne Datenherkunft\"}]},{\"@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":"Berichte ohne Datenherkunft - 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\/Berichte_ohne_Datenherkunft\/","og_locale":"de_DE","og_type":"article","og_title":"Berichte ohne Datenherkunft","og_description":"Haben Sie schonmal einen Access-Bericht missbraucht Um beispielsweise ein Kalenderblatt zu erstellen oder ein Sudoku zu drucken Dann haben Sie sicher auf eine entsprechende Datenherkunft zur&uuml;ckgegriffen, denn ohne eine solche lassen Berichte sich nur bedingt mit Informationen f&uuml;llen. Dieser Beitrag zeigt, wie Sie auch ohne Daten eine Menge mit Berichten anstellen. Dabei sollen zun&auml;chst der Inhalt einer Textdatei und sp&auml;ter der eines Moduls in Berichtsform abgebildet werden - Letzteres mit entsprechender F&auml;rbung von Kommentarzeilen und Schl&uuml;sselw&ouml;rtern!","og_url":"https:\/\/access-im-unternehmen.de\/Berichte_ohne_Datenherkunft\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:08:38+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/c809897c5f47438d83095b583e865fcc","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"27\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Berichte_ohne_Datenherkunft\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Berichte_ohne_Datenherkunft\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Berichte ohne Datenherkunft","datePublished":"2020-05-22T22:08:38+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Berichte_ohne_Datenherkunft\/"},"wordCount":4608,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Berichte_ohne_Datenherkunft\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/c809897c5f47438d83095b583e865fcc","articleSection":["2010","6\/2010","Berichte und Reporting"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Berichte_ohne_Datenherkunft\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Berichte_ohne_Datenherkunft\/","url":"https:\/\/access-im-unternehmen.de\/Berichte_ohne_Datenherkunft\/","name":"Berichte ohne Datenherkunft - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Berichte_ohne_Datenherkunft\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Berichte_ohne_Datenherkunft\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/c809897c5f47438d83095b583e865fcc","datePublished":"2020-05-22T22:08:38+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Berichte_ohne_Datenherkunft\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Berichte_ohne_Datenherkunft\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Berichte_ohne_Datenherkunft\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/c809897c5f47438d83095b583e865fcc","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/c809897c5f47438d83095b583e865fcc"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Berichte_ohne_Datenherkunft\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Berichte ohne Datenherkunft"}]},{"@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\/55000751","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=55000751"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000751\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000751"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000751"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000751"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}