{"id":55000660,"date":"2009-04-01T00:00:00","date_gmt":"2020-05-22T22:22:31","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=660"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Termine_in_Berichten_darstellen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Termine_in_Berichten_darstellen\/","title":{"rendered":"Termine in Berichten darstellen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg05.met.vgwort.de\/na\/9b54227438dd4d82bcee16d32e34304a\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Was die Darstellung von Terminen und Kalendern angeht, ist Outlook der Platzhirsch. Es gibt kaum eine Ansicht, die sich damit nicht verwirklichen l&auml;sst. Oder doch Nun: Ihre Kunden oder Sie selbst haben bestimmt Ideen, die selbst Outlooks Berichts-Engine an die Leistungsgrenze bringen. Und hier kommt Access ins Spiel: Verwenden Sie Berichte und bringen Sie Access dazu, Ihre Termine ganz nach Wunsch anzuzeigen.<\/b><\/p>\n<p>Die Anzeige von Terminen in Access-Berichten ist seit jeher mit Bastelei verbunden &#8211; au&szlig;er Sie begn&uuml;gen sich damit, die Termine einfach tabellarisch aufzulisten. Dann brauchen Sie wirklich nicht viel mehr als einen handels&uuml;blichen Bericht, in dessen Detailbereich Sie die vorliegenden Termine eintragen. Anspruchsvoller wird es dann schon, wenn der Bericht die Termine und deren Zeitaufwand h&uuml;bsch grafisch aufbereitet darstellen soll &#8211; genau so, wie es auch beispielsweise in der Tages&uuml;bersicht von Outlook der Fall ist (siehe Bild 1).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_02\/Termine-web-images\/pic001_opt.jpeg\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Anzeige der Termine in der Tages&uuml;bersicht von Outlook<\/span><\/b><\/p>\n<p>Auch erfahrenen Berichtsdesignern d&uuml;rfte der Nachbau eines solchen Layouts leichte Sorgenfalten auf die Stirn legen, ist man doch normalerweise gewohnt, die Daten sch&ouml;n untereinander anzuordnen und eventuelle Feinheiten durch Gruppierungen oder Unterberichte abzudecken. Wer schon in unseren Beitrag <b>Berichte manuell f&uuml;llen <\/b>(Shortlink 659) hineingeschaut hat, ahnt bereits, dass es hier nicht mit rechten Dingen &#8211; &auml;h, Steuerelementen &#8211; zuging, sondern dass wir hier von Berichtsmethoden wie <b>Print <\/b>und <b>Line <\/b>Gebrauch gemacht haben.<\/p>\n<p>Das allein reicht allerdings l&auml;ngst nicht aus, um Termine so wie unter Outlook darzustellen (genau genommen werden wir nicht jedes Detail nachbilden, doch die wichtigsten Elemente ber&uuml;cksichtigen wir nat&uuml;rlich).<\/p>\n<p>Beginnen wir jedoch bei den Daten, die unserem Bericht zugrunde liegen &#8211; und die sind bei Weitem das am wenigsten Komplizierte dieser L&ouml;sung.<\/p>\n<p>Die Tabelle <b>tblTermine <\/b>sieht wie in Bild 2 aus und enth&auml;lt die folgenden Felder:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_02\/Termine-web-images\/pic002_opt.jpeg\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Die Tabelle tblTermine in der Entwurfsansicht<\/span><\/b><\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>ID<\/b>: Prim&auml;rschl&uuml;sselfeld<\/li>\n<li class=\"aufz-hlung\"><b>Termin<\/b>: Beschreibung des Termins<\/li>\n<li class=\"aufz-hlung\"><b>Termindatum<\/b>: Datum, an dem der Termin stattfindet<\/li>\n<li class=\"aufz-hlung\"><b>Startzeit<\/b>: Zeit, zu welcher der Termin beginnt<\/li>\n<li class=\"aufz-hlung\"><b>Endzeit<\/b>: Zeit, zu welcher der Termin endet<\/li>\n<li class=\"aufz-hlung\"><b>FarbeID<\/b>: Fremdschl&uuml;sselfeld zur Tabelle <b>tblFarben<\/b>; legt die Hintergrundfarbe f&uuml;r den Termin im Bericht fest<\/li>\n<li class=\"aufz-hlung\"><b>Bereich<\/b>: F&uuml;r das Layout des Kalenderberichts ist es wichtig zu wissen, ob Termine ein- oder mehrspaltig angezeigt werden. Termine, die in einem mehrspaltigen Bereich liegen, sind durch den gleichen Wert in diesem Feld zu erkennen.<\/li>\n<li class=\"aufz-hlung\"><b>Spalte<\/b>: Gibt an, in welcher Spalte sich dieser Termin befindet.<\/li>\n<li class=\"aufz-hlung\"><b>Spaltenzahl<\/b>: Gibt an, wieviele Spalten der Bereich umfasst, in dem sich dieser Termin befindet.<\/li>\n<\/ul>\n<p>Die Funktion der letzten drei Felder wird weiter hinten erl&auml;utert, au&szlig;erdem erfahren Sie dort, wie diese Felder gef&uuml;llt werden. Aktuell reicht es, wenn Sie wissen, dass die in diesem Beitrag vorgestellte L&ouml;sung Ihnen diese Aufgabe abnimmt.<\/p>\n<p>Den Aufbau der Tabelle <b>tblFarben <\/b>entnehmen Sie Bild 3. Sie enth&auml;lt neben dem Prim&auml;rschl&uuml;sselfeld <b>ID <\/b>ein Feld zur Bezeichnung der Farbe (<b>Farbe<\/b>) sowie ein Feld mit dem Zahlenwert, der die Farbe repr&auml;sentiert (<b>Farbwert<\/b>).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_02\/Termine-web-images\/pic003_opt.jpeg\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Diese Tabelle speichert die Hintergrundfarben f&uuml;r die Termine im Bericht.<\/span><\/b><\/p>\n<p>Das war schon fast alles, was Sie zum Modellieren eines Berichts wie in Bild 5 ben&ouml;tigen &#8211; es fehlen nur noch ein paar Hilfstabellen, Abfragen und einige Zeilen VBA-Code, um den Bericht zu f&uuml;llen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_02\/Termine-web-images\/pic004_opt.jpeg\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Beispiel f&uuml;r einen Terminbericht mit &uuml;berlappenden Terminen<\/span><\/b><\/p>\n<p><b>Termineingabe<\/b><\/p>\n<p>Auf die Beschreibung von Formularen zur Eingabe der Termine verzichten wir in diesem Beitrag aus Platzgr&uuml;nden. Sie k&ouml;nnen die Termine allerdings in ein handels&uuml;bliches Formular eingeben oder diese auch aus Outlook importieren. Wie das geht, erfahren Sie beispielsweise im Beitrag <b>Outlook-Termine im Griff <\/b>(Shortlink 439).<\/p>\n<p><b>Grundlagen des Kalenderberichts<\/b><\/p>\n<p>Gl&uuml;cklicherweise gibt es auch Tage ohne Termine, und daher enth&auml;lt ein Kalender auch nicht f&uuml;r jeden Tag Aufzeichnungen oder Eintr&auml;ge. Der Terminbericht sollte aber trotzdem f&uuml;r jeden Tag eine eigene Seite anzeigen &#8211; allein, damit man nicht immer auf das Datum schauen muss, wenn man den Kalender am Bildschirm oder auch in ausgedruckter Form durchbl&auml;ttert. Nach Montag soll Dienstag folgen und nicht schon der Mittwoch, wenn es am Dienstag keine Termine gibt.<\/p>\n<p>Wie aber bringen wir Access dazu, ganz banal einen 365-seitigen Bericht als Grundlage f&uuml;r den Terminkalender eines Jahres zu liefern &#8211; ohne dass f&uuml;r jeden Tag ein Termin angelegt w&auml;re<\/p>\n<p>Nun, das geht ganz einfach: Wir brauchen einfach nur eine Datenherkunft, die tats&auml;chlich alle 365 Tage liefert. Die Tabelle <b>tblKalenderdaten <\/b>ist eine solche Datenherkunft: Sie enth&auml;lt f&uuml;r jeden Tag des Jahres 2009 einen eigenen Datensatz mit einem Prim&auml;rschl&uuml;ssel und einem Datumsfeld (siehe Bild 4). Wenn Sie m&ouml;chten, so k&ouml;nnen Sie diese Tabelle durch weitere Spalten wie Werktag oder Feiertag erg&auml;nzen und solche Tage sp&auml;ter im Bericht anders formatieren.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_02\/Termine-web-images\/pic005_opt.jpeg\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Diese Tabelle liefert die Grundlage f&uuml;r einen ganzj&auml;hrigen Kalenderbericht.<\/span><\/b><\/p>\n<p>F&uuml;r Letzteres sollten Sie unbedingt einen eindeutigen Schl&uuml;ssel festlegen, damit die Tabelle kein Datum doppelt enthalten kann. Damit das F&uuml;llen der Tabelle nicht soviel Arbeit macht, &uuml;bernimmt die Routine aus Listing 1 diese Aufgabe. Sie erwartet das Start- und das Enddatum als Parameter und legt Datens&auml;tze f&uuml;r den angegebenen Zeitraum an.<\/p>\n<p class=\"kastentabelleheader\">Listing 1: F&uuml;llen der Tabelle tblKalenderdaten<\/p>\n<pre>Public Sub KalenderdatenFuellen(datStart As Date, datEnde As Date)\r\nDim dat As Date\r\nDim db As DAO.Database\r\nDim rst As DAO.Recordset\r\nSet db = CurrentDb\r\ndb.Execute &quot;DELETE FROM tblKalenderdaten&quot;, dbFailOnError\r\nSet rst = db.OpenRecordset(&quot;tblKalenderdaten&quot;, dbOpenDynaset)\r\nFor dat = CDate(datStart) To CDate(datEnde)\r\n rst.AddNew\r\n    rst!Kalenderdatum = dat\r\n    rst.Update\r\nNext dat\r\nEnd Sub<\/pre>\n<p><b>Bericht anlegen<\/b><\/p>\n<p>In den folgenden Abs&auml;tzen erfahren Sie, wie Sie den Bericht aus Bild 5 anlegen und diesen mit Inhalt f&uuml;llen. Damit Sie den Bericht Ihren Bed&uuml;rfnissen anpassen k&ouml;nnen, bauen wir ihn St&uuml;ck f&uuml;r St&uuml;ck auf.<\/p>\n<p>Den Start macht ein leerer Bericht, dem Sie &uuml;bergangsweise die Tabelle <b>tblKalenderdaten <\/b>als Datenherkunft zuweisen.<\/p>\n<p><b>Eine Seite pro Tag<\/b><\/p>\n<p>Der Kalender soll jeden Tag auf einer eigenen Seite anzeigen. Daher reicht es nicht aus, einfach nur das Feld <b>Kalenderdatum <\/b>aus der Datenherkunft in den Detailbereich des Berichts zu ziehen. Sie m&uuml;ssen auch noch daf&uuml;r sorgen, dass nach (oder vor) jedem Datensatz ein Seitenwechsel erfolgt. Theoretisch w&uuml;rde es reichen, den Detailbereich einfach gro&szlig; genug zu gestalten.<\/p>\n<p>Allerdings soll der Detailbereich m&ouml;glichst nur den Kalender selbst enthalten, daher ben&ouml;tigen wir einen anderen Berichtsbereich als Unterkunft f&uuml;r das Feld Kalenderdatum (das ja im Bericht auch das Datum anzeigen soll).<\/p>\n<p>Der Seitenbereich w&auml;re eine gute Wahl, aber auch diesen sparen wir f&uuml;r eventuelle Elemente wie eine &Uuml;berschrift auf. Die Kalenderdaten sollen in der richtigen Reihenfolge angezeigt werden, was Sie durch Anlegen einer Sortierung f&uuml;r das Feld <b>Kalenderdatum <\/b>im Bericht erreichen.<\/p>\n<p>Und wenn Sie schon einmal dabei sind, k&ouml;nnen Sie auch gleich eine Gruppierung daraus machen und das Feld <b>Kalenderdatum <\/b>im Gruppenkopf unterbringen.<\/p>\n<p>Dem Gruppenkopfbereich weisen Sie dann noch &uuml;ber das Setzen des Werts <b>Vor Bereich <\/b>f&uuml;r die Eigenschaft <b>Neue Seite <\/b>einen Seitenumbruch hinzu und stellen so sicher, dass jedes Datum auf einer neuen Seite angezeigt wird (siehe Bild 6).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_02\/Termine-web-images\/pic006_opt.jpeg\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Dieser Bericht zeigt jeden Tag auf einer neuen Seite an.<\/span><\/b><\/p>\n<p>In der Seitenansicht sieht der Bericht nun wie in Bild 7 aus und liefert die erwarteten Datumsangaben auf je einer eigenen Seite.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_02\/Termine-web-images\/pic007_opt.jpeg\" alt=\"pic007.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Die Grundlage f&uuml;r den Terminkalender mit Tages&uuml;bersicht<\/span><\/b><\/p>\n<p><b>Stundenplan hinzuf&uuml;gen<\/b><\/p>\n<p>Im n&auml;chsten Schritt f&uuml;gen wir das Raster hinzu, das den Tag beziehungsweise den Detailbereich in 24 Elemente aufteilt und diese mit den entsprechenden Stundenangaben versieht (siehe Bild 8).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_02\/Termine-web-images\/pic008_opt.jpeg\" alt=\"pic008.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 8: Der Terminkalender besitzt nun ein Raster, in das man nur noch die Termine einf&uuml;gen muss.<\/span><\/b><\/p>\n<p>Dies geschieht in einer Routine, die im Ereignis <b>Beim Drucken <\/b>des Detailbereichs des Berichts ausgel&ouml;st wird:<\/p>\n<pre>Private Sub Detailbereich_Print(Cancel As Integer, PrintCount As Integer)\r\n    UhrzeitrasterAnlegen\r\n    End Sub<\/pre>\n<p>Die Routine <b>UhrzeitrasterAnlegen <\/b>(Listing 2) deklariert zun&auml;chst vier Variablen namens <b>sngRepX1<\/b>, <b>sngRepX2<\/b>, <b>sngRepY1 <\/b>und <b>sngRepY2<\/b>. Darin speichert sie die Koordinaten des Detailbereichs relativ zur linken oberen Ecke, die sie aus den Eigenschaften <b>ScaleTop<\/b>, <b>ScaleWidth<\/b>, <b>ScaleLeft <\/b>und <b>ScaleHeight <\/b>erh&auml;lt.<\/p>\n<p class=\"kastentabelleheader\">Listing 2: Herstellen eines Rasters zur optischen Unterst&uuml;tzung der anschlie&szlig;end hinzugef&uuml;gten Termine<\/p>\n<pre>Private Sub UhrzeitrasterAnlegen\r\n    &apos;Koordinaten f&uuml;r den Bericht\r\n    Dim sngRepX1 As Single\r\n    Dim sngRepX2 As Single\r\n    Dim sngRepY1 As Single\r\n    Dim sngRepY2 As Single\r\n    Dim i As Integer\r\n    Dim lngColor As Long\r\n    With Me\r\n    sngRepY1 = .ScaleTop\r\n    sngRepX1 = .ScaleLeft\r\n    sngRepX2 = .ScaleWidth\r\n    sngRepY2 = .ScaleHeight\r\n    &apos;Raster mit Zeiten bauen\r\n    For i = 1 To 25\r\n        lngColor = RGB(225, 225, 225)\r\n        Me.Line (sngRepX1, _\r\n        sngRepY1 + (i - 1) * (sngRepY2 - sngRepY1) \/ 24) _\r\n        -(sngRepX2, _\r\n        sngRepY1 + (i - 1) * (sngRepY2 - sngRepY1) \/ 24), _\r\n        lngColor\r\n        CurrentX = 0\r\n        If i &lt; 25 Then\r\n            lngColor = RGB(0, 0, 0)\r\n            Me.ForeColor = lngColor\r\n            Me.FontSize = 9\r\n            Me.Print Format(DateAdd(&quot;h&quot;, i - 1, 0), &quot;hh&quot;);\r\n            Me.FontSize = 5\r\n            Me.Print Format(DateAdd(&quot;h&quot;, i - 1, 0), &quot; nn&quot;)\r\n        End If\r\n    Next i\r\n    End With\r\n    End Sub<\/pre>\n<p>Danach baut die Routine auch schon die Linienstruktur und die darin enthaltenen Stundenzahlen auf, und zwar in einer Schleife, welche die Werte <b>1 <\/b>bis <b>25 <\/b>durchl&auml;uft &#8211; immerhin gibt es 24 Stunden, von denen jede oben und unten durch eine Linie begrenzt werden m&ouml;chte.<\/p>\n<p>Beschriftungen brauchen wir aber ebenfalls nur 24, weshalb der untere Teil der Schleife nur ausgef&uuml;hrt wird, solange die Z&auml;hlervariable einen Wert kleiner <b>25 <\/b>aufweist. Man h&auml;tte auch zwei Schleifen aufbauen k&ouml;nnen &#8211; das ist aber sicher Geschmackssache.<\/p>\n<p>Innerhalb der Schleife sorgt die <b>Line<\/b>-Anweisung zun&auml;chst daf&uuml;r, dass 25 Linien sorgf&auml;ltig auf die H&ouml;he des Detailbereichs aufgeteilt werden. Die Breite wird dabei durch den ersten und dritten Parameter angegeben, wobei der erste den Wert <b>0 <\/b>und der dritte einen Wert aufweist, welcher der Breite des Detailbereichs entspricht.<\/p>\n<p>Die vertikale Position der Linie geben der zweite und der vierte Parameter der <b>Line<\/b>-Funktion an, welche die gleiche Formel enthalten. Diese liefert den dem Wert von <b>i <\/b>entsprechenden Anteil der Gesamth&ouml;he des Detailbereichs in der aktuellen Einheit, standardm&auml;&szlig;ig also in Twips.<\/p>\n<p><b>Termine vorbereiten<\/b><\/p>\n<p>Nun geht es an den Teil des Berichts, in dem eine Menge Gehirnschmalz steckt &#8211; zumindest, wenn man dem Benutzer erm&ouml;glichen m&ouml;chte, auch sich &uuml;berschneidende Termine in den Kalender einzutragen. Man k&ouml;nnte nun sagen, dass dies keinen Sinn macht, da man normalerweise immer nur eine T&auml;tigkeit zur gleichen Zeit betreibt &#8211; aber m&ouml;glicherweise m&ouml;chte der Benutzer ja auch weitere Ereignisse im Terminkalender unterbringen.<\/p>\n<p><!--30percent--><\/p>\n<p>Schauen wir uns also an, was man braucht, um zwei oder mehr Termine im Bericht unterzubringen, die sich zumindest teilweise &uuml;berschneiden. Die erste wichtige Erkenntnis ist dabei, dass die Termine nur dort auf mehrere Spalten aufgeteilt werden, wo auch mehrere sich &uuml;berschneidende Termine angezeigt werden sollen. Dabei kann es sich um zwei Termine handeln, die sich ganz oder teilweise &uuml;berlappen, vielleicht sind es aber auch drei oder mehr. Dabei gibt es dann auch wieder Varianten: Wenn der erste, zweite und dritte Termin einen gemeinsamen Zeitpunkt haben, dann brauchen Sie auch drei Spalten. Wenn sich hingegen der erste und der zweite Termin &uuml;berschneiden, der dritte Termin aber erst nach dem ersten Termin beginnt, reichen zwei Zeilen aus &#8211; der dritte Termin kann dann ja in der ersten Zeile hinter dem ersten Termin eingef&uuml;gt werden.<\/p>\n<p>Danach folgen dann m&ouml;glicherweise weitere Termine, die sich mit keinem anderen Termin &uuml;berschneiden und die deshalb wieder &uuml;ber die ganze Breite des Berichts gestreckt werden sollen.<\/p>\n<p>Das ist der erste Schritt zur L&ouml;sung: Wir m&uuml;ssen herausfinden, welche Bereiche es f&uuml;r den aktuellen Tag gibt und wie viele Spalten jeder Bereich aufweist. Einen Bereich mit x Spalten und einen Bereich mit y Spalten trennt ein, wenn auch noch so kleiner, Bereich ohne Termin. Und zus&auml;tzlich m&uuml;ssen wir ermitteln, wie viele Spalten der jeweilige Bereich ben&ouml;tigt.<\/p>\n<p>Bei diesem Schritt hilft die Abfrage <b>qryZeitSpaltenanzahl <\/b>mit der Entwurfsansicht aus Bild 9. Sie f&uuml;hrt das Ergebnis der Abfragen <b>qryZeit <\/b>und <b>qryTermine <\/b>zusammen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_02\/Termine-web-images\/pic009_opt.jpeg\" alt=\"pic009.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 9: Die Abfrage qryZeitSpaltenanzahl in der Entwurfsansicht<\/span><\/b><\/p>\n<p>Die Abfrage <b>qryZeit <\/b>(siehe Bild 10) kombiniert den Inhalt der beiden Tabellen <b>tblStunden <\/b>und <b>tblMinuten <\/b>so, dass das Ergebnisfeld der Abfrage alle Minuten von <b>0:00 <\/b>bis <b>23:59 <\/b>inklusive Stundenangabe liefert. Die Abfrage <b>qryTermine <\/b>entspricht weitgehend der Tabelle <b>tblTermine<\/b>, enth&auml;lt aber ein zus&auml;tzliches Feld namens <b>Endzeit1 <\/b>mit folgendem Inhalt:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_02\/Termine-web-images\/pic010_opt.jpeg\" alt=\"pic010.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 10: Die Abfrage qryZeit liefert alle Zeiten von 0:00 bis 23:59 im Minutenabstand.<\/span><\/b><\/p>\n<pre>Endzeit1: Wenn([Endzeit]&gt;DatAdd(&quot;n&quot;;60;[Startzeit]);[Endzeit];DatAdd(&quot;n&quot;;60;[Startzeit]))<\/pre>\n<p>Dieser Ausdruck liefert den gleichen Wert wie das Feld <b>Endzeit<\/b>, wenn der Termin 60 Minuten oder l&auml;nger dauert, sonst erh&auml;lt <b>Endzeit1 <\/b>einen Wert, welcher der Startzeit plus 60 Minuten entspricht. Somit ergibt sich aus Startzeit und Endzeit1 immer ein Termin, der mindestens eine Stunde dauert &#8211; warum, erfahren Sie sp&auml;ter.<\/p>\n<p>Welches Ergebnis aber liefert die Abfrage <b>qryZeitSpaltenanzahl<\/b> Betrachten wir zun&auml;chst die ersten beiden Felder. Diese liefern alle Kombinationen aus den Minuten eines Tages (von <b>0:00 <\/b>bis <b>23:59<\/b>) und den Terminen.<\/p>\n<p>Wenn nun f&uuml;r den ersten Januar drei Termine vorliegen, wird jede Minute aus <b>qryZeit <\/b>f&uuml;r jeden Termin einmal mit den Datens&auml;tzen der Tabelle <b>qryTermine <\/b>verkn&uuml;pft. Nun kommt noch eine Gruppierung hinzu, welche die beiden Felder <b>Zeit <\/b>aus <b>qryZeit <\/b>und <b>Termindatum <\/b>aus <b>qryTermine <\/b>betrifft. Jede Kombination aus <b>Zeit <\/b>und <b>Termindatum <\/b>wird somit nur noch einmal angezeigt. Fehlt noch das dritte Feld mit der Bezeichnung <b>InBereich<\/b>. Es liefert die Summe eines Ausdrucks, der aus zwei mit <b>Und <\/b>verkn&uuml;pften boolschen Ausdr&uuml;cken besteht:<\/p>\n<pre>Summe([Startzeit]&lt;[Zeit] Und [Endzeit1]&gt;[Zeit])<\/pre>\n<p>Der Ausdruck liefert den Wert <b>True <\/b>(also <b>-1<\/b>), wenn f&uuml;r den aktuellen Datensatz die <b>Startzeit <\/b>eines Termins vor dem Wert des Feldes <b>Zeit <\/b>liegt und der Inhalt von <b>Endzeit1 <\/b>hinter <b>Zeit<\/b>, und er liefert <b>False <\/b>(also <b>0<\/b>), wenn eine der beiden Bedingungen nicht zutrifft.<\/p>\n<p>Wenn es nun beispielsweise einen Termin gibt, dessen Start vor einem Zeitpunkt, sagen wir 10:00 Uhr, und dessen Ende nach diesem Zeitpunkt liegt, dann liefert der obige Ausdruck den Wert <b>-1<\/b>.<\/p>\n<p>Vielleicht gibt es auch zwei oder mehr solcher Termine, dann liefert das Feld <b>InBereich <\/b>die Summe der <b>True<\/b>-Werte, also beispielsweise <b>-1+(-1)+(-1)=-3<\/b>. Das Vorzeichen ist uns derzeit egal, wichtig ist nur, dass der Ausdruck f&uuml;r jede Minute eines Tages die Anzahl der Termine liefert, die f&uuml;r diese Minute festgelegt sind.<\/p>\n<p>Wenn Sie sich das Ergebnis ansehen, werden Sie beispielsweise Werte wie in Bild 11 vorfinden. Dort gibt es bis 0:50 genau einen Termin und ab 0:51 sind es zwei. Ob der erste Termin vorher endete und dann zwei neue beginnen oder ob zum ersten Termin einer hinzukommt, ist egal &#8211; wichtig ist nur, dass Sie wissen, wie viele Termine in jeder Minute laufen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_02\/Termine-web-images\/pic011_opt.jpeg\" alt=\"pic011.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 11: Um 0:51 kommt zum ersten Termin ein zweiter hinzu.<\/span><\/b><\/p>\n<p>Wie k&ouml;nnen wir nun daraus ableiten, &uuml;ber wie viele Spalten sich die Termine erstrecken beziehungsweise welchen Zeitraum dieser Bereich einnimmt Und wie will man eigentlich zwei Bereiche mit unterschiedlicher Spaltenzahl voneinander trennen, wenn die Termine etwa eines einspaltigen und eines mehrspaltigen Bereichs unmittelbar aufeinanderfolgen Hier hilft ein Kunstgriff: Der Ausdruck, der ermittelt, ob ein Termin zu einer bestimmten Minute stattfindet oder nicht, l&auml;sst die letzte Minute des Terminzeitraums aus.<\/p>\n<p>Auch wenn ein Termin etwa bis zu einer vollen Stunde wie 12:00 Uhr dauert, wird er nur bis 11:59 Uhr ber&uuml;cksichtigt (<b>[Endzeit]&gt;[Zeit]<\/b>). Wenn der n&auml;chste Termin nun um 12:00 Uhr beginnt und kein Termin vor 12:00 Uhr beginnt und nach 12:00 Uhr endet, wird durch den Wert <b>0 <\/b>f&uuml;r das Feld <b>InBereich <\/b>der Abfrage <b>qryZeitSpaltenanzahl <\/b>eine Zone gekennzeichnet, die keinen Termin enth&auml;lt und somit den Wechsel zwischen zwei Bereichen markieren kann.<\/p>\n<p>Das ist zum Beispiel in Bild 12 zum Zeitpunkt 12:00 Uhr der Fall.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_02\/Termine-web-images\/pic012_opt.jpeg\" alt=\"pic012.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 12: Um 13:00 Uhr gehen zwei Termine zu Ende und ein weiterer beginnt &#8211; Zeit, die Anzahl der Spalten zu pr&uuml;fen.<\/span><\/b><\/p>\n<p>Nachdem Sie nun wissen, wie wir die Anzahl der Termine pro Minute und die Zeitpunkte f&uuml;r das Umstellen der Spaltenanzahl f&uuml;r die Ausgabe der Terminbl&ouml;cke ermitteln, fehlt noch die Routine, mit der wir diese Informationen auswerten und in die Felder <b>Spalte<\/b>, <b>Spaltenzahl <\/b>und <b>Bereich <\/b>der Tabelle <b>tblTermine <\/b>eintragen k&ouml;nnen.<\/p>\n<p>Diese Routine hei&szlig;t <b>BereicheUndSpaltenanzahlErmitteln <\/b>(Listing 3) und wird einmal beim &Ouml;ffnen des Berichts aufgerufen.<\/p>\n<p class=\"kastentabelleheader\">Listing 3: Vorbereiten der Termine f&uuml;r die mehrspaltige Anzeige im Terminbericht<\/p>\n<pre>Public Sub BereicheUndSpaltenanzahlErmitteln()\r\nDim db As DAO.Database\r\nDim rst As DAO.Recordset\r\nDim intAktuellerBereich As Integer\r\nDim intBereichVorher As Integer\r\nDim intBereichSpaltenMax As Integer\r\nDim datBereichStart As Date\r\nDim datBereichEnde As Date\r\nDim datTermindatum As Date\r\nDim intSpalte As Integer\r\nDim strSQL As String\r\nDim i As Integer\r\nSet db = CurrentDb\r\nSet rst = db.OpenRecordset(&quot;SELECT * FROM qryZeitSpaltenanzahl&quot;, _\r\ndbOpenDynaset)\r\nDo While Not rst.EOF\r\n If intBereichVorher &lt; 0 And rst!InBereich = 0 Then\r\n    datBereichEnde = rst!Zeit\r\n    intAktuellerBereich = intAktuellerBereich + 1\r\n    strSQL = &quot;UPDATE tblTermine &quot; _\r\n    &amp; &quot;SET Spaltenzahl = &quot; &amp; -1 * intBereichSpaltenMax _\r\n    &amp; &quot;, Bereich = &quot; &amp; intAktuellerBereich _\r\n    &amp; &quot; WHERE Startzeit &gt;= &quot; &amp; ISODatum(datBereichStart) _\r\n    &amp; &quot; AND Endzeit &lt;= &quot; &amp; ISODatum(datBereichEnde) _\r\n    &amp; &quot; AND Termindatum = &quot; &amp; ISODatum(rst!Termindatum)\r\n    db.Execute strSQL, dbFailOnError\r\n    datTermindatum = rst!Termindatum\r\nElseIf intBereichVorher = 0 And rst!InBereich &lt; 0 Then\r\n datBereichStart = DateAdd(&quot;n&quot;, -1, rst!Zeit)\r\n    intBereichSpaltenMax = 0\r\nEnd If\r\nIf intBereichSpaltenMax &gt; rst!InBereich Then\r\n intBereichSpaltenMax = rst!InBereich\r\nEnd If\r\nintBereichVorher = rst!InBereich\r\nrst.MoveNext\r\nLoop\r\nFor i = 1 To intAktuellerBereich\r\nSet rst = db.OpenRecordset(&quot;SELECT * FROM qryTermine &quot; _\r\n&amp; &quot;WHERE Bereich = &quot; &amp; i &amp; &quot; ORDER BY Termindatum ASC, &quot; _\r\n&amp; &quot;Startzeit ASC, Endzeit DESC&quot;, dbOpenDynaset)\r\nIf Not rst.EOF Then\r\n rst.Edit\r\n    rst!Spalte = 1\r\n    rst.Update\r\n    rst.MoveNext\r\n    Do While Not rst.EOF\r\n        For intSpalte = 1 To rst!Spaltenzahl\r\n            If IsNull(DLookup(&quot;ID&quot;, &quot;qryTermine&quot;, _\r\n            &amp; &quot;Spalte = &quot; &amp; intSpalte &amp; &quot; AND Endzeit1 &gt; &quot; _\r\n            &amp; ISODatum(rst!Startzeit))) Then\r\n            rst.Edit\r\n            rst!Spalte = intSpalte\r\n            rst.Update\r\n        End If\r\n    Next intSpalte\r\n    rst.MoveNext\r\nLoop\r\nEnd If\r\nNext i\r\nEnd Sub<\/pre>\n<p>Die Routine durchl&auml;uft zun&auml;chst alle Datens&auml;tze der soeben beschriebenen Abfrage <b>qryZeitSpaltenanzahl<\/b>. Der Wert einer tempor&auml;ren Variablen namens <b>intAktuellerBereich <\/b>ist beim Start <b>0 <\/b>und wird dann jeweils auf den Wert von <b>intBereich <\/b>gesetzt &#8211; also entweder <b>0 <\/b>oder einen von der Anzahl der gleichzeitigen Termine abh&auml;ngigen negativen Wert.<\/p>\n<p>Dies hat den Hintergrund, dass bei jedem Durchlauf gepr&uuml;ft werden soll, ob entweder die Anzahl der Termine in der vorherigen Minute gleich 0 war und nun h&ouml;her ist oder ob es vorher einen oder mehrere Termine gab und jetzt keinen mehr.<\/p>\n<p>Solange kein Bereichs&uuml;bergang eines oder mehrerer Termine gefunden wird, pr&uuml;ft die Routine jeweils, ob es in der aktuellen Minute mehr Termine gibt, als es maximal in den bisherigen Minuten des aktuellen Bereichs gab.<\/p>\n<p>Dies dient dazu, die Anzahl der Spalten f&uuml;r diesen Bereich zu ermitteln. Erst wenn die Anzahl der aktuellen Termine einer Minute 0 ist, erkennt die Routine einen Bereichswechsel und schreibt die maximale Terminanzahl dieses Bereichs in das Feld <b>Spaltenzahl <\/b>und eine laufende Nummer f&uuml;r den Bereich in das Feld <b>Bereich <\/b>der Tabelle <b>tblTermine<\/b>. Dies geschieht f&uuml;r alle Eintr&auml;ge der Abfrage <b>qryZeitSpaltenanzahl<\/b>.<\/p>\n<p>Nun fehlt noch die Ermittlung der Spalte, in welche der Bericht die einzelnen Termine einf&uuml;gen soll. Dies geschieht innerhalb einer <b>For&#8230;Next<\/b>-Schleife f&uuml;r jeden der zuvor ermittelten Bereiche. Innerhalb dieser Schleife &ouml;ffnet die Routine ein Recordset, das alle Termine des aktuellen Bereichs enth&auml;lt &#8211; und zwar in chronologischer Reihenfolge.<\/p>\n<p>Der erste Termin geh&ouml;rt zweifelsohne in die erste Spalte, was auch direkt durch Eintragen der Zahl <b>1<\/b> in das Feld <b>Spalte <\/b>des entsprechenden Datensatzes manifestiert wird. Die &uuml;brigen werden in einer <b>Do While<\/b>-Schleife durchlaufen.<\/p>\n<p>Innerhalb dieser Schleife durchl&auml;uft eine weitere <b>For&#8230;Next<\/b>-Schleife alle Spalten dieses Bereichs und pr&uuml;ft, ob in der aktuellen Spalte schon ein Termin liegt, der sich mit dem aktuellen Termin der <b>Do While<\/b>-Schleife &uuml;berschneidet. Falls dies der Fall ist, pr&uuml;ft die Routine die n&auml;chste Spalte und so weiter, bis eine freie Spalte gefunden wurde. Auch hier wird die Spalte wieder in das Feld <b>Spalte <\/b>des aktuellen Datensatzes der Tabelle <b>tblTermine <\/b>eingetragen.<\/p>\n<p>Dieses Spiel wiederholt sich so lange, bis alle Termine mit Bereich, Spaltennummer und Spaltenzahl ausgestattet sind. In einem einfachen Fall sieht dies dann wie in Bild 13 aus.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_02\/Termine-web-images\/pic013_opt.jpeg\" alt=\"pic013.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 13: Termindatens&auml;tze mit den Informationen, die zur Anzeige in einem mehrspaltigen Kalenderbericht n&ouml;tig sind<\/span><\/b><\/p>\n<p><b>Termine in den Bericht bringen<\/b><\/p>\n<p>Die Termine m&uuml;ssen Sie nun nur noch im Bericht unterbringen. Dazu brauchen Sie noch zwei weitere Abfragen. Die erste, <b>qryRptTermineMehrspaltig<\/b>, f&uuml;hrt die Termine aus <b>tblTermine <\/b>mit den Farbbezeichnungen aus der Tabelle <b>tblFarben <\/b>zusammen (siehe Bild 14).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_02\/Termine-web-images\/pic014_opt.jpeg\" alt=\"pic014.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 14: Diese Abfrage f&uuml;hrt Termine und Farben zusammen.<\/span><\/b><\/p>\n<p>Nun m&uuml;ssen wir die Termine noch in eine Form &uuml;berf&uuml;hren, die sie als Datenherkunft f&uuml;r den Terminbericht verwendbar macht. Dazu stellen Sie einfach eine weitere Abfrage zusammen, welche die zuvor erstellte Abfrage mit der Tabelle <b>tblKalenderdaten <\/b>zusammenf&uuml;hrt. Zwischen dem Feld <b>Kalenderdatum <\/b>der Tabelle <b>tblKalenderdaten <\/b>und dem Feld <b>Termindatum <\/b>der Abfrage <b>qryRptTermineMehrspaltig <\/b>stellen Sie eine Beziehung her, die alle Datens&auml;tze der Tabelle <b>tblKalenderdaten<\/b>, aber nur diejenigen der Tabelle <b>qryRptTermineMehrspaltig <\/b>enth&auml;lt, deren Termindatum mit dem Kalenderdatum des aktuellen Datensatzes zusammenh&auml;ngt (siehe Bild 15).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_02\/Termine-web-images\/pic015_opt.jpeg\" alt=\"pic015.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 15: Zusammenf&uuml;hren von Terminen und Kalenderdaten im Entwurf &#8230;<\/span><\/b><\/p>\n<p>Die Datenblattansicht aus Bild 16 zeigt das Ergebnis dieser Abfrage: Es sind alle Datumsangaben enthalten, egal ob dort ein Termin stattfindet oder nicht. Wenn mehrere Termine an einem Datum stattfinden, wird dieses in Form der entsprechenden Anzahl Datens&auml;tze realisiert.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_02\/Termine-web-images\/pic016_opt.jpeg\" alt=\"pic016.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 16: &#8230; und in der Datenblattansicht<\/span><\/b><\/p>\n<p>Diese Abfrage weisen Sie dem bereits vorbehandelten Bericht statt der bisherigen Datenherkunft <b>tblKalenderdaten <\/b>zu. Das bereits im Seitenkopf enthaltene Feld <b>Kalenderdatum <\/b>k&ouml;nnen Sie dort belassen, da es ja auch in der neuen Datenherkunft enthalten ist.<\/p>\n<p>Die &uuml;brigen sieben Felder ziehen Sie einfach aus der Feldliste in den Detailbereich (siehe Bild 17). Stellen Sie die Eigenschaft <b>Sichtbar <\/b>der hinzugef&uuml;gten Steuerelemente auf den Wert <b>Nein <\/b>ein.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_02\/Termine-web-images\/pic017_opt.jpeg\" alt=\"pic017.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 17: Der Bericht sieht in der Entwurfsansicht recht banal aus. Die Steuerelemente sollen alle unsichtbar sein.<\/span><\/b><\/p>\n<p>Das Eintragen &uuml;bernimmt die Routine <b>TermineEinfuegen<\/b> (Listing 4). Die Routine ermittelt wiederum zun&auml;chst die Abmessungen des Detailbereichs und kontrolliert, ob der aktuelle Datensatz einen konkreten Termin enth&auml;lt (es k&ouml;nnte ja auch einfach ein Datum sein) und f&uuml;gt nur dann den Termin hinzu. Dabei werden die Koordinaten der dazu verwendeten und mit der <b>Line<\/b>-Methode gezeichneten Rechtecke &uuml;ber die aktuellen Ma&szlig;e des Berichts sowie die Anzahl der Spalten und die L&auml;nge des Termins ermittelt.<\/p>\n<p class=\"kastentabelleheader\">Listing 4: Eintragen der Termine in den Bericht<\/p>\n<pre>Private Sub TermineEinfuegen()\r\n    Dim lngColor As Long\r\n    Dim sngRepX1 As Single, sngRepX2 As Single\r\n    Dim sngRepY1 As Single, sngRepY2 As Single\r\n    Dim strTermin As String\r\n    Dim sngDateX1 As Single, sngDateX2 As Single\r\n    Dim sngDateY1 As Single, sngDateY2 As Single\r\n    Dim sngDateX1A As Single, sngDateY2A As Single\r\n    Dim intSpalte As Integer, intSpaltenzahl As Integer\r\n    Dim sngGesamtbreite As Single, sngTextOffset As Single\r\n    Dim bolTooLong As Boolean\r\n    Dim sngMargin As Single\r\n    sngMargin = 5\r\n    With Me\r\n    .ScaleMode = 3\r\n    sngRepY1 = .ScaleTop\r\n    sngRepX1 = .ScaleLeft\r\n    sngRepX2 = .ScaleWidth\r\n    sngRepY2 = .ScaleHeight\r\n    If Not IsNull(Me!Termindatum) Then\r\n        &apos;Termine einf&uuml;gen\r\n        lngColor = Me.Farbwert\r\n        intSpalte = Me!Spalte\r\n        intSpaltenzahl = Me!Spaltenzahl\r\n        sngGesamtbreite = sngRepX2 - sngRepX1 - 200\r\n        sngDateX1 = 200 + (intSpalte - 1) * sngGesamtbreite _\r\n        \/ intSpaltenzahl\r\n        sngDateX2 = sngDateX1 + sngGesamtbreite \/ intSpaltenzahl\r\n        sngDateY1 = sngRepY1 + CSng(Me.Startzeit) * sngRepY2\r\n        sngDateY2 = sngRepY2 * CSng(Me.Endzeit)\r\n        Me.Line (sngDateX1 + sngMargin, sngDateY1 + sngMargin) _\r\n        -(sngDateX2 - sngMargin, sngDateY2 - sngMargin), _\r\n        lngColor, BF\r\n        lngColor = RGB(200, 200, 200)\r\n        Me.Line (sngDateX1, sngDateY1)-(sngDateX2, sngDateY2), _\r\n        lngColor, B\r\n        If Me.Endzeit &lt; Me.Endzeit1 Then\r\n            lngColor = Me.Farbwert\r\n            sngDateY2A = sngRepY2 * CSng(Me.Endzeit1)\r\n            sngDateX1A = sngDateX1 + 30\r\n            Me.Line (sngDateX1A + sngMargin, sngDateY1 + _\r\n            sngMargin)-(sngDateX2 - sngMargin, sngDateY2A _\r\n            - sngMargin), lngColor, BF\r\n            lngColor = RGB(200, 200, 200)\r\n            Me.Line (sngDateX1A, sngDateY1)-(sngDateX2, _\r\n            sngDateY2A), lngColor, B\r\n            sngTextOffset = 30\r\n        Else\r\n            sngTextOffset = 0\r\n        End If\r\n        Me.FontSize = 8\r\n        Me.FontBold = True\r\n        If Helligkeit(Me.Farbwert) &gt; &amp;H180 Then\r\n            Me.ForeColor = &amp;H0\r\n        Else\r\n            Me.ForeColor = &amp;HFFFFFF\r\n        End If\r\n        Me.CurrentX = sngDateX1 + 20 + sngTextOffset\r\n        Me.CurrentY = sngRepY1 + CSng(!Startzeit) * sngRepY2 + 20\r\n        strTermin = Me!Termin\r\n        Do While Me.TextWidth(strTermin) &gt; _\r\n            sngDateX2 - sngDateX1 - sngTextOffset\r\n            bolTooLong = True\r\n            strTermin = Left(strTermin, Len(strTermin) - 1)\r\n        Loop\r\n        If bolTooLong = True Then\r\n            strTermin = Left(strTermin, Len(strTermin) - 4) &amp; &quot;...&quot;\r\n        End If\r\n        Me.Print strTermin\r\n        Me.FontSize = 6\r\n        Me.CurrentX = sngDateX1 + 20 + sngTextOffset\r\n        Me.Print !Startzeit &amp; &quot; - &quot; &amp; !Endzeit\r\n        MoveLayout = False\r\n    Else\r\n        MoveLayout = True\r\n    End If\r\n    End With\r\n    End Sub<\/pre>\n<p>Wenn der Termin k&uuml;rzer als eine Stunde ist, dann kommt das bereits weiter oben besprochene Feld <b>Endzeit1 <\/b>der Datenherkunft zum Tragen, dass Terminen von einer Dauer unter einer Stunde eine neue Endzeit zuweist, die den Termin auf die Dauer einer Stunde verl&auml;ngert. Ist das der Fall, liegt also der Wert von <b>Endzeit1 <\/b>hinter Endzeit, zeichnet die Routine noch ein Rechteck &uuml;ber das bereits vorhandene Rechteck f&uuml;r den Termin. Dieses ist auf der linken Seite ein wenig schmaler, sodass dort eine kleine Zunge herausschaut, welche die eigentliche Dauer des Termins grafisch anzeigt, wie es auch unter Outlook geschieht (siehe Bild 18).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_02\/Termine-web-images\/pic018_opt.jpeg\" alt=\"pic018.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 18: Die L&auml;nge von Terminen, die weniger als eine Stunde dauern, wird durch eine kleine Zunge auf der linken Seite dargestellt.<\/span><\/b><\/p>\n<p>Der eigentliche K&ouml;rper des Termins ist dann dennoch hoch genug, um die Anzeige der Terminbezeichnung und der Dauer zu gew&auml;hrleisten.<\/p>\n<p>Nach dem Zeichnen der K&auml;sten f&uuml;r die grafische Darstellung sind eben jene Texte an der Reihe. Da der Raum f&uuml;r die Terminbezeichnung in Abh&auml;ngigkeit von der Anzahl der Spalten recht knapp werden kann und der Text nicht &uuml;ber den Rand der Terminbox hinaus gezeichnet werden soll, pr&uuml;ft die Funktion <b>TextWidth <\/b>des <b>Report<\/b>-Objekts die zu erwartende L&auml;nge der Terminbezeichnung und k&uuml;rzt diese jeweils um einen Buchstaben, bis der Betreff in das K&auml;stchen passt. Ist das erledigt, werden nochmals vier Zeichen abgeschnitten und durch drei Punkte (&#8230;) ersetzt, um die K&uuml;rzung zu verdeutlichen. Darunter schreibt die Routine schlie&szlig;lich noch die Dauer des Termins.<\/p>\n<p><b>Termin f&uuml;r Termin<\/b><\/p>\n<p>Was aber geschieht, wenn ein Tag nicht nur einen, sondern mehrere Termine hat Eigentlich m&uuml;sste doch dann jeweils eine neue Seite mit dem gleichen Datum, aber dem n&auml;chsten Termin angelegt werden So w&auml;re es auch, wenn die Routine <b>TermineEinfuegen <\/b>nicht am Ende den Wert der Eigenschaft <b>MoveLayout <\/b>des Berichts einstellen w&uuml;rde. Diese Eigenschaft legt fest, ob der n&auml;chste Datensatz im n&auml;chsten Detailbereich ausgegeben werden soll, was der Normalzustand ist, oder ob die Daten im gleichen Detailbereich erscheinen sollen.<\/p>\n<p>Und genau das ist es, was diesen Bericht &uuml;berhaupt m&ouml;glich macht: Immerhin sind die einzelnen Detailbereiche eines Berichts unter Access naturgem&auml;&szlig; untereinander angeordnet, was einer nebenl&auml;ufigen Anordnung von Terminen entgegenst&uuml;nde.<\/p>\n<p>Also stellt die Routine <b>MoveLayout <\/b>auf <b>False<\/b>, wenn der aktuelle Datensatz einen Termin enth&auml;lt, und verhindert so den Sprung nach unten zum n&auml;chsten Detailbereich.<\/p>\n<p>Nun gibt es noch ein Problem: Das Raster zur Anzeige der Uhrzeiten und der Linien zu ihrer optischen Hervorhebung wird aktuell noch mit jedem Datensatz gedruckt.<\/p>\n<p>Das ist nicht schlimm, wenn ein Tag nur einen oder keinen Termin enth&auml;lt, weil die Routine <b>UhrzeitrasterAnlegen <\/b>dann ja auch nur einmal aufgerufen wird.<\/p>\n<p>Wenn ein Tag allerdings zwei oder mehr Termine enth&auml;lt, dann wird das Raster entsprechend der Anzahl der Termine gedruckt, was den gleichen Effekt hat, als wenn man die Uhrzeiten und Linien fett drucken w&uuml;rde.<\/p>\n<p>Damit dies nicht geschieht, deklarieren Sie im Berichtsmodul eine Variable namens <b>bolRaster<\/b>:<\/p>\n<pre>Dim bolRaster As Boolean<\/pre>\n<p>Diese hat standardm&auml;&szlig;ig den Wert <b>False<\/b>, sodass Sie in der Routine, die durch das Ereignis <b>Beim Drucken <\/b>des Berichts ausgel&ouml;st wird, genau dann das Raster anlegen sollten, wenn <b>bolRaster <\/b>den Wert <b>False <\/b>hat: <\/p>\n<pre>Private Sub Detailbereich_Print(Cancel As _\r\n    Integer, PrintCount As Integer)\r\n    If bolRaster = False Then\r\n        UhrzeitrasterAnlegen\r\n        bolRaster = True\r\n    End If\r\n    TermineEinfuegen\r\n    End Sub<\/pre>\n<p>Danach wird <b>bolRaster <\/b>auf <b>True <\/b>eingestellt, damit beim n&auml;chsten Termin nicht wieder das komplette Raster ausgegeben wird.<\/p>\n<p>Damit dies nach der Abarbeitung aller Termine einer Seite auf der folgenden Seite wieder geschieht, legen Sie noch eine weitere Routine an, die durch das Ereignis <b>Beim Formatieren <\/b>des Seitenkopfes ausgel&ouml;st wird. Diese Routine stellt <b>bolRaster <\/b>wieder auf <b>False <\/b>ein, damit das Raster im n&auml;chsten Detailbereich wieder gedruckt wird:<\/p>\n<pre>Private Sub Seitenkopfbereich_Format(Cancel As Integer, FormatCount As Integer)\r\n    bolRaster = False\r\n    End Sub<\/pre>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Die hier vorgestellte L&ouml;sung ist ein Beispiel daf&uuml;r, was man mit Berichten alles anstellen kann. Auf die gleiche Weise k&ouml;nnen Sie theoretisch mit vielen anderen Daten verfahren, die Sie bisher aufgrund der Einschr&auml;nkungen durch die vertikale Anordnung der Berichtsbereiche nicht wie gew&uuml;nscht ausgeben konnten.<\/p>\n<p>Der in diesem Beitrag beschriebene Terminbericht kann ebenfalls noch erweitert werden. Denkbar w&auml;ren etwa das vorherige Festlegen des Zeitraums, der pro Tag angezeigt werden soll. Auch k&ouml;nnte man die Terminboxen mit weiterem Schnickschnack wie einem schattierten Hintergrund versehen.<\/p>\n<p>Vielleicht m&ouml;chten Sie ja auch dem Berichtskopf noch eine &Uuml;bersicht des aktuellen Monats hinzuf&uuml;gen, wie es in Outlook der Fall ist<\/p>\n<p>Eine andere Ansicht der Termine ist nat&uuml;rlich auch m&ouml;glich. So k&ouml;nnten Sie die Termine f&uuml;r eine Woche nebeneinander anzeigen, wobei die Darstellung mehrerer Termine am gleichen Tag nebeneinander wohl nicht sinnvoll w&auml;re.<\/p>\n<p>Haben Sie weitere Ideen f&uuml;r Berichte, die wir in <b>Access im Unternehmen <\/b>vorstellen sollen Dann teilen Sie uns diese unter der E-Mail-Adresse <b>info@access-im-unternehmen.de <\/b>mit.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Termine.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{1E772CEC-9103-47D7-BAC8-99BD5A78446D}\/aiu_660.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Was die Darstellung von Terminen und Kalendern angeht, ist Outlook der Platzhirsch. Es gibt kaum eine Ansicht, die sich damit nicht verwirklichen l&auml;sst. Oder doch Nun: Ihre Kunden oder Sie selbst haben bestimmt Ideen, die selbst Outlooks Berichts-Engine an die Leistungsgrenze bringen. Und hier kommt Access ins Spiel: Verwenden Sie Berichte und bringen Sie Access dazu, Ihre Termine ganz nach Wunsch anzuzeigen.<\/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":[66022009,662009,44000024],"tags":[],"class_list":["post-55000660","post","type-post","status-publish","format-standard","hentry","category-66022009","category-662009","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>Termine in Berichten darstellen - 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\/Termine_in_Berichten_darstellen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Termine in Berichten darstellen\" \/>\n<meta property=\"og:description\" content=\"Was die Darstellung von Terminen und Kalendern angeht, ist Outlook der Platzhirsch. Es gibt kaum eine Ansicht, die sich damit nicht verwirklichen l&auml;sst. Oder doch Nun: Ihre Kunden oder Sie selbst haben bestimmt Ideen, die selbst Outlooks Berichts-Engine an die Leistungsgrenze bringen. Und hier kommt Access ins Spiel: Verwenden Sie Berichte und bringen Sie Access dazu, Ihre Termine ganz nach Wunsch anzuzeigen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Termine_in_Berichten_darstellen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:22:31+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg05.met.vgwort.de\/na\/9b54227438dd4d82bcee16d32e34304a\" \/>\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=\"25\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Termine_in_Berichten_darstellen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Termine_in_Berichten_darstellen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Termine in Berichten darstellen\",\"datePublished\":\"2020-05-22T22:22:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Termine_in_Berichten_darstellen\\\/\"},\"wordCount\":4261,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Termine_in_Berichten_darstellen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/9b54227438dd4d82bcee16d32e34304a\",\"articleSection\":[\"2\\\/2009\",\"2009\",\"Berichte und Reporting\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Termine_in_Berichten_darstellen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Termine_in_Berichten_darstellen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Termine_in_Berichten_darstellen\\\/\",\"name\":\"Termine in Berichten darstellen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Termine_in_Berichten_darstellen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Termine_in_Berichten_darstellen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/9b54227438dd4d82bcee16d32e34304a\",\"datePublished\":\"2020-05-22T22:22:31+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Termine_in_Berichten_darstellen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Termine_in_Berichten_darstellen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Termine_in_Berichten_darstellen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/9b54227438dd4d82bcee16d32e34304a\",\"contentUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/9b54227438dd4d82bcee16d32e34304a\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Termine_in_Berichten_darstellen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Termine in Berichten darstellen\"}]},{\"@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":"Termine in Berichten darstellen - 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\/Termine_in_Berichten_darstellen\/","og_locale":"de_DE","og_type":"article","og_title":"Termine in Berichten darstellen","og_description":"Was die Darstellung von Terminen und Kalendern angeht, ist Outlook der Platzhirsch. Es gibt kaum eine Ansicht, die sich damit nicht verwirklichen l&auml;sst. Oder doch Nun: Ihre Kunden oder Sie selbst haben bestimmt Ideen, die selbst Outlooks Berichts-Engine an die Leistungsgrenze bringen. Und hier kommt Access ins Spiel: Verwenden Sie Berichte und bringen Sie Access dazu, Ihre Termine ganz nach Wunsch anzuzeigen.","og_url":"https:\/\/access-im-unternehmen.de\/Termine_in_Berichten_darstellen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:22:31+00:00","og_image":[{"url":"http:\/\/vg05.met.vgwort.de\/na\/9b54227438dd4d82bcee16d32e34304a","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"25\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Termine_in_Berichten_darstellen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Termine_in_Berichten_darstellen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Termine in Berichten darstellen","datePublished":"2020-05-22T22:22:31+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Termine_in_Berichten_darstellen\/"},"wordCount":4261,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Termine_in_Berichten_darstellen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/9b54227438dd4d82bcee16d32e34304a","articleSection":["2\/2009","2009","Berichte und Reporting"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Termine_in_Berichten_darstellen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Termine_in_Berichten_darstellen\/","url":"https:\/\/access-im-unternehmen.de\/Termine_in_Berichten_darstellen\/","name":"Termine in Berichten darstellen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Termine_in_Berichten_darstellen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Termine_in_Berichten_darstellen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/9b54227438dd4d82bcee16d32e34304a","datePublished":"2020-05-22T22:22:31+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Termine_in_Berichten_darstellen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Termine_in_Berichten_darstellen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Termine_in_Berichten_darstellen\/#primaryimage","url":"http:\/\/vg05.met.vgwort.de\/na\/9b54227438dd4d82bcee16d32e34304a","contentUrl":"http:\/\/vg05.met.vgwort.de\/na\/9b54227438dd4d82bcee16d32e34304a"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Termine_in_Berichten_darstellen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Termine in Berichten darstellen"}]},{"@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\/55000660","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=55000660"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000660\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000660"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000660"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000660"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}