{"id":55000789,"date":"2011-08-01T00:00:00","date_gmt":"2020-05-22T21:57:08","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=789"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Terminserien","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Terminserien\/","title":{"rendered":"Terminserien"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/6bd06bdbbd484d768d95889befaacc53\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Zum Eingeben von Terminen gibt es mittlerweile verschiedene eingebaute und zus&auml;tzliche Techniken. Aber was ist, wenn der Benutzer in einer Anwendung gleich mehrere Termine anlegen m&ouml;chte &#8211; beispielsweise, um gleich f&uuml;r ein ganzes Jahr eine Erinnerung an die Umsatzsteuervoranmeldung zu speichern oder um die Geburtstage seiner Bekannten in seiner Termindatenbank anzulegen Hier w&uuml;rde ein flexibel einsetzbares Tool eine Menge Arbeit sparen. Wie Sie solch ein Tool programmieren, erfahren Sie in diesem Beitrag.<\/b><\/p>\n<p>Der konkrete Anlass f&uuml;r die Erstellung der im vorliegenden Beitrag beschriebenen L&ouml;sung ist die Aufgabenmanagement-Datenbank aus dem Beitrag <b>Tomatengetriebene Programmierung <\/b>(<b>www.access-im-unternehmen.de\/791<\/b>). Dort soll der Benutzer gleich eine ganze Reihe von t&auml;glich, w&ouml;chentlich, monatlich oder j&auml;hrlich wiederkehrenden Terminen anlegen k&ouml;nnen.<\/p>\n<p>Welche Anforderung gibt es an eine solche L&ouml;sung Sie sollte eine Benutzeroberfl&auml;che bieten, die dem Benutzer das Anlegen der gew&uuml;nschten Termine erleichtert.<\/p>\n<p>Und sie sollte die Termine in einem Format liefern, das sich leicht weiterverarbeiten l&auml;sst. Am leichtgewichtigsten scheint hier ein Array zu sein, das einfach nur die ermittelten Termindaten enth&auml;lt.<\/p>\n<p>Die Anforderungen an die Ermittlung der Termine sind schon vielf&auml;ltiger. Die erste Auswahl betrifft die Art der Terminserie. Die vorliegende L&ouml;sung soll diese Varianten abdecken:<\/p>\n<ul>\n<li class=\"aufz-hlung\">t&auml;gliche Termine<\/li>\n<li class=\"aufz-hlung\">w&ouml;chentliche Termine<\/li>\n<li class=\"aufz-hlung\">monatliche Termine<\/li>\n<li class=\"aufz-hlung\">j&auml;hrliche Termine<\/li>\n<\/ul>\n<p>Eine weitere Option betrifft Feiertage und Wochenenden. Sollen diese einfach als Termine zur&uuml;ckgegeben werden k&ouml;nnen oder soll die L&ouml;sung den vorherigen oder den folgenden Tag liefern, wenn der eigentlich gew&uuml;nschte Termin auf einen Feiertag oder ein Wochenende f&auml;llt (wobei Wochenende noch auf Samstag und Sonntag aufzuteilen ist)<\/p>\n<p>Und was geschieht, wenn der Benutzer als monatliches Datum den 31. Tag ausw&auml;hlt Soll dann der vorherige oder der folgende Tag zur&uuml;ckgegeben werden, wenn der jeweilige Monat keine 31 Tage hat<\/p>\n<p>Schlie&szlig;lich w&auml;re noch zu kl&auml;ren, ob die Termine innerhalb eines bestimmten Zeitraums gefunden werden sollen (etwa vom 1. Januar 2012 bis 30. Juni 2012) oder ob einfach eine bestimmte Anzahl an Terminen ermittelt werden soll.<\/p>\n<p>Dies alles deckt das Formular aus Bild 1 ab.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_04\/Terminserien-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Formular zur Definition von Terminserien<\/span><\/b><\/p>\n<p>Eine Rahmenbedingung k&ouml;nnen wir jedenfalls schon festlegen: Der Benutzer soll schlicht eine Funktion namens <b>Terminserie <\/b>aufrufen und von dieser ein Array mit den entsprechenden Datumsangaben zur&uuml;ckerhalten.<\/p>\n<p><b>Wenn Termine auf ung&uuml;nstige Daten fallen<\/b><\/p>\n<p>Je nach der Art der zu ermittelnden Terminserie kann es sein, dass die L&ouml;sung Termine nicht auf bestimmte Tage setzen kann, beispielsweise bei Samstagen, Sonntagen oder Feiertagen oder wenn der Benutzer etwa den 31. Tag eines Monats als monatlichen oder j&auml;hrlichen Termin angibt.<\/p>\n<p>Bei ung&uuml;ltigen Terminen wie etwa dem 31. Februar soll die Anwendung den letzten Tag des jeweiligen Monats zur&uuml;ckliefern.<\/p>\n<p>Die Vorgehensweise f&uuml;r Samstage, Sonntage und Feiertage hingegen behandelt der untere Teil des Formulars. Eigentlich sollte die L&ouml;sung maximale Flexibilit&auml;t bieten, indem Sie f&uuml;r Samstage, Sonntage und Feiertage separat eine der folgenden Aktionen ausw&auml;hlen k&ouml;nnen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Termin auf den vorherigen Tag verschieben<\/li>\n<li class=\"aufz-hlung\">Termin auf den folgenden Tag verschieben<\/li>\n<li class=\"aufz-hlung\">Termin komplett stornieren<\/li>\n<\/ul>\n<p>Wenn Sie aber nun festlegen, dass Termine vom Sonntag auf den folgenden Tag verschoben werden, und angeben, dass Termine, die auf Feiertage fallen, ignoriert werden sollen, haben Sie ein Problem, wenn der Tag nach dem Sonntag zuf&auml;llig ein Feiertag ist. Der zu verschiebende Sonntagstermin w&uuml;rde dann n&auml;mlich auf den Feiertag verschoben werden und somit wegfallen.<\/p>\n<p>Also haben wir eine etwas weniger flexible Variante gew&auml;hlt: Der Benutzer legt dort zun&auml;chst fest, ob er Termine, die auf Samstage, Sonntage und\/oder Feiertage fallen, gesondert behandeln m&ouml;chte. F&uuml;r alle gew&auml;hlten F&auml;lle gibt er dann an, ob die Termine auf den vorherigen oder den folgenden Tag fallen oder ob diese ignoriert werden sollen.<\/p>\n<p><b>Formular zur Eingabe der Datumsinformationen<\/b><\/p>\n<p>Bild 2 zeigt den Entwurf des Formulars zur Eingabe der Parameter f&uuml;r die Erstellung der Terminserie. Im oberen Bereich w&auml;hlt der Benutzer zun&auml;chst die Art der Terminserie aus. Die dort verwendete Optionsgruppe hei&szlig;t <b>ogrSerienart<\/b>. Die Optionen erhalten von oben bis unten die Werte <b>1 <\/b>bis <b>4<\/b>.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_04\/Terminserien-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Entwurf des einzigen Formulars der L&ouml;sung<\/span><\/b><\/p>\n<p>Die Optionsgruppe hat standardm&auml;&szlig;ig den Wert <b>1 <\/b>(<b>T&auml;glich<\/b>). Bis der Benutzer eine andere Option ausw&auml;hlt, sollen die neben den Optionen angezeigten Steuerelemente zur Eingabe weiterer Parameter deaktiviert sein. Erst bei &auml;nderung des Wertes von <b>ogrSerienart <\/b>werden die entsprechenden Steuerelemente aktiviert. Daf&uuml;r sorgt die Ereignisprozedur, die durch das Ereignis <b>Nach Aktualisierung <\/b>der Optionsgruppe ausgel&ouml;st wird:<\/p>\n<pre>Private Sub ogrSerienart_AfterUpdate()\r\n    Me!ogrWoechentlich.Enabled =\r\n    Me!ogrSerienart = 2\r\n    Me!txtTag.Enabled = Me!ogrSerienart = 3\r\n    Me!txtTagJaehrlich.Enabled =\r\n    Me!ogrSerienart = 4\r\n    Me!txtMonatJaehrlich.Enabled =\r\n    Me!ogrSerienart = 4\r\nEnd Sub<\/pre>\n<p>Dies ist eine etwas platzsparende Schreibweise, deren Funktion m&ouml;glicherweise erst auf den zweiten Blick deutlich wird. Die folgende Zeile etwa sorgt daf&uuml;r, dass <b>ogrWoechentlich <\/b>aktiviert wird, wenn die Optionsgruppe <b>ogrSerienart <\/b>den Wert <b>2 <\/b>hat (dann liefert <b>Me!ogrSerienart = 2 <\/b>den Wert <b>True<\/b>, was dazu f&uuml;hrt, dass auch die <b>Enabled<\/b>-Eigenschaft von <b>ogrWoechentlich <\/b>auf <b>True <\/b>eingestellt wird): <\/p>\n<pre>Me!ogrWoechentlich.Enabled = Me!ogrSerienart = 2<\/pre>\n<p><b>Festlegen des Datumsbereichs<\/b><\/p>\n<p>Beim Laden des Formulars werden die beiden Textfelder zur Eingabe des Datumsbereichs, <b>txtStart<\/b> und <b>txtEnde<\/b>, mit dem aktuellen Datum best&uuml;ckt.<\/p>\n<p>Au&szlig;erdem sollen diese mit den Funktionen zur einfachen Datumseingabe, wie im Beitrag <b>Flexible Datumstextfelder <\/b>(<b>www.access-im-unternehmen.de\/690<\/b>) beschrieben, best&uuml;ckt werden. Dazu f&uuml;gen Sie beiden Klassen <b>clsDateboxes <\/b>und <b>clsDatebox <\/b>aus der entsprechenden Beispieldatenbank hinzu. Im Kopf des Klassenmoduls des Formulars wird eine Variable zum Speichern der Referenz auf diese Klasse deklariert:<\/p>\n<pre>Dim objDateboxes As clsDateboxes<\/pre>\n<p>In der Prozedur, die durch das Ereignis <b>Beim Laden <\/b>des Formulars ausgel&ouml;st wird, wird eine entsprechende Instanz erzeugt. Dieser weisen Sie auch gleich die beiden Textfelder <b>txtStart <\/b>und <b>txtEnde <\/b>zu:<\/p>\n<pre>Private Sub Form_Load()\r\n    Me!txtStart = Date\r\n    Me!txtEnde = Date\r\n    Set objDateboxes = New clsDateboxes\r\n    With objDateboxes\r\n        .AddDatebox Me!txtStart\r\n        .AddDatebox Me!txtEnde\r\n    End With\r\nEnd Sub<\/pre>\n<p><b>Aufruf des Formulars<\/b><\/p>\n<p>Den Einstiegspunkt f&uuml;r die L&ouml;sung zum Erstellen von Terminserien bietet die VBA-Prozedur <b>Terminserie<\/b>, die Sie im Modul <b>mdlTerminserie <\/b>finden. Diese Prozedur k&ouml;nnen Sie von beliebigen anderen Modulen aus aufrufen. Sie &ouml;ffnet das Formular <b>frmTerminserie<\/b>, erm&ouml;glicht dem Benutzer die Eingabe der gew&uuml;nschten Parameter und liest nach einem Klick auf die <b>OK<\/b>-Schaltfl&auml;che des Formulars die ermittelten Termine aus der &ouml;ffentlichen Variablen <b>Termine <\/b>des Formulars aus.<\/p>\n<pre>Public Function Terminserie() As Variant\r\n    Dim dat() As Date\r\n    DoCmd.OpenForm &quot;frmTerminserie&quot;,\r\n    WindowMode:=acDialog\r\n    If IstFormularGeoeffnet(&quot;frmTerminserie&quot;) Then\r\n        dat = Forms!frmTerminserie.Termine\r\n        DoCmd.Close acForm, &quot;frmTerminserie&quot;\r\n    End If\r\n    Terminserie = dat\r\nEnd Function<\/pre>\n<p>Die Terminliste kommt als Array und kann anschlie&szlig;end entsprechend weiterverarbeitet werden. Wenn Sie die Termine einfach im Direktfenster ausgeben m&ouml;chten, verwenden Sie beispielsweise den folgenden Aufruf:<\/p>\n<pre>Public Sub Beispielaufruf()\r\n    Dim intCount As Integer\r\n    Dim datTermine() As Date\r\n    Dim i As Integer\r\n    datTermine = Terminserie\r\n    On Error Resume Next\r\n    For i = LBound(datTermine) To UBound(datTermine)\r\n        Debug.Print datTermine(i)\r\n    Next i\r\n    If Err.Number = 9 Then\r\n         Debug.Print &quot;Keine Termine&quot;\r\n    End If\r\nEnd Sub<\/pre>\n<p><!--30percent--><\/p>\n<p>Die Funktion ruft die Funktion <b>Terminserie <\/b>auf, die daf&uuml;r sorgt, dass das Formular ge&ouml;ffnet wird und anschlie&szlig;end ein Array mit den gefundenen Daten zur&uuml;ckliefert.<\/p>\n<p>In der folgenden Schleife gibt die Prozedur alle gefundenen Daten im Direktfenster aus. Sollte ein leeres Array zur&uuml;ckgeliefert werden, erzeugt der Zugriff auf die Methode <b>LBound <\/b>einen Fehler &#8211; diesen behandeln wir aber entsprechend mit <b>On Error Resume Next <\/b>und geben einen Hinweis auf das leere Array im Direktfenster aus.<\/p>\n<p><b>Terminserie erstellen<\/b><\/p>\n<p>Es gibt zwei M&ouml;glichkeiten, eine Terminserie zu erstellen. Ein Klick auf die <b>OK<\/b>-Schaltfl&auml;che erstellt eine Terminserie und macht dann das Formular <b>frmTerminserie <\/b>unsichtbar, damit die aufrufende Funktion <b>Terminserie <\/b>die ermittelten Termine auslesen kann. Sie k&ouml;nnen aber auch auf die Schaltfl&auml;che <b>Termine anzeigen <\/b>klicken.<\/p>\n<p>Auch die Prozedur, die durch diese Schaltfl&auml;che ausgel&ouml;st wird, ruft die Funktion <b>Terminserie <\/b>auf. Allerdings zeigt sie die ermittelten Termine gleich in einem Meldungsfenster an.<\/p>\n<p>Auf diese Weise kann der Benutzer vor dem Schlie&szlig;en des Formulars pr&uuml;fen, ob dieses die richtigen Termine zur&uuml;ckliefert (s. Bild 3).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_04\/Terminserien-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Anzeige der gefundenen Termine im Meldungsfenster<\/span><\/b><\/p>\n<p>Die wesentlichen Schritte beim F&uuml;llen des Termin-Arrays erledigt also die Funktion <b>Terminserie<\/b> (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-44-anchor\">Listing 1<\/a><\/span>). Diese Funktion ermittelt die Liste der Termine entsprechend den Einstellungen im Formular und speichert das resultierende Array in einer Variablen, die im Kopf des Moduls deklariert wird:<\/p>\n<p class=\"listingueberschrift\">Listing 1: Diese Prozedur f&uuml;hrt den eigentlichen Suchvorgang durch.<\/p>\n<pre>Private Function TerminserieErstellen() As Variant\r\n    Dim dat As Date\r\n    Dim intCount As Integer\r\n    Dim intTag As Integer\r\n    Dim intMonat As Integer\r\n    Dim db As DAO.Database\r\n    Dim colGueltigeTermine As Collection\r\n    Set db = CurrentDb\r\n    Erase datTermine\r\n    Set colGueltigeTermine = GueltigeTermine(Me!txtStart, Me!txtEnde, 1)\r\n    For dat = Me!txtStart To Me!txtEnde\r\n        Select Case Me!ogrSerienart\r\n            Case 1\r\n                If colGueltigeTermine(CStr(dat)) = True Then\r\n                    TerminHinzufuegen dat, datTermine, intCount\r\n                End If\r\n            Case 2\r\n                If Weekday(dat, vbMonday) = Me!ogrWoechentlich Then\r\n                    TerminVerarbeiten dat, datTermine, intCount, colGueltigeTermine\r\n                End If\r\n            Case 3\r\n                intTag = Nz(Me!txtTag, 0)\r\n                Do While Not IsDate(intTag &amp; &quot;.&quot; &amp; Month(dat) &amp; &quot;.&quot; &amp; Year(dat))\r\n                    intTag = intTag - 1\r\n                Loop\r\n                If DateSerial(Year(dat), Month(dat), intTag) = dat Then\r\n                    TerminVerarbeiten dat, datTermine, intCount, colGueltigeTermine\r\n                End If\r\n            Case 4\r\n                intTag = Nz(Me!txtTagJaehrlich, 0)\r\n                intMonat = Nz(Me!txtMonatJaehrlich, 0)\r\n                Do While Not IsDate(intTag &amp; &quot;.&quot; &amp; intMonat &amp; &quot;.&quot; &amp; Year(dat))\r\n                    intTag = intTag - 1\r\n                Loop\r\n                If DateSerial(Year(dat), intMonat, intTag) = dat Then\r\n                    TerminVerarbeiten dat, datTermine, intCount, colGueltigeTermine\r\n                End If\r\n        End Select\r\n    Next dat\r\n    TerminserieErstellen = datTermine\r\nEnd Function\r\nDim datTermine() As Date<\/pre>\n<p>Diese Array-Variable wird gleich zu Beginn mit der <b>Erase<\/b>-Anweisung geleert. Danach ruft die Routine eine weitere Funktion namens <b>GueltigeTermine <\/b>auf (siehe weiter unten).<\/p>\n<p>Die Funktion <b>GueltigeTermine <\/b>liefert ein <b>Collection<\/b>-Objekt mit allen Datumsangaben f&uuml;r den durch den Benutzer ausgew&auml;hlten Zeitraum zur&uuml;ck.<\/p>\n<p>Das <b>Collection<\/b>-Objekt speichert das Datum als String in der <b>Key<\/b>-Eigenschaft. In der <b>Item<\/b>-Eigenschaft hingegen wird entweder der Wert <b>True <\/b>oder <b>False <\/b>gespeichert &#8211; je nachdem, ob Samstage, Sonntage und\/oder Feiertage bei der Terminfindung ausgeschlossen werden sollen.<\/p>\n<p>Das <b>Collection<\/b>-Objekt enth&auml;lt also beispielsweise solche Werte (<b>Key<\/b>\/<b>Value<\/b>), wobei <b>True <\/b>die m&ouml;glichen Termine kennzeichnet und <b>False <\/b>diejenigen, die wegen Feiertag\/Samstag\/Sonntag je nach Konfiguration im Formular nicht f&uuml;r die Terminserie zur Verf&uuml;gung stehen, zum Beispiel <b>31.12.2011<\/b>\/<b>True<\/b>,<b> 1.1.2011<\/b>\/<b>False<\/b> oder <b>2.1.2012<\/b>\/<b>True<\/b>.<\/p>\n<p>Dann beginnt die Prozedur mit dem Durchlaufen einer Schleife &uuml;ber alle Daten des im Formular angegebenen Zeitraums.<\/p>\n<p>Innerhalb der Schleife wird nach der Art der Terminserie unterschieden, also nach t&auml;glichen, w&ouml;chentlichen, monatlichen oder j&auml;hrlichen Terminen.<\/p>\n<p>Bei den t&auml;glichen Terminen soll einfach f&uuml;r jedes Datum des gew&auml;hlten Zeitraums ein Termin angelegt werden &#8211; mit Ausnahme solcher Termine, die in der Collection <b>colGueltigeTermine <\/b>mit dem Wert <b>False <\/b>gekennzeichnet sind.<\/p>\n<p>Dies wird einfach durch den Ausdruck <b>colGueltigeTermine(CStr(dat)) = True <\/b>gepr&uuml;ft. Ist der Ausdruck wahr, ruft die Prozedur die Funktion <b>TerminHinzufuegen <\/b>auf und &uuml;bergibt das Datum, das Array mit allen Daten der Terminserie sowie einen Z&auml;hler, der beim Anlegen eines Termins hochgez&auml;hlt wird und den Index des Arrays markiert.<\/p>\n<p>Der Code der Prozedur <b>TerminHinzufuegen <\/b>ist &uuml;berschaubar. Hier wird lediglich das Array neu dimensioniert, das Datum als neuer Wert hinzugef&uuml;gt und der Z&auml;hler <b>intCount <\/b>um <b>1 <\/b>erh&ouml;ht:<\/p>\n<pre>Private Sub TerminHinzufuegen(dat As Date,  datTermine As Variant, intCount As Integer)\r\n    ReDim Preserve datTermine(intCount)\r\n    datTermine(intCount) = dat\r\n    intCount = intCount + 1\r\nEnd Sub<\/pre>\n<p><b>W&ouml;chentliche Termine hinzuf&uuml;gen<\/b><\/p>\n<p>Ein wenig aufwendiger wird das Prozedere f&uuml;r die w&ouml;chentlichen Termine. Hier wird nicht gleich die Prozedur <b>TerminHinzufuegen <\/b>aufgerufen, sondern zun&auml;chst die Routine <b>TerminVerarbeiten<\/b>. Au&szlig;erdem wird hier nicht jedes Datum im angegebenen Zeitraum verarbeitet, sondern nur solche, die auf den angegebenen Wochentag fallen. Dazu zieht die Prozedur die Funktion <b>Weekday <\/b>heran und vergleicht den gefundenen Wert (beispielsweise <b>1 <\/b>f&uuml;r <b>Montag<\/b>) mit dem in der Optionsgruppe <b>ogrWoechentlich <\/b>ausgew&auml;hlten Tag. Stimmen diese &uuml;berein, &uuml;bernimmt die Prozedur <b>TerminVerarbeiten <\/b>das Steuer.<\/p>\n<p>Die Prozedur <b>TerminVerarbeiten <\/b>(s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-50-anchor\">Listing 2<\/a><\/span>) pr&uuml;ft zun&auml;chst anhand der Collection <b>colGueltigeTermine<\/b>, ob das Datum auf einen unerw&uuml;nschten Tag f&auml;llt, also je nach Einstellung des Formulars auf einen Samstag, Sonntag und\/oder Feiertag. Falls nicht, sorgt ein Aufruf der Prozedur <b>TerminHinzufuegen <\/b>daf&uuml;r, dass der Termin in das Terminserie-Array geschrieben wird.<\/p>\n<p class=\"listingueberschrift\">Listing 2: Verarbeiten eines Datums durch direktes Hinzuf&uuml;gen oder vorheriges Verschieben<\/p>\n<pre>Private Sub TerminVerarbeiten(dat As Date, datTermine As Variant, intCount As Integer,  colGueltigeTermine As Collection)\r\n    If colGueltigeTermine(CStr(dat)) = True Then\r\n        TerminHinzufuegen dat, datTermine, intCount\r\n    Else\r\n        If Me!ogrSamstageSonntageFeiertage = 1 Then ''sonst ignorieren\r\n            TerminVerschieben dat, datTermine, intCount, colGueltigeTermine\r\n        End If\r\n    End If\r\nEnd Sub<\/pre>\n<p>F&auml;llt das Datum auf einen unerw&uuml;nschten Termin, wird das Datum je nach der gew&auml;hlten Option um einen Tag nach vorne oder hinten verschoben.<\/p>\n<p>Dies erledigt die Prozedur <b>TerminVerschieben<\/b> (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-53-anchor\">Listing 3<\/a><\/span>). Sie speichert zun&auml;chst das zu pr&uuml;fende Datum in der Variablen <b>datVerschoben <\/b>zwischen. Dann durchl&auml;uft sie so lange eine <b>Do While<\/b>-Schleife, bis das Datum einem g&uuml;ltigen Termin entspricht.<\/p>\n<p class=\"listingueberschrift\">Listing 3: Verschieben und anlegen eines Termins<\/p>\n<pre>Private Function TerminVerschieben(dat As Date, datTermine As Variant, intCount As Integer,\r\n colGueltigeTermine As Collection)\r\n    Dim bolGueltigerTermin As Boolean\r\n    Dim datVerschoben As Date\r\n    bolGueltigerTermin = colGueltigeTermine(CStr(dat))\r\n    datVerschoben = dat\r\n    Do While Not bolGueltigerTermin = True\r\n        datVerschoben = datVerschoben + Me!ogrTerminverschiebung\r\n        bolGueltigerTermin = colGueltigeTermine(CStr(datVerschoben))\r\n    Loop\r\n    TerminHinzufuegen datVerschoben, datTermine, intCount\r\nEnd Function<\/pre>\n<p>Dabei wird das Datum jeweils um einen Tag nach vorn oder hinten verschoben &#8211; je nach der Einstellung der Optionsgruppe <b>ogrTerminverschiebung<\/b>. Dort nimmt die Option f&uuml;r den vorherigen Tag den Wert <b>-1 <\/b>ein und die Option f&uuml;r den folgenden Tag den Wert <b>1<\/b>. Auf diese Weise braucht die Prozedur einfach nur den Wert von <b>ogrTerminverschiebung <\/b>zum aktuellen Datum hinzuzuaddieren. Wurde ein g&uuml;ltiger Termin gefunden, wird dieser mit der Prozedur <b>TerminHinzufuegen <\/b>zum Array der Terminserie hinzugef&uuml;gt.<\/p>\n<p><b>Monatliche oder j&auml;hrliche Termine hinzuf&uuml;gen<\/b><\/p>\n<p>Bei den monatlichen oder j&auml;hrlichen Terminen werden die Daten auf &auml;hnliche Weise zur Terminserie hinzugef&uuml;gt. Es kommt jedoch noch die Schwierigkeit hinzu, dass durch die Angabe eines Tages auch ung&uuml;ltige Datumsangaben entstehen k&ouml;nnen (so etwa beim 31. &#8211; diesen Tag gibt es in der H&auml;lfte der Monate nicht).<\/p>\n<p>Wenn dies geschieht, wird die Tagesangabe so lange um <b>1 <\/b>verkleinert, bis sich zusammen mit dem Monat\/Jahr des aktuell durchlaufenen Datums ein g&uuml;ltiges Datum zusammensetzen l&auml;sst.<\/p>\n<p>Erst mit diesem Datum wird dann die Prozedur <b>TerminVerarbeiten <\/b>aufgerufen und der Termin in das Terminserien-Array eingearbeitet.<\/p>\n<p>Schlie&szlig;lich wird das resultierende Array mit dem R&uuml;ckgabewert <b>TerminserieErstellen <\/b>an die aufrufende Prozedur zur&uuml;ckgegeben.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">G&uuml;ltige Termine ermitteln<\/p>\n<p>Es fehlt noch ein genauerer Blick auf die Funktion <b>GueltigeTermine<\/b>, die alle Tage des angegebenen Zeitraums dahingehend pr&uuml;ft, ob sie auf einen Samstag, Sonntag oder Feiertag fallen, und die Termine dann, wenn der Benutzer dies im entsprechenden Bereich des Formulars gekennzeichnet hat, f&uuml;r die Terminserie blockt (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-54-anchor\">Listing 4<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 4: Ermitteln aller g&uuml;ltigen Termine f&uuml;r eine Terminserie<\/p>\n<pre>Private Function GueltigeTermine(datStart As Date, datEnde As Date, intBundesland As eBundesland)\r\n As Collection\r\n    Dim col As Collection\r\n    Dim dat As Date\r\n    Dim bolGueltig As Boolean\r\n    Set col = New Collection\r\n    For dat = datStart - 10 To datEnde + 10\r\n        bolGueltig = True\r\n        If Weekday(dat, vbMonday) = 6 Then\r\n            bolGueltig = Me!chkSamstag = False\r\n        End If\r\n        If Weekday(dat, vbMonday) = 7 And bolGueltig Then\r\n            bolGueltig = Me!chkSonntag = False\r\n        End If\r\n        If Me!chkFeiertag = True And bolGueltig Then\r\n            bolGueltig = Not IstFeiertag(dat, intBundesland)\r\n        End If\r\n        col.Add bolGueltig, CStr(dat)\r\n    Next dat\r\n    Set GueltigeTermine = col\r\nEnd Function<\/pre>\n<p>Diese Prozedur erzeugt zun&auml;chst ein neues <b>Collection<\/b>-Objekt und durchl&auml;uft dann alle Tage des durch die Textfelder <b>txtStart <\/b>und <b>txtEnde <\/b>markierten Zeitraums. Dieser wird &uuml;brigens auf beiden Seiten um zehn Tage ausgedehnt. Warum dies Nun: Es kann ja passieren, dass der Benutzer einen Zeitraum ausw&auml;hlt, der mit dem 1. Januar 2012 beginnt, und dass dieser gleichzeitig festlegt, dass keine Termine auf einen Feiertag fallen sollen.<\/p>\n<p>Nun sollen w&ouml;chentliche Termine angelegt werden, die auf einen Sonntag fallen. Wie es der Zufall will, f&auml;llt genau der erste Sonntag aber auf den 1. Januar 2012 und m&uuml;sste somit verschoben werden. Der Benutzer hat entschieden, dass Termine in solchen F&auml;llen auf den vorherigen Tag gelegt werden. Dieser w&auml;re aber normalerweise nicht in der Collection vorhanden und k&ouml;nnte somit gar nicht gepr&uuml;ft werden. Damit dies m&ouml;glich ist und der Termin auf den 31. Dezember 2011 gelegt werden kann, bauen wir hinten und vorne einen kleinen Puffer von jeweils zehn Tagen ein.<\/p>\n<p>Die Prozedur pr&uuml;ft nun, ob das aktuelle Datum auf einen Samstag f&auml;llt. Falls ja, schaut sie sich noch die Einstellung des Steuerelements <b>chkSamstag <\/b>an, das angibt, ob der Benutzer Termine an einem Samstag ausschlie&szlig;t oder nicht. Ist der Termin g&uuml;ltig, wird die Variable <b>bolGueltig <\/b>auf den Wert <b>True <\/b>eingestellt, sonst auf <b>False<\/b>. Hat <b>bolGueltig <\/b>den Wert <b>False<\/b>, werden die folgenden beiden Pr&uuml;fungen nicht mehr durchgef&uuml;hrt und direkt der Wert <b>False <\/b>f&uuml;r dieses Datum in die Collection eingetragen.<\/p>\n<p>Im Falle von <b>True <\/b>pr&uuml;fen die folgenden Zeilen auf die gleiche Weise, ob der Benutzer Termine an Sonntagen zul&auml;sst und ob der aktuelle Termin auf einen Sonntag f&auml;llt. Schlie&szlig;lich wird mithilfe der Funktion <b>IstFeiertag <\/b>noch festgestellt, ob das aktuelle Datum auf einen Feiertag f&auml;llt. Die Funktion <b>IstFeiertag <\/b>ist Thema eines weiteren Beitrags namens <b>Feiertage dynamisch ermitteln <\/b>(<b>www.access-im-unternehmen.de\/787<\/b>).<\/p>\n<p>Hat die Funktion alle Termine durchlaufen, gibt sie die Collection als Funktionswert an die aufrufende Routine zur&uuml;ck.<\/p>\n<p><b>Validierung und Co.<\/b><\/p>\n<p>Beim Klick auf die <b>OK<\/b>-Schaltfl&auml;che des Formulars oder vor dem Anzeigen der Terminserie pr&uuml;ft die Prozedur <b>Validierung<\/b>, ob der Benutzer g&uuml;ltige Werte f&uuml;r die betreffenden Felder eingetragen hat. Falls nicht, erscheint eine entsprechende Meldung und das Erstellen der Terminserie wird unterbrochen.<\/p>\n<p><b>&Uuml;bergabe der Terminserie<\/b><\/p>\n<p>Damit das Array mit den Termindaten beim Klicken der <b>OK<\/b>-Schaltfl&auml;che an die aufrufende Funktion &uuml;bergeben werden kann, wird das als modaler Dialog ge&ouml;ffnete Formular zun&auml;chst ausgeblendet. Die aufrufende Prozedur l&auml;uft weiter und liest den &uuml;ber die &ouml;ffentliche Property <b>Termine <\/b>verf&uuml;gbaren Wert der Variablen <b>datTermine <\/b>aus:<\/p>\n<pre>Public Property Get Termine()\r\n    Termine = datTermine()\r\nEnd Property<\/pre>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Fr&uuml;her oder sp&auml;ter werden Sie auf einen Anwendungsfall sto&szlig;en, der das Erstellen einer Terminserie n&ouml;tig macht. In diesem Fall k&ouml;nnen Sie die hier vorgestellten Techniken leicht in die gew&uuml;nschte Datenbank &uuml;bernehmen. Sie brauchen dazu nur die Objekte <b>frmTerminserie<\/b>, <b>mdlFeiertage<\/b>, <b>mdlTerminserie<\/b>, <b>mdlTools <\/b>sowie die beiden Klassenmodule <b>clsDatebox <\/b>und <b>clsDateboxes <\/b>in die Zieldatenbank zu &uuml;bernehmen. Ein Beispiel f&uuml;r den Aufruf der Funktion finden Sie im Modul <b>mdlTools <\/b>unter dem Namen <b>Beispielaufruf<\/b>.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Terminserien.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{7B688237-A941-4817-9EFC-541F29CF6A3B}\/aiu_789.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zum Eingeben von Terminen gibt es mittlerweile verschiedene eingebaute und zus&auml;tzliche Techniken. Aber was ist, wenn der Benutzer in einer Anwendung gleich mehrere Termine anlegen m&ouml;chte &#8211; beispielsweise, um gleich f&uuml;r ein ganzes Jahr eine Erinnerung an die Umsatzsteuervoranmeldung zu speichern oder um die Geburtstage seiner Bekannten in seiner Termindatenbank anzulegen Hier w&uuml;rde ein flexibel einsetzbares Tool eine Menge Arbeit sparen. Wie Sie solch ein Tool programmieren, erfahren Sie in diesem Beitrag.<\/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":[662011,66042011,44000027],"tags":[],"class_list":["post-55000789","post","type-post","status-publish","format-standard","hentry","category-662011","category-66042011","category-Loesungen"],"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>Terminserien - 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\/Terminserien\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Terminserien\" \/>\n<meta property=\"og:description\" content=\"Zum Eingeben von Terminen gibt es mittlerweile verschiedene eingebaute und zus&auml;tzliche Techniken. Aber was ist, wenn der Benutzer in einer Anwendung gleich mehrere Termine anlegen m&ouml;chte - beispielsweise, um gleich f&uuml;r ein ganzes Jahr eine Erinnerung an die Umsatzsteuervoranmeldung zu speichern oder um die Geburtstage seiner Bekannten in seiner Termindatenbank anzulegen Hier w&uuml;rde ein flexibel einsetzbares Tool eine Menge Arbeit sparen. Wie Sie solch ein Tool programmieren, erfahren Sie in diesem Beitrag.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Terminserien\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:57:08+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg02.met.vgwort.de\/na\/6bd06bdbbd484d768d95889befaacc53\" \/>\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=\"16\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Terminserien\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Terminserien\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Terminserien\",\"datePublished\":\"2020-05-22T21:57:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Terminserien\\\/\"},\"wordCount\":2729,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Terminserien\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/6bd06bdbbd484d768d95889befaacc53\",\"articleSection\":[\"2011\",\"4\\\/2011\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Terminserien\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Terminserien\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Terminserien\\\/\",\"name\":\"Terminserien - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Terminserien\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Terminserien\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/6bd06bdbbd484d768d95889befaacc53\",\"datePublished\":\"2020-05-22T21:57:08+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Terminserien\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Terminserien\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Terminserien\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/6bd06bdbbd484d768d95889befaacc53\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/6bd06bdbbd484d768d95889befaacc53\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Terminserien\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Terminserien\"}]},{\"@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":"Terminserien - 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\/Terminserien\/","og_locale":"de_DE","og_type":"article","og_title":"Terminserien","og_description":"Zum Eingeben von Terminen gibt es mittlerweile verschiedene eingebaute und zus&auml;tzliche Techniken. Aber was ist, wenn der Benutzer in einer Anwendung gleich mehrere Termine anlegen m&ouml;chte - beispielsweise, um gleich f&uuml;r ein ganzes Jahr eine Erinnerung an die Umsatzsteuervoranmeldung zu speichern oder um die Geburtstage seiner Bekannten in seiner Termindatenbank anzulegen Hier w&uuml;rde ein flexibel einsetzbares Tool eine Menge Arbeit sparen. Wie Sie solch ein Tool programmieren, erfahren Sie in diesem Beitrag.","og_url":"https:\/\/access-im-unternehmen.de\/Terminserien\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:57:08+00:00","og_image":[{"url":"http:\/\/vg02.met.vgwort.de\/na\/6bd06bdbbd484d768d95889befaacc53","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"16\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Terminserien\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Terminserien\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Terminserien","datePublished":"2020-05-22T21:57:08+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Terminserien\/"},"wordCount":2729,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Terminserien\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/6bd06bdbbd484d768d95889befaacc53","articleSection":["2011","4\/2011","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Terminserien\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Terminserien\/","url":"https:\/\/access-im-unternehmen.de\/Terminserien\/","name":"Terminserien - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Terminserien\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Terminserien\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/6bd06bdbbd484d768d95889befaacc53","datePublished":"2020-05-22T21:57:08+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Terminserien\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Terminserien\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Terminserien\/#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/6bd06bdbbd484d768d95889befaacc53","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/6bd06bdbbd484d768d95889befaacc53"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Terminserien\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Terminserien"}]},{"@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\/55000789","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=55000789"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000789\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000789"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000789"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000789"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}