{"id":55000809,"date":"2011-12-01T00:00:00","date_gmt":"2020-05-22T21:59:26","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=809"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Veranstaltungskalender","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Veranstaltungskalender\/","title":{"rendered":"Veranstaltungskalender"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/c7a26384d48f481ab5eda1345bd3cf1e\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wer Veranstaltungen und sonstige Termine plant, der wei&szlig;, dass es schwierig ist, die &Uuml;bersicht zu behalten. Hier mit Outlook zu arbeiten, mag schon sinnvoll sein. Allerdings bietet Outlook nicht die M&ouml;glichkeit, etwa zu einer Veranstaltung Alternativtermine oder Terminserien zu verwalten. Diese Funktion soll der Kernaspekt der im vorliegenden Beitrag beschriebenen L&ouml;sung sein, aber es gibt noch mehr zu entdecken &#8211; zum Beispiel die Darstellung der Termine in Formularen und Berichten sowie deren Eingabe. Und nicht zuletzt besteht auch das Datenmodell aus mehr als einer Tabelle zum Speichern der Termine &#8230;<\/b><\/p>\n<p><b>Termine, Termine, Termine<\/b><\/p>\n<p>Eine Veranstaltung kann einen oder mehrere Termine enthalten. In letzterem Fall w&auml;re es eine Veranstaltungsreihe. Bei der Planung eines Veranstaltungstermins oder auch der Termine einer Veranstaltungsreihe kann es sein, dass nicht nur einer, sondern gleich mehrere Termine zur Auswahl stehen und noch nicht festgelegt werden k&ouml;nnen. Dies l&auml;sst sich im Datenmodell auf verschiedene Arten abbilden. Da es f&uuml;r jede Veranstaltung einen oder mehrere Termine geben kann, ist sicher, dass es eine Veranstaltungstabelle gibt und zus&auml;tzlich eine Termintabelle. Termine werden aber nicht immer gleich fixiert &#8211; stattdessen h&auml;lt man sich mehrere Daten f&uuml;r einen Termin frei.<\/p>\n<p>Eine M&ouml;glichkeit, dies im Datenmodell abzubilden, w&auml;re das Anlegen einer Tabelle f&uuml;r einen Termin einer Veranstaltung beziehungsweise die Termine einer Veranstaltungsreihe. Diese Tabelle w&uuml;rde aber nur die Basisdaten des Termins enthalten (also Thema, Ort und so weiter) und nicht das Datum. Dieses w&uuml;rde in einer weiteren Tabelle mit den m&ouml;glichen Veranstaltungszeiten enthalten sein. Andererseits kann es ja auch sein, dass mit den Terminen auch etwa die Veranstaltungsorte variieren.<\/p>\n<p>Und hier geht die Tendenz dorthin, keine eigene Tabelle f&uuml;r die Terminalternativen vorzuhalten, sondern die alternativen Termine einfach etwa &uuml;ber eine eindeutige ID als zusammengeh&ouml;rend zu kennzeichnen. Sprich: Es gibt eine Tabelle mit Veranstaltungen und eine mit Terminen. Die Zugeh&ouml;rigkeit eines Termins zu einer Veranstaltung wird &uuml;ber ein entsprechendes Fremdschl&uuml;sselfeld realisiert, so k&ouml;nnen dann auch Terminserien erfasst werden. Die Reihenfolge der Termine einer Terminserie ergibt sich aus deren Datumsangaben. <\/p>\n<p>Fehlen noch die Alternativtermine. Jeder neue Termin soll neben dem Prim&auml;rschl&uuml;sselfeld noch eine weitere ID erhalten, die etwa aus einer Hilfstabelle stammt oder einfach dynamisch erzeugt wird. Wenn der Benutzer einen Alternativtermin anlegen m&ouml;chte, erh&auml;lt dieser die gleiche ID wie der Termin, auf dessen Basis der Alternativtermin angelegt wurde.<\/p>\n<p>Wenn wir nun noch eine Tabelle zum Speichern von Veranstaltungskategorien hinzunehmen, die von der Tabelle mit den Veranstaltungen aus per Fremdschl&uuml;sselfeld referenziert wird, sieht das Datenmodell wie in Bild 1 aus. Die Tabelle <b>tblVeranstaltungen <\/b>nimmt die grundlegenden Veranstaltungsdaten auf. Die Tabelle <b>tblTermine <\/b>ist &uuml;ber das Feld <b>VeranstaltungID <\/b>mit der Tabelle <b>tblVeranstaltungen <\/b>verkn&uuml;pft. Auf diese Weise k&ouml;nnen ein oder mehrere Termine einer Veranstaltung zugewiesen werden. Die Tabelle <b>tblTermine <\/b>enth&auml;lt weiterhin ebenfalls die Felder Titel und Beschreibung, Termindatum, Startzeit und Endzeit. Das Feld <b>AlternativID <\/b>erh&auml;lt beim Anlegen des ersten Termins eine eindeutige ID. Sollen Alternativtermine zu einem Termin angelegt werden, erhalten diese die gleiche <b>AlternativID <\/b>wie der betroffene Termin.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_06\/Veranstaltungstermine-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Datenmodell der Terminverwaltung<\/span><\/b><\/p>\n<p>Das Feld <b>KategorieID<\/b> der Tabelle <b>tblVeranstaltungen <\/b>legen Sie als Nachschlagefeld aus, damit beim Anlegen von Steuerelementen auf Basis dieses Feldes in Formularen gleich ein Kombinationsfeld erstellt wird.<\/p>\n<p>Beim Feld <b>VeranstaltungID <\/b>der Tabelle <b>tblTermine <\/b>ist dies nicht n&ouml;tig, da dieses sp&auml;ter nur die Zuordnung von den Terminen im Unterformular zu den Veranstaltungen im Hauptformular herstellen soll. Stattdessen legen Sie die Beziehung direkt im Beziehungen-Fenster an.<\/p>\n<p><b>Eingabe der Veranstaltungsdaten<\/b><\/p>\n<p>Die eigentlichen Veranstaltungsdaten geben Sie in das Hauptformulars <b>frmVeranstaltungen <\/b>ein. Dieses verwendet die Tabelle <b>tblVeranstaltungen <\/b>als Datenherkunft<b> <\/b>und enth&auml;lt die Felder <b>VeranstaltungID<\/b>, <b>Titel<\/b>, <b>Beschreibung und KategorieID<\/b> dieser Tabelle. Das Feld <b>VeranstaltungID <\/b>ist als Autowert ausgelegt und somit vielleicht nicht optimal zur Referenzierung von Veranstaltungen geeignet. Sie k&ouml;nnen ein Feld zur Eingabe individueller Veranstaltungsnummern anlegen, die mehr Aussagekraft haben &#8211; beispielsweise mit K&uuml;rzeln wie <b>MS01 <\/b>f&uuml;r <b>Mitarbeiterschulung 01<\/b>. Das Formular sieht in der Entwurfsansicht wie in Bild 2 aus.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_06\/Veranstaltungstermine-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Hauptformular zur Eingabe der Veranstaltungen in der Entwurfsansicht<\/span><\/b><\/p>\n<p><b>Termine anzeigen<\/b><\/p>\n<p>Wie Sie die Termine zur aktuellen Veranstaltung des Hauptformulars anzeigen, h&auml;ngt davon ab, ob diese direkt bearbeitet werden sollen oder ob dies in einem externen Formular geschehen soll. F&uuml;r die direkte Bearbeitung verwenden Sie ein Unterformular in der Datenblatt- oder Endlosansicht, bei Bearbeitung im separaten Formular k&ouml;nnen Sie alternativ ein Listenfeld verwenden.<\/p>\n<p>In diesem Fall scheint eine Kombination sinnvoll. Die Termine sollten schon direkt editierbar sein, weil das einfach praktischer ist und schneller funktioniert, als wenn Sie f&uuml;r jede &auml;nderung ein Detailformular &ouml;ffnen w&uuml;rden. Andererseits kann gerade das Anlegen von Alternativterminen direkt im Unterformular in der Datenblatt- oder Endlosansicht verwirren: Prinzipiell soll dazu n&auml;mlich zun&auml;chst der Termin-Datensatz, zu dem ein Alternativtermin erstellt werden soll, kopiert werden. Dann zeigt das Unterformular zwei identische Termine an. Welchen davon soll der Benutzer dann bearbeiten Also &ouml;ffnet die Anwendung besser gleich ein Detailformular zur Bearbeitung des neuen Termins und f&uuml;gt diesen nach dem Schlie&szlig;en des Detailformulars in der Liste der Termine an. Das Vorhandensein von Alternativterminen wirkt sich auch auf die Auswahl der Listendarstellung aus: Es w&auml;re doch &auml;u&szlig;erst praktisch, wenn alternative Termine zusammenh&auml;ngend angezeigt w&uuml;rden &#8211; am besten noch durch eine gemeinsame Farbe markiert. Hier scheidet das Listenfeld aus.<\/p>\n<p><b>Unterformular zur Anzeige der Termine<\/b><\/p>\n<p>Also ein Unterformular &#8211; in der Datenblattansicht oder doch als Endlosformular Das h&auml;ngt davon ab, ob Sie die Schaltfl&auml;chen etwa zum Anlegen eines Alternativtermins, zum L&ouml;schen oder zum Bearbeiten in jeder Zeile anzeigen m&ouml;chten oder doch lieber &uuml;ber oder unter dem Unterformular. Sollen die Bedienelemente f&uuml;r jeden Datensatz bereitstehen, verwenden Sie ein Endlosformular, sonst die Datenblattansicht (nat&uuml;rlich k&ouml;nnen Sie auch das Endlosformular verwenden und dabei die Schaltfl&auml;chen &uuml;ber oder unter dem Formular anzeigen, aber in einem Unterformular in der Datenblattansicht bringen Sie definitiv keine Schaltfl&auml;chen unter). Da die Daten gleich im Unterformular bearbeitet werden sollen, entscheiden wir uns f&uuml;r die Darstellung im Endlosformular und somit daf&uuml;r, jedem Termin-Datensatz einen eigenen Satz Schaltfl&auml;chen zum L&ouml;schen, Bearbeiten et cetera zuzuordnen.<\/p>\n<p>In der Entwurfsansicht sieht das Formular mit der Bezeichnung <b>sfmTermine<\/b> wie in Bild 3 aus. Das Formular verwendet zun&auml;chst die Tabelle <b>tblTermine <\/b>als Datenherkunft. Zun&auml;chst deshalb, weil Sie damit erstmal die ben&ouml;tigten Felder aus der Feldliste in den Detailbereich ziehen und das Formular layouten k&ouml;nnen. Sp&auml;ter werden wir die Tabelle durch eine Abfrage ersetzen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_06\/Veranstaltungstermine-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Unterformular zur Anzeige der Termine<\/span><\/b><\/p>\n<p>Stellen Sie die Eigenschaft <b>Standardansicht <\/b>des Formulars auf <b>Endlosformular <\/b>ein. Die Steuerelemente verteilen Sie wie in der Abbildung auf den Formularkopf und den Detailbereich. Unter Access 2007 und j&uuml;nger gelingt das ganz einfach, indem Sie alle betroffenen Steuerelemente markieren und im Ribbon den Eintrag <b>Anordnen|Tabelle|Tabelle <\/b>ausf&uuml;hren. Rechts neben den Feldern platzieren Sie drei Schaltfl&auml;chen namens <b>cmdBearbeiten<\/b>, <b>cmdLoeschen <\/b>und <b>cmdAlternativterminAnlegen<\/b>. Um Platz zu sparen, haben wir die Symbole <b>&#8230; <\/b>(Bearbeiten), <b>X <\/b>(L&ouml;schen) und <b>* <\/b>(Alternativtermin anlegen) als Beschriftung der Schaltfl&auml;chen verwendet.<\/p>\n<p><b>Veranstaltungen mit Terminen anzeigen<\/b><\/p>\n<p>Nun ziehen Sie das Formular <b>sfmTermine <\/b>aus dem Datenbankfenster beziehungsweise dem Navigationsbereich als Unterformular in das im Entwurf ge&ouml;ffnete Formular <b>frmVeranstaltungen<\/b>.<\/p>\n<p>Normalerweise sollten die beiden Eigenschaften <b>Verkn&uuml;pfen von <\/b>und <b>Verkn&uuml;pfen nach <\/b>des Unterformulars nun wie in Bild 4 gef&uuml;llt sein. Dies besagt, dass das Unterformular nur solche Datens&auml;tze anzeigt, deren Fremdschl&uuml;sselfeld <b>VeranstaltungID <\/b>den gleichen Wert wie das gleichnamige Feld im Hauptformular aufweist. Sollten diese beiden Eigenschaften nicht gef&uuml;llt sein, holen Sie dies nach.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_06\/Veranstaltungstermine-web-images\/pic004.png\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Haupt- und Unterformular werden &uuml;ber die Eigenschaften Verkn&uuml;pfen von und Verkn&uuml;pfen nach verbunden.<\/span><\/b><\/p>\n<p>Nun k&ouml;nnen Sie schon in die Formularansicht wechseln und Veranstaltungen eingeben. Termine zu den Veranstaltungen sollen nur &uuml;ber ein weiteres Formular namens <b>frmTermine<\/b> eingegeben werden k&ouml;nnen. Daher stellen wir die Eigenschaft <b>Anf&uuml;gen zulassen <\/b>des Unterformulars auf <b>Nein <\/b>ein. Daf&uuml;r m&uuml;ssen Sie aber dann eine Schaltfl&auml;che im Formular anlegen, mit der der Benutzer das Formular <b>frmTermine <\/b>zum Anlegen neuer Termine &ouml;ffnen kann. Diese Schaltfl&auml;che soll <b>cmdNeuerTermin <\/b>hei&szlig;en und das Formular <b>frmTermine <\/b>als modalen Dialog nur zum Anlegen eines neuen Datensatzes &ouml;ffnen. Au&szlig;erdem soll mit dem &Ouml;ffnungsargument der Wert des Feldes <b>VeranstaltungID <\/b>der aktuell im Hauptformular angezeigten Veranstaltung &uuml;bergeben werden, damit dieses gleich als Standardwert f&uuml;r das entsprechende Fremdschl&uuml;sselfeld &uuml;bernommen werden kann. Nach dem Schlie&szlig;en des Formulars <b>frmTermine <\/b>soll der Inhalt des Unterformulars <b>sfmTermine <\/b>aktualisiert werden, damit der neue Termin auch angezeigt wird. Die per Mausklick ausgel&ouml;ste Prozedur sieht so aus:<\/p>\n<pre>Private Sub cmdNeuerTermin_Click()\r\n    DoCmd.OpenForm &quot;frmTermine&quot;, WindowMode:=acDialog, DataMode:=acFormAdd, OpenArgs:=Me!txtVeranstaltungID\r\n    Me!sfmTermine.Form.Requery\r\nEnd Sub<\/pre>\n<p><b>Termine anlegen<\/b><\/p>\n<p>Neue Termine und Alternativtermine werden im Formular <b>frmTermine <\/b>angelegt. Dort findet auch die Bearbeitung bestehender Termine statt, soweit Felder betroffen sind, die in der &Uuml;bersicht nicht angezeigt werden. Das Formular verwendet die Tabelle <b>tblTermine<\/b> als Datenherkunft und zeigt die Felder dieser Tabelle wie in der Entwurfsansicht aus Bild 5 an. Die beiden Felder <b>AlternativID <\/b>und <b>VeranstaltungID <\/b>werden gleich zwar ben&ouml;tigt, sollen aber nicht angezeigt werden. Daher stellen Sie deren Eigenschaft <b>Sichtbar <\/b>auf den Wert <b>Nein <\/b>ein (dies k&ouml;nnen Sie sp&auml;ter erledigen, um vorerst die Inhalte dieser Felder kontrollieren zu k&ouml;nnen).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_06\/Veranstaltungstermine-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Das Formular zum Eingeben neuer Termine<\/span><\/b><\/p>\n<p><!--30percent--><\/p>\n<p>Au&szlig;erdem enth&auml;lt das Formular zwei Schaltfl&auml;chen namens <b>cmdOK <\/b>und <b>cmdAbbrechen <\/b>mit entsprechender Beschriftung. Die Schaltfl&auml;che <b>cmdOK <\/b>l&ouml;st folgende Ereignisprozedur aus:<\/p>\n<pre>Private Sub cmdOK_Click()\r\n    DoCmd.Close acForm, Me.Name\r\nEnd Sub<\/pre>\n<p>Die Schaltfl&auml;che <b>cmdAbbrechen <\/b>schlie&szlig;t ebenfalls das Formular, verwirft aber zuvor noch die &auml;nderungen:<\/p>\n<pre>Private Sub cmdAbbrechen_Click()\r\n    Me.Undo\r\n    DoCmd.Close acForm, Me.Name\r\nEnd Sub<\/pre>\n<p>K&uuml;mmern wir uns nun noch um den beim Aufruf &uuml;bergebenen <b>OpenArgs<\/b>-Parameter. Dieser enth&auml;lt den aktuellen Wert des Feldes <b>VeranstaltungID<\/b>. Damit es als Standardwert des entsprechenden Fremdschl&uuml;sselfeldes der Tabelle <b>tblTermine <\/b>eingetragen wird, legen Sie eine Prozedur f&uuml;r das Ereignis <b>Beim &Ouml;ffnen <\/b>an und f&uuml;gen die folgende Anweisung hinzu:<\/p>\n<pre>Private Sub Form_Open(Cancel As Integer)\r\n    Me!VeranstaltungID.DefaultValue = Me.OpenArgs\r\nEnd Sub<\/pre>\n<p>Auf diese Weise wird der neue Datensatz gleich mit dem entsprechenden Datensatz der Tabelle <b>tblVeranstaltungen <\/b>verkn&uuml;pft.<\/p>\n<p>Das Eingabeformular soll jeweils zur Bearbeitung eines einzigen Termins dienen, also blenden Sie die Navigationsschaltfl&auml;chen und den Datensatzmarkierer durch Einstellen der entsprechenden Eigenschaften auf den Wert <b>Nein <\/b>aus. Au&szlig;erdem soll das Fenster zentriert erscheinen, was Sie durch Einstellen von <b>Automatisch zentrieren <\/b>auf <b>Ja <\/b>erreichen. Da die Gr&ouml;&szlig;e des Fensters nicht ver&auml;nderlich ist, deaktivieren Sie auch die Eigenschaft <b>Bildlaufleisten<\/b>.<\/p>\n<p><b>Termininformationen vorbelegen<\/b><\/p>\n<p>Einige Daten des Termins wie etwa der <b>Titel <\/b>und die <b>Beschreibung <\/b>sollen entsprechend der Information zur betroffenen Veranstaltung vorbelegt werden.<\/p>\n<p>Dazu gibt es mehrere M&ouml;glichkeiten: Entweder das Formular <b>frmTermine <\/b>liest diese vom Formular <b>frmVeranstaltungen <\/b>ein, die Daten werden ebenfalls mit dem <b>OpenArgs<\/b>-Argument &uuml;bergeben oder sie werden auf Basis des &uuml;bergebenen Werts f&uuml;r das Feld <b>VeranstaltungID <\/b>aus der Tabelle ausgelesen.<\/p>\n<p><b>Termin bearbeiten<\/b><\/p>\n<p>Die grundlegenden Daten des Termins, also den Titel, das Datum oder Start- und Endzeit, kann der Benutzer gleich im Unterformular <b>sfmTermine <\/b>des Formulars <b>frmVeranstaltungen <\/b>bearbeiten. Sollte auch noch die Beschreibung angepasst werden, muss der Benutzer den Termin im Formular <b>frmTermine <\/b>&ouml;ffnen. Dies erledigt ein Klick auf die Schaltfl&auml;che <b>cmdBearbeiten <\/b>(&#8230;). Dies l&ouml;st die folgende Prozedur aus:<\/p>\n<pre>Private Sub cmdBearbeiten_Click()\r\n    DoCmd.OpenForm &quot;frmTermine&quot;, WindowMode:=acDialog, DataMode:=acFormEdit, _\r\n          WhereCondition:=&quot;TerminID = &quot; &amp; Me!TerminID\r\n    Me.Requery\r\nEnd Sub<\/pre>\n<p>Die Prozedur &ouml;ffnet das Formular <b>frmTermine <\/b>wiederum als modalen Dialog, diesmal allerdings im Datenbearbeitungsmodus. Deshalb wird auch kein Wert f&uuml;r <b>VeranstaltungID <\/b>per <b>OpenArgs <\/b>&uuml;bergeben, sondern der gew&uuml;nschte Datensatz &uuml;ber den Parameter <b>WhereCondition <\/b>festgelegt. Da kein &Ouml;ffnungsargument &uuml;bergeben wird, l&ouml;st dies aktuell einen Fehler in der <b>Beim Laden<\/b>-Ereignisprozedur des ge&ouml;ffneten Formulars aus: <b>Me.OpenArgs <\/b>ist <b>Null<\/b>, der Standardwert eines Feldes erwartet aber immer einen Wert ungleich <b>Null<\/b>. Daher nehmen wir dort eine kleine Anpassung vor:<\/p>\n<pre>Private Sub Form_Open(Cancel As Integer)\r\n    If Not IsNull(Me.OpenArgs) Then\r\n        Me!txtVeranstaltungID.DefaultValue = Me.OpenArgs\r\n    End If\r\nEnd Sub<\/pre>\n<p><b>Termine l&ouml;schen<\/b><\/p>\n<p>Die Schaltfl&auml;che <b>cmdLoeschen <\/b>im Unterformular <b>sfmTermine <\/b>soll den Termin-Datensatz, f&uuml;r den sie angeklickt wurde, l&ouml;schen. Da der Benutzer gegebenenfalls einmal aus Versehen auf diese Schaltfl&auml;che klickt, versehen wir die dadurch ausgel&ouml;ste Prozedur mit einer R&uuml;ckfrage, ob der Datensatz auch wirklich gel&ouml;scht werden soll. Die Prozedur sieht schlie&szlig;lich wie folgt aus:<\/p>\n<pre>Private Sub cmdLoeschen_Click()\r\n    If MsgBox(&quot;Soll der Datensatz wirklich gel&ouml;scht werden&quot;, vbYesNo) = vbYes Then\r\n        RunCommand acCmdDeleteRecord\r\n    End If\r\nEnd Sub<\/pre>\n<p><b>Alternativtermin hinzuf&uuml;gen<\/b><\/p>\n<p>Das Hinzuf&uuml;gen eines Alternativtermins ist etwas komplizierter als das Anlegen eines normalen Termins. Grunds&auml;tzlich haben wir noch keine Funktion vorgesehen, die jedem einzelnen Termin einen eindeutigen Wert im Feld <b>AlternativID <\/b>hinzuf&uuml;gt. Dies sollte bei jedem neuen Termin geschehen, bei Anlage von Alternativterminen sollen diese mit der gleichen ID wie der betroffene Termin ausgestattet werden.<\/p>\n<p>Diesen Wert k&ouml;nnten wir einfach beim Anlegen eines neuen Datensatzes im Formular <b>frmTermine <\/b>ermitteln und hinzuf&uuml;gen. Allerdings ist hier zu beachten, dass dieser Wert nicht immer neu ermittelt, sondern von einem bestehenden Termin &uuml;bernommen werden muss.<\/p>\n<p>Es bietet sich daher an, die <b>AlternativID <\/b>bereits beim Anlegen vom Formular <b>frmVeranstaltungen <\/b>aus zu ermitteln und ebenfalls als &Ouml;ffnungsargument zu &uuml;bergeben. Das &Ouml;ffnungsargument kann dann auch beim Anlegen eines Alternativtermins &uuml;bergeben werden &#8211; dann allerdings auf Basis der bereits bestehenden <b>AlternativID <\/b>des Termins, zu dem eine Alternative erstellt werden soll.<\/p>\n<p>Erstmal k&uuml;mmern wir uns um die beiden Erweiterungen, zun&auml;chst in der Prozedur, die durch einen Mausklick auf die Schaltfl&auml;che <b>cmdNeuerTermin<\/b> des Formulars <b>frmVeranstaltungen <\/b>ausgel&ouml;st wird (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-34-anchor\">Listing 1<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 1: &Ouml;ffnen des Formulars zum Anlegen eines neuen Termins<\/p>\n<pre>Private Sub cmdNeuerTermin_Click()\r\n    Dim lngAlternativID As Long\r\n    lngAlternativID = Nz(DMax(&quot;AlternativID&quot;, &quot;tblTermine&quot;), 0) + 1\r\n    DoCmd.OpenForm &quot;frmTermine&quot;, WindowMode:=acDialog, DataMode:=acFormAdd, _\r\n        OpenArgs:=Me!txtVeranstaltungID &amp; &quot;|&quot; &amp; lngAlternativID &amp; &quot;|&quot; &amp; Me!txtTitel &amp; &quot;|&quot; _\r\n        &amp; Me!txtBeschreibung\r\n    Me!sfmTermine.Form.Requery\r\nEnd Sub<\/pre>\n<p>Hier wird nun zun&auml;chst ein neuer Wert f&uuml;r das Feld <b>AlternativID <\/b>ermittelt, in diesem Fall schlicht der n&auml;chstgr&ouml;&szlig;ere Wert des aktuell gr&ouml;&szlig;ten Eintrags. Dieser wird, durch das Pipe-Zeichen (|) getrennt, zusammen mit dem Wert des Feldes <b>VeranstaltungID <\/b>als &Ouml;ffnungsargument an das aufgerufene Formular geschickt, also beispielsweise in der Form <b>12|321<\/b>.<\/p>\n<p>Mit diesem ge&auml;nderten &Ouml;ffnungsargument kann die Prozedur, die beim Laden des Formulars <b>frmTermine <\/b>ausgel&ouml;st wird, nat&uuml;rlich nichts mehr anfangen. Daher wird der Ausdruck dort erstmal auseinandergenommen und in den beiden Variablen <b>lngVeranstaltungID <\/b>und <b>lngAlternativID <\/b>gespeichert. Dann landen diese beiden Werte in der Eigenschaft <b>DefaultValue <\/b>der beiden Textfelder <b>txtVeranstaltungID <\/b>und <b>txtAlternativID<\/b> (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-44-anchor\">Listing 2<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 2: Initialisieren des Formulars zum Anlegen eines neuen Termins<\/p>\n<pre>Private Sub Form_Open(Cancel As Integer)\r\n    Dim lngVeranstaltungID As Long\r\n    Dim lngAlternativID As Long\r\n    Dim strTitel As String\r\n    Dim strBeschreibung As String\r\n    If Not IsNull(Me.OpenArgs) Then\r\n        lngVeranstaltungID = Split(Me.OpenArgs, &quot;|&quot;)(0)\r\n        lngAlternativID = Split(Me.OpenArgs, &quot;|&quot;)(1)\r\n        strTitel = Split(Me.OpenArgs, &quot;|&quot;)(2)\r\n        strBeschreibung = Split(Me.OpenArgs, &quot;|&quot;)(3)\r\n        Me!txtVeranstaltungID.DefaultValue = lngVeranstaltungID\r\n        Me!txtAlternativID.DefaultValue = lngAlternativID\r\n        Me!txtPrioritaet.DefaultValue = DCount(&quot;AlternativID&quot;, &quot;tblTermine&quot;, _\r\n            &quot;AlternativID = &quot; &amp; lngAlternativID) + 1\r\n        Me!txtTitel.DefaultValue = Chr(34) &amp; strTitel &amp; Chr(34)\r\n        Me!txtBeschreibung.DefaultValue = Chr(34) &amp; strBeschreibung &amp; Chr(34)\r\n    End If\r\nEnd Sub<\/pre>\n<p>Damit k&ouml;nnen wir arbeiten, wenn wir nun einen Alternativtermin anlegen m&ouml;chten. Die durch einen Klick auf die Schaltfl&auml;che <b>cmdAlternativterminAnlegen <\/b>ausgel&ouml;ste Prozedur ermittelt zun&auml;chst die Werte der beiden Felder <b>VeranstaltungID <\/b>und <b>AlternativID <\/b>des Datensatzes, auf dessen Schaltfl&auml;che geklickt wurde. Dann &ouml;ffnet sie das Formular <b>frmTermine <\/b>und &uuml;bergibt die beiden Werte, genau wie zuvor durch ein Pipe-Zeichen getrennt:<\/p>\n<pre>Private Sub cmdAlternativterminAnlegen_Click()\r\n    Dim lngVeranstaltungID As Long\r\n    Dim lngAlternativID As Long\r\n    lngVeranstaltungID = Me!VeranstaltungID\r\n    lngAlternativID = Me!AlternativID\r\n    DoCmd.OpenForm &quot;frmTermine&quot;, _\r\n        WindowMode:=acDialog, DataMode:=acFormAdd, _\r\n        OpenArgs:=lngVeranstaltungID &amp; &quot;|&quot; \r\n             &amp; lngAlternativID\r\n    Me.Requery\r\nEnd Sub<\/pre>\n<p>Nach dem Schlie&szlig;en des Formulars wird auch hier noch der Inhalt des Unterformulars aktualisiert.<\/p>\n<p>Kategorien hinzuf&uuml;gen<\/p>\n<p>Kategorien sollen direkt &uuml;ber das Kombinationsfeld <b>cboKategorieID <\/b>eingef&uuml;gt werden. Dazu hinterlegen Sie die Prozedur aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-43-anchor\">Listing 3<\/a><\/span> f&uuml;r die Ereigniseigenschaft <b>Bei nicht in Liste<\/b>. Die Prozedur fragt den Benutzer zun&auml;chst, ob die Kategorie tats&auml;chlich angelegt werden soll. Falls ja, tr&auml;gt die Prozedur die Kategorie mit einer <b>INSERT INTO<\/b>-Anweisung ein und gibt f&uuml;r den Parameter <b>Response<\/b> den Wert <b>acDataErrAdded <\/b>zur&uuml;ck, was dazu f&uuml;hrt, dass der neue Wert gleich verf&uuml;gbar ist und ausgew&auml;hlt wird. Anderenfalls wird die Eingabe im Kombinationsfeld zur&uuml;ckgesetzt. Der R&uuml;ckgabewert <b>acDataErrContinue <\/b>sorgt daf&uuml;r, dass die sonst &uuml;bliche Fehlermeldung nicht angezeigt wird.<\/p>\n<p class=\"listingueberschrift\">Listing 3: Diese Prozedur legt einen neuen Eintrag in der Tabelle tblKategorien an.<\/p>\n<pre>Private Sub cboKategorieID_NotInList(NewData As String, Response As Integer)\r\n    Dim db As DAO.Database\r\n    If MsgBox(&quot;Kategorie ''&quot; &amp; NewData &amp; &quot;'' hinzuf&uuml;gen&quot;, vbYesNo) = vbYes Then\r\n        Set db = CurrentDb\r\n        db.Execute &quot;INSERT INTO tblKategorien(Kategorie) VALUES(''&quot; &amp; NewData &amp; &quot;'')&quot;, dbFailOnError\r\n        Response = acDataErrAdded\r\n        Set db = Nothing\r\n    Else\r\n        Me!cboKategorieID.Undo\r\n        Response = acDataErrContinue\r\n    End If\r\nEnd Sub<\/pre>\n<p><b>Termine sortiert anzeigen<\/b><\/p>\n<p>Jetzt wird es interessant: Sie k&ouml;nnen zwar bereits mehrere Termine zu einer Veranstaltung eingeben und auch Alternativtermine festlegen. Allerdings werden diese aktuell noch in der Reihenfolge des Anlegens im Unterformular dargestellt. W&uuml;nschenswert w&auml;re es allerdings, wenn das Unterformular die Terminalternativen gruppiert anzeigen w&uuml;rde &#8211; und am besten noch farblich hervorgehoben. Wenn Sie also drei Termine planen und f&uuml;r jeden Termin drei Alternativen eintragen, sollten erst drei Termine ohne Hintergrund, dann drei mit Hintergrund und dann wieder drei ohne erscheinen. Au&szlig;erdem w&auml;re es toll, wenn man den Terminen eine Priorit&auml;t zuweisen k&ouml;nnte, um festzulegen, welcher der Alternativtermine am wahrscheinlichsten ist und welcher eher nicht wahrgenommen wird.<\/p>\n<p>Letzteres Feature w&uuml;rde uns eine schwierige Entscheidung abnehmen: Wenn sich die Alternativen f&uuml;r zwei Termine zeitlich &uuml;berschneiden, welche Gruppe soll dann zuerst in der Liste angezeigt werden Wenn wir einem Termin einer Reihe von Alternativterminen die h&ouml;chste Priorit&auml;t einr&auml;umen k&ouml;nnen, brauchten wir die Gruppen von Alternativterminen einfach nur nach dem Datum des wahrscheinlichsten Termins zu sortieren. Um dies zu realisieren, f&uuml;gen wir der Tabelle <b>tblTermine <\/b>zun&auml;chst noch ein Feld namens <b>Prioritaet <\/b>hinzu. Au&szlig;erdem ben&ouml;tigt das Unterformular <b>sfmTermine<\/b> noch zwei Schaltfl&auml;chen, mit denen die Priorit&auml;t eingestellt werden kann. Die erste Schaltfl&auml;che verschiebt einen Termin eine Position innerhalb der Terminalternativen nach oben, die zweite nach unten.<\/p>\n<p><b>Priorit&auml;ten zuteilen<\/b><\/p>\n<p>Als Erstes m&uuml;ssen wir den Terminen beim Anlegen Priori&auml;ten zuweisen. Das hei&szlig;t, dass der erste Termin einer Reihe von Alternativterminen jeweils den Wert <b>1 <\/b>im Feld <b>Prioritaet <\/b>erhalten soll. Der Wert jedes nachfolgenden Alternativtermins soll um <b>1 <\/b>gr&ouml;&szlig;er sein.<\/p>\n<p>Die erledigen wir innerhalb der Prozedur, die beim Laden des Formulars <b>frmTermine <\/b>ausgel&ouml;st wird. Dort f&uuml;gen Sie als letzte Zeile der <b>If&#8230;Then<\/b>-Bedingung die folgende Anweisung ein:<\/p>\n<pre>Me!txtPrioritaet.DefaultValue = DCount(&quot;AlternativID&quot;, &quot;tblTermine&quot;, &quot;AlternativID = &quot; &amp; lngAlternativID) + 1<\/pre>\n<p>Dies ermittelt die Anzahl der bisher vorhandenen Termine mit dem gleichen Wert im Feld <b>AlternativID <\/b>und stellt den Standardwert des noch anzulegenden Feldes <b>txtPrioritaet<\/b>, welches das neue Feld <b>Prioritaet <\/b>als Steuerelementinhalt verwendet, auf diesen Wert plus <b>1 <\/b>ein. Somit wird der neue Alternativtermin bez&uuml;glich der Priorit&auml;t zun&auml;chst hinten angestellt.<\/p>\n<p><b>Sortieren der Alternativtermine nach Priorit&auml;t<\/b><\/p>\n<p>Im Unterformular <b>sfmTermine <\/b>soll der Benutzer die Gelegenheit erhalten, die Termine, zu denen es Alternativen gibt, nach der Priorit&auml;t zu sortieren und diese dann gegebenenfalls nach und nach zu eliminieren. Zur Sortierung sollen Schaltfl&auml;chen angelegt werden, mit denen man einen Termin um eine Position nach oben oder um eine Position nach unten verschieben kann &#8211; optimalerweise gleich neben den &uuml;brigen drei Schaltfl&auml;chen zum L&ouml;schen, Bearbeiten oder Anlegen von Alternativterminen.<\/p>\n<p>Das erste Problem ist jedoch, die Termine in der richtigen Sortierung anzuzeigen. Normalerweise w&auml;re das leicht: Sie legen einfach ein Sortierfeld fest und stellen die Sortierung auf <b>Aufsteigend <\/b>oder <b>Absteigend <\/b>ein. In diesem Fall kann es jedoch auch vorkommen, dass eine Veranstaltung mehrere Termine enth&auml;lt, von denen einer oder mehrere auch noch Alternativtermine bereithalten. Das hei&szlig;t, dass erst nach dem Wert des Feldes <b>Alternativtermin <\/b>sortiert werden muss und dann nach der Priorit&auml;t. Die einzelnen Gruppen von Alternativterminen sollen hingegen nach dem Datum des Termins mit der h&ouml;chsten Priorit&auml;t geordnet werden. Wir haben also die folgenden Vorgaben:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Termine mit der gleichen <b>AlternativID <\/b>werden nach dem Inhalt des Feldes <b>Prioritaet <\/b>sortiert.<\/li>\n<li class=\"aufz-hlung\">Die Termine mit der gleichen <b>AlternativID <\/b>sollen gruppiert dargestellt werden.<\/li>\n<li class=\"aufz-hlung\">Die Gruppen sollen nach dem Datum des Termins mit der h&ouml;chsten Priorit&auml;t angeordnet werden.<\/li>\n<\/ul>\n<p>Grunds&auml;tzlich erhalten wir diese Sortierung in zwei Schritten, sprich mit zwei aufeinander aufbauenden Abfragen. Die erste sieht wie in Bild 6 aus und verwendet eine Unterabfrage, um das Datum der nach Priorit&auml;t sortierten Datens&auml;tze mit dem gleichen Wert im Feld <b>AlternativID<\/b> zu speichern. F&uuml;r das Feld <b>Prioritaetstermin <\/b>l&auml;sst sich allerdings leider keine Sortierung mehr festlegen. Dies holt eine zweite Abfrage nach, die schlicht alle Felder der ersten Abfrage enth&auml;lt und erst nach dem Feld <b>Prioritaetstermin <\/b>sortiert und dann nach dem Wert des Feldes <b>AlternativID<\/b>. Letzteres dient lediglich dazu, die Alternativtermine zusammenzuhalten.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_06\/Veranstaltungstermine-web-images\/pic006.png\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Diese Abfrage liefert die Termine samt dem Datum des ersten Alternativtermins nach Priorit&auml;t.<\/span><\/b><\/p>\n<p>Diese Vorgehensweise hat allerdings einen gravierenden Nachteil: Die Abfrage ist wegen der Unterabfrage in der ersten Teilabfrage nicht mehr bearbeitbar. Der Benutzer kann also keine Termine mehr direkt im Unterformular anpassen. Es gibt jedoch noch eine Alternative: Dabei f&uuml;gen wir ein weiteres Feld namens <b>Sortierung <\/b>zur Tabelle <b>tblTermine <\/b>hinzu. Dieses Feld wird auf Basis der Abfrage <b>qrySfmTermineSortiert <\/b>gef&uuml;llt. <\/p>\n<p>Fehlen immer noch zwei Steuerelemente zum &auml;ndern der Reihenfolge. Sie k&ouml;nnen sich bereits ansehen, wie die Klasse <b>clsOrder <\/b>in der Beispieldatenbank f&uuml;r diesen Zweck eingesetzt wird; die Beschreibung dieser Klasse folgt im Artikel <b>Reihenfolge mit Klasse <\/b>(<b>www.access-im-unternehmen.de\/812<\/b>).<\/p>\n<p><b>Gruppierte Darstellung von Alternativterminen<\/b><\/p>\n<p>Fehlt noch das Gruppieren der Alternativtermine, wenn mehr als ein Termin samt Alternativen zum Einsatz kommt. Dies erledigen wir per bedingter Formatierung: Alle zusammenh&auml;ngenden Termine sollen mit der gleichen Farbe hinterlegt werden, wobei sich die Farbe f&uuml;r jeden zweiten Termin wiederholt (s. Bild 7). Im Prinzip stimmt dies mit der seit Access 2007 verf&uuml;gbaren alternierenden Hintergrundfarbe &uuml;berein, allerdings soll die Hintergrundfarbe nicht mit jedem Datensatz, sondern mit jeder Gruppe alternativer Datens&auml;tze ausgetauscht werden.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_06\/Veranstaltungstermine-web-images\/pic007.png\" alt=\"pic007.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Farbige Markierung zusammenh&auml;ngender Alternativtermine<\/span><\/b><\/p>\n<p>Damit die bedingte Formatierung wirkt, brauchen Sie entsprechende Daten, nach denen Sie diese auslegen k&ouml;nnen. Da wir wohl kein passendes Feld finden, legen wir auch f&uuml;r diesen Zweck noch ein weiteres Feld in der Tabelle <b>tblTermine <\/b>an. Dieses soll schlicht <b>Hintergrundfarbe<\/b> hei&szlig;en und die Werte <b>0 <\/b>und &#8211;<b>1 <\/b>annehmen.<\/p>\n<p>Damit die Werte dieses Feldes jeweils beim Wechsel des Veranstaltungsdatensatzes, beim L&ouml;schen oder Hinzuf&uuml;gen eines Termins und beim Erstellen eines neuen Alternativtermins angepasst werden, verwenden wir eine Prozedur, die zu den entsprechenden Anl&auml;ssen ausgel&ouml;st wird und wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-36-anchor\">Listing 4<\/a><\/span> aussieht. Der Aufruf erfolgt beispielsweise beim Wechseln des Datensatzes im Hauptformular, beim &auml;ndern der Sortierung der Termine im Unterformular oder beim Laden des Unterformulars. Die Prozedur tr&auml;gt jeweils die Werte f&uuml;r die Felder <b>Sortierung <\/b>und <b>Hintergrundfarbe <\/b>in die Tabelle <b>tblTermine <\/b>ein. Der Wert f&uuml;r das Feld <b>Hintergrundfarbe <\/b>wird beim Durchlaufen aller Datens&auml;tze der aktuellen Veranstaltung auf Basis eines Vergleichs des aktuellen Wertes des Feldes <b>AlternativID <\/b>mit dem vorherigen Wert ermittelt. Ist dieser gleich, ist der Termin ein Alternativtermin und soll in der gleichen Farbe angezeigt werden &#8211; also erh&auml;lt er auch den gleichen Wert im Feld <b>Hintergrundfarbe <\/b>wie der vorherige Datensatz.<\/p>\n<p class=\"listingueberschrift\">Listing 4: Festlegen der Sortierung und der Hintergrundfarbeinstellung f&uuml;r die Termine<\/p>\n<pre>Public Sub SortierungFestlegen()\r\n    Dim db As DAO.Database\r\n    Dim lngAlternativID As Long\r\n    Dim bolHintergrundfarbe As Boolean\r\n    Dim rst As DAO.Recordset\r\n    Set db = CurrentDb\r\n    Set rst = db.OpenRecordset(&quot;SELECT * FROM qrySFMTermineSortiert WHERE VeranstaltungID = &quot; &amp; Me!VeranstaltungID, dbOpenDynaset)\r\n    lngAlternativID = rst!AlternativID\r\n    Do While Not rst.EOF\r\n        If Not (lngAlternativID = rst!AlternativID) Then\r\n            bolHintergrundfarbe = Not bolHintergrundfarbe\r\n        End If\r\n        db.Execute &quot;UPDATE tblTermine SET Sortierung = &quot; &amp; rst.AbsolutePosition + 1 &amp; &quot;, Hintergrundfarbe = &quot; &amp; CInt(bolHintergrundfarbe) &amp; &quot; WHERE TerminID = &quot; &amp; rst!TerminID, dbFailOnError\r\n        lngAlternativID = rst!AlternativID\r\n        rst.MoveNext\r\n    Loop\r\nEnd Sub<\/pre>\n<p>Das Unterformular <b>sfmTermine <\/b>wiederum enth&auml;lt ein Textfeld, das den kompletten Detailbereich einnimmt und an das Feld <b>Hintergrundfarbe <\/b>der Datenherkunft gebunden ist. F&uuml;r dieses Feld wurde eine bedingte Formatierung festgelegt, die f&uuml;r den Wert <b>-1 <\/b>eine und f&uuml;r <b>0 <\/b>eine andere Farbe anzeigt. Damit der Steuerelementinhalt, also der Wert <b>-1 <\/b>oder <b>0<\/b>, nicht sichtbar ist, wird die Schriftfarbe auf den gleichen Wert eingestellt.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Veranstaltungskalender.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{346A3364-2144-4665-B83F-A677E1763307}\/aiu_809.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wer Veranstaltungen und sonstige Termine plant, der wei&szlig;, dass es schwierig ist, die &Uuml;bersicht zu behalten. Hier mit Outlook zu arbeiten, mag schon sinnvoll sein. Allerdings bietet Outlook nicht die M&ouml;glichkeit, etwa zu einer Veranstaltung Alternativtermine oder Terminserien zu verwalten. Dieses Funktion soll der Kernaspekt der im vorliegenden Beitrag beschriebenen L&ouml;sung sein, aber es gibt noch mehr zu entdecken &#8211; zum Beispiel die Darstellung der Termine in Formularen und Berichten sowie deren Eingabe. Und nicht zuletzt besteht auch das Datenmodell aus mehr als einer Tabelle zum Speichern der Termine &#8230;<\/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,66062011,44000027],"tags":[],"class_list":["post-55000809","post","type-post","status-publish","format-standard","hentry","category-662011","category-66062011","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>Veranstaltungskalender - 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\/Veranstaltungskalender\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Veranstaltungskalender\" \/>\n<meta property=\"og:description\" content=\"Wer Veranstaltungen und sonstige Termine plant, der wei&szlig;, dass es schwierig ist, die &Uuml;bersicht zu behalten. Hier mit Outlook zu arbeiten, mag schon sinnvoll sein. Allerdings bietet Outlook nicht die M&ouml;glichkeit, etwa zu einer Veranstaltung Alternativtermine oder Terminserien zu verwalten. Dieses Funktion soll der Kernaspekt der im vorliegenden Beitrag beschriebenen L&ouml;sung sein, aber es gibt noch mehr zu entdecken - zum Beispiel die Darstellung der Termine in Formularen und Berichten sowie deren Eingabe. Und nicht zuletzt besteht auch das Datenmodell aus mehr als einer Tabelle zum Speichern der Termine ...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Veranstaltungskalender\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:59:26+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/c7a26384d48f481ab5eda1345bd3cf1e\" \/>\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=\"22\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Veranstaltungskalender\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Veranstaltungskalender\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Veranstaltungskalender\",\"datePublished\":\"2020-05-22T21:59:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Veranstaltungskalender\\\/\"},\"wordCount\":3911,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Veranstaltungskalender\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/c7a26384d48f481ab5eda1345bd3cf1e\",\"articleSection\":[\"2011\",\"6\\\/2011\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Veranstaltungskalender\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Veranstaltungskalender\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Veranstaltungskalender\\\/\",\"name\":\"Veranstaltungskalender - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Veranstaltungskalender\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Veranstaltungskalender\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/c7a26384d48f481ab5eda1345bd3cf1e\",\"datePublished\":\"2020-05-22T21:59:26+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Veranstaltungskalender\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Veranstaltungskalender\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Veranstaltungskalender\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/c7a26384d48f481ab5eda1345bd3cf1e\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/c7a26384d48f481ab5eda1345bd3cf1e\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Veranstaltungskalender\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Veranstaltungskalender\"}]},{\"@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":"Veranstaltungskalender - 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\/Veranstaltungskalender\/","og_locale":"de_DE","og_type":"article","og_title":"Veranstaltungskalender","og_description":"Wer Veranstaltungen und sonstige Termine plant, der wei&szlig;, dass es schwierig ist, die &Uuml;bersicht zu behalten. Hier mit Outlook zu arbeiten, mag schon sinnvoll sein. Allerdings bietet Outlook nicht die M&ouml;glichkeit, etwa zu einer Veranstaltung Alternativtermine oder Terminserien zu verwalten. Dieses Funktion soll der Kernaspekt der im vorliegenden Beitrag beschriebenen L&ouml;sung sein, aber es gibt noch mehr zu entdecken - zum Beispiel die Darstellung der Termine in Formularen und Berichten sowie deren Eingabe. Und nicht zuletzt besteht auch das Datenmodell aus mehr als einer Tabelle zum Speichern der Termine ...","og_url":"https:\/\/access-im-unternehmen.de\/Veranstaltungskalender\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:59:26+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/c7a26384d48f481ab5eda1345bd3cf1e","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"22\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Veranstaltungskalender\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Veranstaltungskalender\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Veranstaltungskalender","datePublished":"2020-05-22T21:59:26+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Veranstaltungskalender\/"},"wordCount":3911,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Veranstaltungskalender\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/c7a26384d48f481ab5eda1345bd3cf1e","articleSection":["2011","6\/2011","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Veranstaltungskalender\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Veranstaltungskalender\/","url":"https:\/\/access-im-unternehmen.de\/Veranstaltungskalender\/","name":"Veranstaltungskalender - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Veranstaltungskalender\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Veranstaltungskalender\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/c7a26384d48f481ab5eda1345bd3cf1e","datePublished":"2020-05-22T21:59:26+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Veranstaltungskalender\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Veranstaltungskalender\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Veranstaltungskalender\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/c7a26384d48f481ab5eda1345bd3cf1e","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/c7a26384d48f481ab5eda1345bd3cf1e"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Veranstaltungskalender\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Veranstaltungskalender"}]},{"@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\/55000809","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=55000809"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000809\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000809"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000809"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000809"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}