{"id":55000956,"date":"2014-10-01T00:00:00","date_gmt":"2020-05-22T21:13:08","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=956"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Weiterbildungen_verwalten_Teil_I","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Weiterbildungen_verwalten_Teil_I\/","title":{"rendered":"Weiterbildungen verwalten, Teil I"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/2e36c8a4c354437a98751cbf4c93c7eb\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>In diesem Beitrag k&uuml;mmern wir uns um die Verwaltung von Weiterbildungen f&uuml;r Mitarbeiter. Dabei soll man f&uuml;r jede Weiterbildung mehrere Einheiten beziehungsweise Termine festlegen k&ouml;nnen, die dann beliebig oft angeboten werden k&ouml;nnen. Den Mitarbeitern teilt man mit der Beispielanwendung die Weiterbildungen zu und kann die Teilnahme eines jeden Mitarbeiters an den einzelnen Terminen protokollieren.<\/b><\/p>\n<p>Die Datenbank zur Verwaltung von Weiterbildungen soll zun&auml;chst die Mitarbeiter verwalten, die an den Weiterbildungen teilnehmen. Dazu erstellen wir zun&auml;chst zwei Tabellen namens <b>tblMitarbeiter <\/b>und <b>tblAnreden<\/b>. Die Tabelle <b>tblMitarbeiter <\/b>soll dabei die &uuml;blichen Daten enthalten wie Anrede, Vorname, Nachname, Stra&szlig;e, PLZ, Ort, Telefon, Telefax, E-Mail und noch ein Bemerkungen-Feld &#8211; f&uuml;r alle F&auml;lle. Die Tabelle <b>tblAnreden <\/b>speichert die Anreden und ist &uuml;ber das Fremdschl&uuml;sselfeld <b>AnredeID <\/b>der Tabelle <b>tblMitarbeiter <\/b>mit dieser verkn&uuml;pft. Da solche Tabellen quasi in jedem Beispiel vorkommen, an dieser Stelle nur der &uuml;berblick &uuml;ber die beiden Tabellen samt Beziehung im Datenmodell (s. Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_05\/pic_956_001.png\" alt=\"Die Tabellen tblMitarbeiter und tblAnreden im Beziehungen-Fenster\" width=\"400\" height=\"315,3062\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Die Tabellen tblMitarbeiter und tblAnreden im Beziehungen-Fenster<\/span><\/b><\/p>\n<p><b>Weiterbildungen verwalten<\/b><\/p>\n<p>Wesentlich spannender wird das Verwalten der Weiterbildungen. Jede Weiterbildung soll einen Anbieter haben, der in der Tabelle <b>tblAnbieter <\/b>gespeichert wird. Au&szlig;erdem legen wir zwei Felder namens Standardintervall und Standardtag an. Das Feld <b>Standardintervall <\/b>gibt ein Intervall in Wochen vor, in dem die Veranstaltungen stattfinden. <b>Standardtag <\/b>legt den Wochentag fest, an dem die Weiterbildung &uuml;blicherweise stattfindet. Beide k&ouml;nnen sp&auml;ter individuell angepasst werden.<\/p>\n<p>Das war der einfache Teil. Nun kommen n&auml;mlich noch einige weitere Informationen, die in Tabellen gegossen werden wollen. Dabei verstehen wir unter Weiterbildung zun&auml;chst die Bezeichnung einer Weiterbildungsma&szlig;nahme. Legen wir diese Tabelle, die im Entwurf wie in Bild 2 aussieht, schon einmal an. Sie enth&auml;lt ein Feld zum Eintragen der Bezeichnung der Weiterbildung sowie ein Fremdschl&uuml;sselfeld zur Tabelle <b>tblAnbieter<\/b>. Das Feld <b>Weiterbildung <\/b>erh&auml;lt au&szlig;erdem einen eindeutigen Index, damit jede Bezeichnung nur einmal vergeben werden kann.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_05\/pic_956_002.png\" alt=\"Entwurf der Tabelle tblWeiterbildungen\" width=\"500\" height=\"357,7303\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Entwurf der Tabelle tblWeiterbildungen<\/span><\/b><\/p>\n<p><b>Wei-ter-bil-dungs-veranstaltungen<\/b><\/p>\n<p>Jede Weiterbildung hat eine gewisse Anzahl von Veranstaltungen &#8211; manche haben vielleicht nur eine, andere laufen &uuml;ber mehrere Monate mit w&ouml;chentlichen Terminen.<\/p>\n<p>Jede Weiterbildung mit ihren Veranstaltungen wird aber in der Regel nicht nur einmalig ausgef&uuml;hrt, sondern startet beispielsweise einmal im Jahr oder alle paar Monate. Vielleicht l&auml;uft eine Weiterbildung auch gleich in mehreren Auflagen parallel oder zeitlich versetzt.<\/p>\n<p>Also haben wir nun schon Weiterbildungen mit jeweils mehreren Veranstaltungen, die gegebenenfalls immer wieder neu starten. Also m&uuml;ssen wir auch noch irgendwie die konkreten Termine verwalten, an denen die einzelnen Weiterbildungsveranstaltungen ausgef&uuml;hrt werden.<\/p>\n<p>Um ehrlich zu sein: Das eigentliche Problem war hier nicht, die Tabellen und ihre Inhalte zu erstellen und in Beziehung zu setzen, sondern diese mit sinnvollen Bezeichnungen zu versehen. Im Prinzip gibt es ja jede Weiterbildung einmal als eine Art Vorlage mit ihren einzelnen Veranstaltungen und einmal als Instanz mit den tats&auml;chlichen Terminen. Also legen wir die folgende Aufteilung fest: Wir erstellen eine Tabelle namens <b>tblWeiterbildungen<\/b>, welche die Bezeichnung der Weiterbildung und weitere Informationen wie den Anbieter aufnimmt. Als Bezeichnungen dienen dann etwa &#8222;VBA mit Access f&uuml;r Einsteiger&#8220; oder &#8222;VBA mit Access f&uuml;r Fortgeschrittene&#8220;. Au&szlig;erdem nimmt die Tabelle zwei Felder namens Standardintervall und Standardtag auf &#8211; dazu sp&auml;ter mehr.<\/p>\n<p>Als n&auml;chstes legen wir in einer Tabelle namens <b>tblWeiterbildungsveranstaltungen <\/b>die einzelnen Veranstaltungen fest, die im einfachsten Fall einfach mit  der Weiterbildungsveranstaltung und einer laufenden Nummer versehen werden, also etwa <b>VBA mit Access f&uuml;r Einsteiger I<\/b>, <b>VBA mit Access f&uuml;r Einsteiger II <\/b>und so weiter. Diese Eintr&auml;ge m&uuml;ssen nat&uuml;rlich mit der Tabelle <b>tblWeiterbildungen <\/b>verkn&uuml;pft werden. Den Entwurf f&uuml;r diese Tabelle finden Sie in Bild 3. Die Tabelle enth&auml;lt ein Feld zur Bezeichnung der Weiterbildungsveranstaltung und das Fremdschl&uuml;sselfeld zur Tabelle <b>tblWeiterbildungen<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_05\/pic_956_003.png\" alt=\"Entwurf der Tabelle tblWeiterbildungsveranstaltungen\" width=\"575\" height=\"342,852\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Entwurf der Tabelle tblWeiterbildungsveranstaltungen<\/span><\/b><\/p>\n<p><b>Weiterbildungstermine<\/b><\/p>\n<p>Nun fehlen noch die Termine, an denen die einzelnen Veranstaltungen tats&auml;chlich stattfinden. Diese speichern wir in einer Tabelle namens <b>tblWeiterbildungstermine<\/b>. Hier stellt sich nun die Frage: Mit welcher Tabelle verkn&uuml;pfen wir die Datens&auml;tze dieser Tabelle Man ger&auml;t schnell in Versuchung, diese Datens&auml;tze mit der Tabelle <b>tblWeiterbildungen <\/b>zu verkn&uuml;pfen. Prinzipiell keine schlechte Idee, aber jeder Weiterbildungstermin ist ja eigentlich eine Instanz einer Weiterbildungsveranstaltung aus der Tabelle <b>tblWeiterbildungsveranstaltungen<\/b>. So wird dann auch ein Schuh daraus: Wenn wir einen in der Tabelle <b>tblWeiterbildungstermine<\/b> gespeicherten Termin mit dem entsprechenden Datensatz der Tabelle <b>tblWeiterbildungsveranstaltungen <\/b>verkn&uuml;pfen, k&ouml;nnen wir dar&uuml;ber erstens direkt die Bezeichnung der jeweiligen Veranstaltung ermitteln (also etwa <b>VBA mit Access f&uuml;r Fortgeschrittene VIII<\/b>). Zweitens erhalten wir &uuml;ber die Beziehung zwischen den Tabellen <b>tblWeiterbildungsveranstaltungen <\/b>und <b>tblWeiterbildungen <\/b>dann auch den gew&uuml;nschten Bezug zur Tabelle <b>tblWeiterbildungen<\/b>. Die Tabelle sieht nun im ersten Entwurf wie in Bild 4 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_05\/pic_956_004.png\" alt=\"Entwurf der Tabelle tblWeiterbildungstermine\" width=\"575\" height=\"284,2534\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Entwurf der Tabelle tblWeiterbildungstermine<\/span><\/b><\/p>\n<p><b>Weiterbildungstabellen im &uuml;berblick<\/b><\/p>\n<p>Schauen wir uns Bild 5 an, um einen &uuml;berblick &uuml;ber die Tabellen zur Verwaltung der Weiterbildungen, Veranstaltungen und Termine zu erhalten. Etwas ist dort noch nicht richtig rund. Es handelt sich um die Tatsache, dass wir zwar nun zu jeder Weiterbildung die Veranstaltung und zu jeder Veranstaltung die konkreten Termine festlegen k&ouml;nnen, aber dass die einzelnen Termine noch nicht zu einer Veranstaltungsreihe zusammengefasst sind. Warum ist das wichtig Mit dem aktuellen Stand des Datenmodells erhalten wir, wenn die Veranstaltung VBA mit Access f&uuml;r Einsteiger etwa drei Teile enth&auml;lt (<b>VBA mit Access f&uuml;r Einsteiger I<\/b>, <b>II <\/b>und <b>III<\/b>), f&uuml;r die erste Instanz dieser Veranstaltungsreihe drei Termine. Wenn die Weiterbildung danach erneut angeboten wird, werden die gleichen Termine erneut angelegt. Es gibt dann also jeweils zwei Termine f&uuml;r <b>VBA mit Access f&uuml;r Einsteiger I<\/b>, <b>II <\/b>und <b>III<\/b>. Abgesehen von dem Datum, an dem sich die Zusammengeh&ouml;rigkeit der Termine zu einer Veranstaltungsreihe m&ouml;glicherweise ablesen l&auml;sst (wenn nicht zwei Kurse parallel stattfinden), gibt es keine M&ouml;glichkeit, die Zusammengeh&ouml;rigkeit zu erkennen. Aber ist das &uuml;berhaupt notwendig beziehungsweise gibt es noch weitere Daten, die zusammenfassend f&uuml;r die Termine einer Veranstaltungsreihe aufgezeichnet werden m&uuml;ssen Solche gibt es durchaus: Zum Beispiel kann es ja sein, dass zwei Kurse gleichzeitig durchgef&uuml;hrt werden, aber jeweils ein anderer Dozent die Ausf&uuml;hrung &uuml;bernimmt. Oder dass Kurse an verschiedenen Orten stattfinden. Wie auch immer: Es scheint, dass wir noch eine weitere Tabelle hinzunehmen m&uuml;ssen, welche die Termine einer Weiterbildung zusammenfasst. Die Frage ist nur: Wie nennen wir diese <b>tblWeiterbildungsreihen <\/b>sollte eigentlich ein passender Name f&uuml;r die Tabelle sein (s. Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_05\/pic_956_009.png\" alt=\"Tabelle zur Zusammenfassung mehrerer Weiterbildungstermine zu einer Reihe\" width=\"575\" height=\"374,2343\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Tabelle zur Zusammenfassung mehrerer Weiterbildungstermine zu einer Reihe<\/span><\/b><\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_05\/pic_956_005.png\" alt=\"Datenmodell der Tabellen rund um die Weiterbildung\" width=\"575\" height=\"234,2291\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Datenmodell der Tabellen rund um die Weiterbildung<\/span><\/b><\/p>\n<p>Diese Tabelle soll neben dem Prim&auml;rschl&uuml;sselfeld zun&auml;chst ein Fremdschl&uuml;sselfeld zur Tabelle <b>tblWeiterbildungen <\/b>erhalten. Desweitern gibt es zwei weitere Fremdschl&uuml;sselfelder zu den Tabellen <b>tblDozenten <\/b>und <b>tblWeiterbildungsorte<\/b>, die jedoch der Einfachheit halber neben dem Prim&auml;rschl&uuml;sselfeld nur jeweils ein einziges Feld zur Angabe einer Bezeichnung enthalten (beim Dozenten etwa <b>Dr. J&uuml;rgen M&uuml;ller<\/b>, beim Weiterbildungsort zum Beispiel <b>VHS Duisburg, Raum 123<\/b>).<\/p>\n<p>Neben der neuen Tabelle ben&ouml;tigen wir noch ein weiteres Feld in der Tabelle <b>tblWeiterbildungstermine<\/b>, denn irgendwie m&uuml;ssen wir ja festlegen, welche Termine zu einer Weiterbildungsreihe zusammengefasst werden. Also f&uuml;gen wir auch dieser Tabelle ein Fremschl&uuml;sselfeld namens <b>WeiterbildungsreiheID <\/b>hinzu, welches die Tabelle mit der Tabelle <b>tblWeiterbildungsreihen <\/b>verkn&uuml;pft.<\/p>\n<p>Zusammengefasst hat sich also nun einiges ge&auml;ndert im Datenmodell, das nun wie in Bild 8 aussieht. Bevor wir uns die Gestaltung der Formulare zur Verwaltung der Weiterbildungen anschauen, kommen wir auf die Mitarbeiter zur&uuml;ck.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_05\/pic_956_008.png\" alt=\"Datenmodell mit der Tabelle zur Zusammenfassung der Weiterbildungstermine\" width=\"650\" height=\"351,2023\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Datenmodell mit der Tabelle zur Zusammenfassung der Weiterbildungstermine<\/span><\/b><\/p>\n<p><b>Formulare zur Mitarbeiterverwaltung<\/b><\/p>\n<p>Zur Verwaltung der Mitarbeiter verwenden wir zun&auml;chst ein &uuml;bersichtsformular, das aus dem Hauptformular <b>frmMitarbeiterUebersicht <\/b>und dem Unterformular <b>sfmMitarbeiterUebersicht <\/b>besteht.<\/p>\n<p>Das Hauptformular enth&auml;lt lediglich das Unterformularsteuerelement mit dem Unterformular sowie zwei Schaltfl&auml;chen namens <b>cmdNeuerMitarbeiter <\/b>und <b>cmdMitarbeiterAnzeigen <\/b>(neben einem Icon und einer &uuml;berschrift im Formularkopf) &#8211; s. Bild 7.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_05\/pic_956_006.png\" alt=\"Das Formular zur Anzeige der Mitarbeiter&uuml;bersicht\" width=\"650\" height=\"406,5881\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Das Formular zur Anzeige der Mitarbeiter&uuml;bersicht<\/span><\/b><\/p>\n<p>Das Unterformular verwendet als Datenherkunft die Tabelle <b>tblMitarbeiter <\/b>und zeigt alle Felder dieser Tabelle an. Als Standardansicht verwendet das Formular das Datenblatt.<\/p>\n<p><b>Neuen Mitarbeiter anlegen<\/b><\/p>\n<p>Ein Klick auf die Schaltfl&auml;che <b>cmdNeuerMitarbeiter <\/b>soll ein weiteres Formular namens <b>frmMitarbeiterdetails <\/b>&ouml;ffnen und einen neuen, leeren Datensatz anzeigen. Dazu l&ouml;st der Mausklick auf diese Schaltfl&auml;che die Prozedur aus Listing 1 aus. Diese ruft das Formular <b>frmMitarbeiterdetails <\/b>auf und &uuml;bergibt f&uuml;r den Parameter <b>DataMode <\/b>den Wert <b>acFormAdd<\/b>, damit das Formular gleich einen neuen, leeren Datensatz anzeigt.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdNeuerMitarbeiter_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>lngMitarbeiterID<span style=\"color:blue;\"> As Long<\/span>\r\n     DoCmd.OpenForm \"frmMitarbeiterDetails\", DataMode:=acFormAdd, WindowMode:=acDialog\r\n     <span style=\"color:blue;\">If <\/span>IstFormularGeoeffnet(\"frmMitarbeiterdetails\")<span style=\"color:blue;\"> Then<\/span>\r\n         lngMitarbeiterID = Forms!frmMitarbeiterdetails!MitarbeiterID\r\n         DoCmd.Close acForm, \"frmMitarbeiterdetails\"\r\n         Me!sfmMitarbeiterUebersicht.Form.Requery\r\n         Me!sfmMitarbeiterUebersicht.Form.Recordset.FindFirst \"MitarbeiterID = \" & lngMitarbeiterID\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: &ouml;ffnen des Formulars zum Hinzuf&uuml;gen eines neuen MItarbeiters<\/span><\/b><\/p>\n<p>Durch den Wert <b>acDialog <\/b>f&uuml;r den Parameter <b>WindowMode <\/b>wartet der aufrufende Code, bis das aufgerufene Formular den Fokus verliert.<\/p>\n<p>Dann pr&uuml;ft die Prozedur, ob das Formular noch ge&ouml;ffnet ist (was der Fall ist, wenn der Benutzer dort auf die Schaltfl&auml;che <b>cmdOK <\/b>klickt &#8211; siehe weiter unten) oder ob es bereits geschlossen wurde (durch die Schaltfl&auml;che <b>cmdAbbrechen<\/b>).<\/p>\n<p>Ist das Formular noch ge&ouml;ffnet, speichert die Prozedur den Prim&auml;rschl&uuml;sselwert des im Formular <b>frmMitarbeiterdetails <\/b>neu angelegten Datensatzes in der Variablen <b>lngMitarbeiterID<\/b>. Danach schlie&szlig;t sie das aktuell nicht sichtbare Formular endg&uuml;ltig. Damit der neue Mitarbeiterdatensatz im Unterformular <b>sfmMitarbeiterUebersicht <\/b>erscheint, aktualisiert die Prozedur die Datenherkunft dieses Formulars. Schlie&szlig;lich stellt sie den Datensatzzeiger auf den soeben neu hinzugef&uuml;gten Datensatz ein, dessen Prim&auml;rschl&uuml;sselwert ja in der Variablen <b>lngMitarbeiterID <\/b>zwischengespeichert wurde.<\/p>\n<p><b>Mitarbeiterdetails anzeigen<\/b><\/p>\n<p>Die Schaltfl&auml;che <b>cmdMitarbeiterdetails <\/b>&ouml;ffnet ebenfalls dieses Formular, soll aber den aktuell im Unterformular markierten Mitarbeiter mit seinen Daten zur direkten Bearbeitung anzeigen.<\/p>\n<p>Die dazu ben&ouml;tigte Prozedur finden Sie in Listing 2. Die Prozedur pr&uuml;ft zun&auml;chst, ob der Benutzer &uuml;berhaupt einen Datensatz im Unterformular <b>sfmMitarbeiter-Uebersicht <\/b>ausgew&auml;hlt hat. Falls nicht, erscheint eine entsprechende Meldung. Hat er einen Mitarbeiter ausgew&auml;hlt, wird das Formular <b>frmMitarbeiterdetails <\/b>ge&ouml;ffnet. Dabei &uuml;bergibt die Prozedur <b>cmdMitarbeiterdetails_Click <\/b>als <b>WhereCondition <\/b>einen Ausdruck, der beispielsweise <b>MitarbeiterID = 123 <\/b>lautet und der daf&uuml;r sorgt, dass der aktuell ausgew&auml;hlte Mitarbeiter angezeigt wird.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdMitarbeiterdetails_Click()\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(Me!sfmMitarbeiterUebersicht.Form!MitarbeiterID)<span style=\"color:blue;\"> Then<\/span>\r\n         DoCmd.OpenForm \"frmMitarbeiterdetails\", DataMode:=acFormEdit, WhereCondition:=\"MitarbeiterID = \" _\r\n             & Me!sfmMitarbeiterUebersicht.Form!MitarbeiterID\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"W&auml;hlen Sie zun&auml;chst den anzuzeigenden Mitarbeiter aus.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: &ouml;ffnen des Formulars frmMitarbeiterdetails zum Anzeigen eines vorhandenen Mitarbeiters<\/span><\/b><\/p>\n<p>Das so ge&ouml;ffnete Formular sieht schlie&szlig;lich wie in Bild 9 aus. Dies ist allerdings noch nicht der endg&uuml;ltige Zustand des Formulars, da wir dort sp&auml;ter noch Steuerelemente zum Verwalten der Weiterbildungen einf&uuml;gen, an denen der Mitarbeiter teilgenommen hat.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_05\/pic_956_007.png\" alt=\"Die Mitarbeiterdetails im passenden Formular\" width=\"400\" height=\"380,9069\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Die Mitarbeiterdetails im passenden Formular<\/span><\/b><\/p>\n<p><b>Formulare f&uuml;r die Weiterbildungen<\/b><\/p>\n<p>Die obersten Elemente der Hierarchie rund um die Weiterbildungen stammen aus der Tabelle <b>tblWeiterbildungen<\/b>. F&uuml;r diese legen wir deshalb zun&auml;chst ein &uuml;bersichtsformular namens <b>frmWeiterbildungen-Uebersicht <\/b>an, das wie in Bild 10 aussieht. Das Unterformular <b>sfmWei-ter-bil-dungenUebersicht <\/b>verwendet die Tabelle <b>tblWeiterbildungen <\/b>als Datenherkunft.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_05\/pic_956_010.png\" alt=\"Formular zur Verwaltung der Weiterbildungen\" width=\"450\" height=\"349,3115\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Formular zur Verwaltung der Weiterbildungen<\/span><\/b><\/p>\n<p>Die beiden Schaltfl&auml;chen <b>cmdNeueWeiterbildung <\/b>und <b>cmdWeiterbildungDetails <\/b>arbeiten analog zu den entsprechenden Schaltfl&auml;chen im Formular <b>frmMitarbeiterUebersicht<\/b>. Das dadurch ge&ouml;ffnete Formular <b>frmWeiterbildungsdetails<\/b> sieht mit einem neuen, leeren Datensatz zun&auml;chst wie in Bild 11 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_05\/pic_956_011.png\" alt=\"Das Formular frmWeiterbildungsdetails\" width=\"450\" height=\"177,4901\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Das Formular frmWeiterbildungsdetails<\/span><\/b><\/p>\n<p>Dort geben Sie den Namen der Weiterbildung ein und w&auml;hlen einen Anbieter aus. Dummerweise stehen im aktuellen Zustand noch keine Anbieter zur Verf&uuml;gung. Daf&uuml;r wollen wir kein eigenes Formular anbieten, sondern einfach nur die Eingabe neuer Datens&auml;tze &uuml;ber das Kombinationsfeld erlauben. Dazu legen Sie f&uuml;r das Ereignis <b>Bei nicht in Liste <\/b>des Kombinationsfeldes <b>cboAnbieterID <\/b>(wir haben den Namen des Steuerelements um ein entsprechendes Pr&auml;fix erweitert) die Ereignisprozedur aus Listing 3 an. Diese legt, wenn der Benutzer einen noch nicht in der Tabelle <b>tblAnbieter <\/b>enthaltenen Anbieter in das Kombinationsfeld eintr&auml;gt, einen neuen Datensatz in der Tabelle an.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>AnbieterID_NotInList(NewData<span style=\"color:blue;\"> As String<\/span>, Response<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     Response = acDataErrAdded\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     db.Execute \"INSERT INTO tblAnbieter(Anbieter) VALUES(''\" & NewData & \"'')\", dbFailOnError\r\n     <span style=\"color:blue;\">Set<\/span> db = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Hinzuf&uuml;gen noch nicht vorhandener Eintr&auml;ge in die Datensatzherkunft des Kombinationsfeldes<\/span><\/b><\/p>\n<p>Damit das Formular nach dem Abschluss der Eingabe in das Kombinationsfeld <b>cboAnbieterID <\/b>nicht zum n&auml;chsten Datensatz wechselt, stellen wir dort au&szlig;erdem die Eigenschaft <b>Zyklus <\/b>auf <b>Aktueller Datensatz <\/b>ein.<\/p>\n<p><b>Weiterbildungsdetails verwalten<\/b><\/p>\n<p>Nun sind der Name der Weiterbildung und der Anbieter ja nicht die einzigen Daten zu einer Weiterbildung (man k&ouml;nnte hier sicher noch weitere Details verwalten, aber das sparen wir uns aus Gr&uuml;nden der &uuml;bersichtlichkeit). Die &uuml;brigen Daten befinden sich allerdings in anderen Tabellen &#8211; so zum Beispiel die Weiterbildungsveranstaltungen. Diese f&uuml;gen wir als Erstes zum Formular <b>frmWeiterbildungsdetails<\/b> hinzu, und zwar in Form des Unterformulars <b>sfmWeiterbildungsveranstaltungen<\/b>. Dieses verwendet eine Abfrage als Datenherkunft, die auf der Tabelle <b>tblWeiterbildungsveranstaltungen <\/b>basiert. Die Abfrage sortiert die enthaltenen Datens&auml;tze nach dem Wert des Feldes <b>ReihenfolgeID<\/b>. Allerdings sollen nur die zwei Felder <b>Weiterbildungsveranstaltung <\/b>und <b>ReihenfolgeID <\/b>in der Datenblattansicht angezeigt werden. <\/p>\n<p><!--30percent--><\/p>\n<p>Damit das Unterformular nur die Daten zum aktuell im Hauptformular angezeigten Datensatz liefert, sollte Access gleich beim Einf&uuml;gen die beiden Eigenschaften <b>Verkn&uuml;pfen von <\/b>und <b>Verkn&uuml;pfen nach <\/b>auf den Wert <b>WeiterbildungID<\/b> einstellen (s. Bild 12).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_05\/pic_956_012.png\" alt=\"Das Formular frmWeiterbildungsdetails mit Unterformular\" width=\"575\" height=\"446,3173\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Das Formular frmWeiterbildungsdetails mit Unterformular<\/span><\/b><\/p>\n<p>Damit k&ouml;nnen wir nun Weiterbildungsveranstaltungen zu den Weiterbildungen hinzuf&uuml;gen (s. Bild 13). Damit das Feld <b>ReihenfolgeID <\/b>automatisch mit dem n&auml;chstgr&ouml;&szlig;eren Wert gef&uuml;llt wird, f&uuml;gen wir f&uuml;r das Ereignis <b>Beim Anzeigen <\/b>des Unterformulars die Ereignisprozedur aus Listing 4 ein. Die Prozedur ermittelt mit der <b>DMax<\/b>-Funktion den gr&ouml;&szlig;ten Wert f&uuml;r das Feld <b>ReihenfolgeID <\/b>f&uuml;r die Datens&auml;tze der Tabelle <b>tblWeiterbildungsveranstaltungen<\/b>, das mit dem aktuellen Datensatz im Hauptformular verkn&uuml;pft ist. Diesem f&uuml;gt die Prozedur den Wert <b>1 <\/b>hinzu und stellt das Ergebnis als Standardwert f&uuml;r den folgenden Datensatz ein.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_05\/pic_956_013.png\" alt=\"Bearbeiten von Weiterbildungsveranstaltungen\" width=\"450\" height=\"365,8333\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Bearbeiten von Weiterbildungsveranstaltungen<\/span><\/b><\/p>\n<p>Dummerweise funktioniert dies beim L&ouml;schen eines Datensatzes im Unterformular nicht wie gew&uuml;nscht: Wenn Sie beispielsweise den Datensatz mit der Nummer <b>4 <\/b>l&ouml;schen, bleibt der Standardwert f&uuml;r das Feld <b>ReihenfolgeID <\/b>f&uuml;r den neuen Datensatz auf <b>5 <\/b>stehen.<\/p>\n<p>F&uuml;gen Sie dann einen neuen Datensatz hinzu, hat dieser den Wert <b>5 <\/b>und der nun angezeigte neue Datensatz ebenfalls.<\/p>\n<p>Abhilfe schafft es, wenn Sie die durch das Ereignis <b>Nach L&ouml;schbest&auml;tigung <\/b>ausgel&ouml;ste Prozedur mit einem Aufruf der soeben hinzugef&uuml;gten Prozedur <b>Form_Current <\/b>versehen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_AfterDelConfirm( Status<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Form_Current\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Ereignis <b>Beim L&ouml;schen <\/b>hilft hier nicht weiter, da der zu l&ouml;schende Datensatz zu diesem Zeitpunkt noch in der zugrunde liegenden Tabelle gespeichert ist.<\/p>\n<p><b>Termine anlegen<\/b><\/p>\n<p>Nun haben wir die M&ouml;glichkeit, Weiterbildungen und die einzelnen Weiterbildungsveranstaltungen einzugeben. Als N&auml;chstes k&uuml;mmern wir uns darum, die passenden Termine einzutragen. Wenn wir nun die erste Instanz dieser Weiterbildung anlegen, k&ouml;nnen wir diese am besten in einem weiteren Unterformular anzeigen. Diese Liste w&uuml;rde dann etwa wie folgt aussehen:<\/p>\n<ul>\n<li>VBA mit Access f&uuml;r Einsteiger, Teil I, 1.8.2014<\/li>\n<li>VBA mit Access f&uuml;r Einsteiger, Teil II, 8.8.2014<\/li>\n<li>VBA mit Access f&uuml;r Einsteiger, Teil III, 15.8.2014<\/li>\n<\/ul>\n<p>Das w&auml;re okay, aber wenn nun weitere Instanzen dieser Weiterbildung angelegt werden, die m&ouml;glicherweise noch parallel stattfinden, wird es un&uuml;bersichtlich. Also nutzen wir auch noch die Tabelle <b>tblWeiterbildungsreihen<\/b> in Verbindung mit der Tabelle <b>tblWeiterbildungstermine<\/b>. Damit bilden wir dann den ersten Termin (aus <b>tblWeiterbildungstermine<\/b>) sowie den Dozenten und den Weiterbildungsort in einem ersten Unterformular ab. Wenn der Benutzer einen der dortigen Eintr&auml;ge ausw&auml;hlt, soll ein weiteres Unterformular dann die passende Daten aus der Tabelle <b>tblWeiterbildungstermine <\/b>liefern. <\/p>\n<p>Im Entwurf sieht dies nun wie in Bild 14 aus. Das Unterformular <b>sfmWeiterbildungreihen <\/b>soll die Datens&auml;tze der Tabelle <b>tblWeiterbildungsreihen <\/b>anzeigen, die mit dem aktuellen Datensatz der Tabelle <b>tblWeiterbildungen <\/b>im Hauptformular verkn&uuml;pft sind. Dazu stellen wir die beiden Eigenschaften <b>Verkn&uuml;pfen von <\/b>und <b>Verkn&uuml;pfen nach <\/b>beide auf den Wert <b>WeiterbildungID <\/b>ein.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_05\/pic_956_014.png\" alt=\"Das Formular frmWeiterbildungsdetails im Entwurf\" width=\"575\" height=\"886,5765\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Das Formular frmWeiterbildungsdetails im Entwurf<\/span><\/b><\/p>\n<p>Das unterste Unterformular namens <b>sfmWeiterbildungstermine <\/b>soll die Datens&auml;tze der Tabelle <b>tblWeiterbildungstermine <\/b>anzeigen, die mit dem aktuell im Unterformular <b>sfmWeiterbildungsreihen <\/b>markierten Datensatz verkn&uuml;pft sind. Dies erfordert ein klein wenig mehr Aufwand. Zun&auml;chst stellen wir die beiden Eigenschaften <b>Verkn&uuml;pfen von <\/b>und <b>Verkn&uuml;pfen nach <\/b>ein. Verkn&uuml;pfen von erh&auml;lt das Fremdschl&uuml;sselfeld der Datenherkunft des Unterformulars als Wert, also <b>WeiterbildungsreiheID<\/b>. Die Eigenschaft <b>Verkn&uuml;pfen nach <\/b>soll nun auf das Feld <b>WeiterbildungsreiheID <\/b>des Unterformulars <b>sfmWeiterbildungsreihen <\/b>zeigen. Diesen Bezug stellen wir &uuml;ber den folgenden Ausdruck her:<\/p>\n<pre>Forms!frmWeiterbildungsdetails! sfmWeiterbildungsreihen! WeiterbildungsreiheID<\/pre>\n<p>Dies reicht allerdings noch nicht aus, damit das Unterformular <b>sfmWeiterbildungstermine <\/b>bei jedem Datensatzwechsel im Unterformular <b>sfmWeiterbildungsreihen <\/b>aktualisiert wird &#8211; stattdessen ben&ouml;tigen wir noch eine entsprechende Zeile VBA-Code, die durch das Ereignis <b>Beim Anzeigen <\/b>des Unterformulars <b>sfmWeiterbildungsreihen <\/b>ausgel&ouml;st wird.<\/p>\n<p><b>Weiterbildungsformular programmieren<\/b><\/p>\n<p>Dieses Ereignis wollen wir allerdings nicht zum Klassenmodul des Unterformulars hinzuf&uuml;gen, sondern wir wollen die komplette Steuerung vom Hauptformular aus erledigen. Dazu f&uuml;gen wir zun&auml;chst eine Objektvariable zum Klassenmodul des Hauptformulars hinzu, das uns auch erlaubt, dort die Ereignisse des Unterformulars zu implementieren:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>WithEvents  objsfmWeiterbildungsreihen<span style=\"color:blue;\"> As <\/span>Form<\/pre>\n<p>Das F&uuml;llen dieser Variable erledigen wir in der Prozedur, die durch das Ereignis <b>Beim Laden <\/b>des Hauptformulars ausgel&ouml;st wird. Dort geschehen noch eine Reihe weiterer Dinge, wie Listing 5 zeigt. Die Prozedur stellt zun&auml;chst die beiden Kombinationsfelder <b>cboDozentID <\/b>und <b>cboWeiterbildungsortID <\/b>auf den jeweils ersten Eintrag der Datensatzherkunft ein &#8211; diesen liefert die Eigenschaft <b>ItemData(0)<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Dim <\/span>datAktuell<span style=\"color:blue;\"> As Date<\/span>\r\n     Me!cboDozentID = Me!cboDozentID.ItemData(0)\r\n     Me!cboWeiterbildungsortID = Me!cboWeiterbildungsortID.ItemData(0)\r\n     datAktuell = Date\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> Weekday(datAktuell, vbMonday) = Me.Standardtag\r\n         datAktuell = datAktuell + 1\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     Me!txtStartdatum = datAktuell\r\n     <span style=\"color:blue;\">Set<\/span> objsfmWeiterbildungsreihen = Me!sfmWeiterbildungsreihen.Form\r\n     <span style=\"color:blue;\">With<\/span> objsfmWeiterbildungsreihen\r\n         .OnCurrent = \"[Event Procedure]\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Beim Laden des Hauptformulars ausgel&ouml;ste Prozedur<\/span><\/b><\/p>\n<p>Dann tr&auml;gt Sie das aktuelle Datum in die Variable <b>datAktuell <\/b>ein. Hier kommt nun das Feld <b>Standardtag <\/b>der Tabelle <b>tblWeiterbildungen <\/b>ins Spiel: Dieses soll ja einen Wochentag vorgeben, an dem die Weiterbildungstermine jeweils stattfinden. Das Formular soll nun f&uuml;r eine neue Instanz der Weiterbildung mit ihren Weiterbildungsterminen das n&auml;chste Datum vorschlagen, das diesem Wochentag entspricht &#8211; der Einfachheit halber einfach den n&auml;chsten erreichbaren. Daher beginnt die Prozedur mit dem aktuellen Datum und erh&ouml;ht dieses in einer <b>Do While<\/b>-Schleife so lange um jeweils einen Tag, bis der Zielwochentag erreicht ist. Dies entspricht nach dem Verlassen der Schleife dem in der Variablen <b>datAktuell <\/b>enthaltenen Datum, das schlie&szlig;lich im Textfeld <b>txtDatum <\/b>landet.<\/p>\n<p>Anschlie&szlig;end f&uuml;llen wir die bereits angesprochene Objektvariable <b>obj-Sfm-Weiterbildungsreihen <\/b>mit einem Verweis auf das im entsprechenden Unterformular-Steuerelement enthaltene Formular (<b>Form<\/b>). F&uuml;r dieses legen wir au&szlig;erdem noch die Ereigniseigenschaft <b>OnCurrent <\/b>fest, damit das entsprechende Ereignis im Unterformular abgegriffen und die gleich beschriebene Ereignisprozedur ausgef&uuml;hrt wird.<\/p>\n<p>Diese Ereignisprozedur sieht dann schlie&szlig;lich wie in Listing 6 aus. Damit diese ausgel&ouml;st wird, m&uuml;ssen Sie die Eigenschaft <b>Enth&auml;lt Modul <\/b>des Unterformulars &uuml;brigens unbedingt auf den Wert <b>Ja <\/b>einstellen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objsfmWeiterbildungsreihen_Current()\r\n     Me!sfmWeiterbildungstermine.Form.Requery\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Ereignisprozedur f&uuml;r das Aktualisieren des Unterformulars sfmWeiterbildungsreihen<\/span><\/b><\/p>\n<p><b>Weiterbildungsreihen hinzuf&uuml;gen<\/b><\/p>\n<p>Nun helfen uns diese beiden Unterformular aber gar nicht weiter, solange wir keine Daten haben, die wir darin anzeigen k&ouml;nnen. Also schauen wir uns an, was geschieht, wenn der Benutzer auf die Schaltfl&auml;che <b>cmdNeueWeiterbildungsreihe <\/b>klickt. Dies l&ouml;st die Prozedur aus Listing 7 aus, die zun&auml;chst einige Werte aus dem Formular einliest und in den Variablen <b>lngWeiterbildungID, lngDozentID<\/b>, <b>lngWeiterbildungsortID <\/b>und <b>datStartID <\/b>speichert. Dann legt es eine Datensatzgruppe an, die auf den Datens&auml;tzen der Tabelle <b>tblWeiterbildungsveranstaltungen <\/b>basiert, deren Feld <b>WeiterbildungID <\/b>mit dem entsprechenden Feld der Datenherkunft des Hauptformulars &uuml;bereinstimmt.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdNeueWeiterbildungsreihe_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>lngWeiterbildungsveranstaltungID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngWeiterbildungID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngWeiterbildungsreiheID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngDozentID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngWeiterbildungsortID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>datStart<span style=\"color:blue;\"> As Date<\/span>\r\n     lngWeiterbildungID = Me!WeiterbildungID\r\n     lngDozentID = Me!cboDozentID\r\n     lngWeiterbildungsortID = Me!cboWeiterbildungsortID\r\n     datStart = Me!txtStartdatum\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM tblWeiterbildungsveranstaltungen WHERE WeiterbildungID = \" _\r\n         & lngWeiterbildungID, dbOpenDynaset)\r\n     db.Execute \"INSERT INTO tblWeiterbildungsreihen(WeiterbildungID, DozentID, WeiterbildungsortID) VALUES(\" _\r\n         & lngWeiterbildungID & \", \" & lngDozentID & \", \" & lngWeiterbildungsortID & \")\", dbFailOnError\r\n     lngWeiterbildungsreiheID = db.OpenRecordset(\"SELECT @@IDENTITY\").Fields(0)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         lngWeiterbildungsveranstaltungID = rst!WeiterbildungsveranstaltungID\r\n         db.Execute \"INSERT INTO tblWeiterbildungstermine(WeiterbildungsveranstaltungID, &quot; _\r\n             &amp; &quot;Weiterbildungstermin,  WeiterbildungsreiheID) VALUES(\" _\r\n             & lngWeiterbildungsveranstaltungID & \", \" & SQLDatum(datStart) & \", \"  _\r\n             & lngWeiterbildungsreiheID & \")\", dbFailOnError\r\n         datStart = datStart + 7 * Me!Standardintervall\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     Me!sfmWeiterbildungsreihen.Form.Requery\r\n     Me!sfmWeiterbildungstermine.Form.Requery\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Anlegen einer neuen Weiterbildungsreihe samt Weiterbildungsterminen<\/span><\/b><\/p>\n<p>Dann beginnt sie mit dem Anlegen der notwendigen Datens&auml;tze. Als Erstes f&uuml;gt die Prozedur einen Datensatz zur Tabelle <b>tblWeiterbildungsreihen <\/b>hinzu, der den Prim&auml;rschl&uuml;sselwert der Weiterbildung, des Dozenten und des Weiterbildungsorts aufnimmt. Mit der Abfrage <b>SELECT @@IDENTITY <\/b>ermittelt sie den Wert des Prim&auml;rschl&uuml;sselfeldes <b>WeiterbildungsreiheID <\/b>des neu hinzugef&uuml;gten Datensatzes und speichert diesen in der Variablen <b>lngWeiterbildungsreiheID<\/b>.<\/p>\n<p>Nun sollen die Termine f&uuml;r die einzelnen Weiterbildungsveranstaltungen zur Tabelle <b>tblWeiterbildungstermine <\/b>hinzugef&uuml;gt werden. Dies geschieht in einer <b>Do While<\/b>-Schleife &uuml;ber alle Datens&auml;tze des soeben erstellten Recordsets. F&uuml;r jeden Datensatz der Tabelle <b>tblWeiterbildungsveranstaltungen<\/b>, die zur aktuellen Weiterbildung geh&ouml;ren, wird nun ein Datensatz zur Tabelle <b>tblWeiterbildungstermine <\/b>hinzugef&uuml;gt. Dabei f&uuml;llt die Prozedur die Felder <b>WeiterbildungsveranstaltungID<\/b>, <b>Weiterbildungstermin <\/b>und <b>WeiterbildungsreiheID <\/b>mit den Werten aus dem Recordset beziehungsweise aus den oben gef&uuml;llten Variablen. Beim ersten Durchlauf der <b>Do While<\/b>-Schleife wird dabei das in <b>datStart <\/b>gespeicherte Datum eingetragen. Nach dem Hinzuf&uuml;gen des Datensatzes wird das im Feld <b>Standardintervall <\/b>angegebene Wochenintervall, multipliziert mit der Zahl 7 (f&uuml;r sieben Tage), zu <b>datStart <\/b>hinzugef&uuml;gt. Schlie&szlig;lich aktualisiert die Prozedur noch die beiden Unterformulare, welche die neu angelegten Daten anzeigen.<\/p>\n<p>Das war es &#8211; so gelangt eine neue Weiterbildungsreihe in die Datenbank.<\/p>\n<p>Nun sieht das Formular in der Formularansicht wie in Bild 15 aus. Allerdings liefert das Unterformular <b>sfmWeiterbildungsreihen <\/b>leider nur die Felder aus der Tabelle <b>tblWeiterbildungsreihen<\/b>, deren Daten f&uuml;r die aktuelle Weiterbildung alle weitgehend gleich aussehen &#8211; mit Ausnahme der Prim&auml;rschl&uuml;sselwerte. Die Unterschiede liegen vor allem in den damit verkn&uuml;pften Datens&auml;tzen in der Tabelle <b>tblWeiterbildungstermine<\/b>, die ja im Unterformular weiter unten angezeigt werden. Dies hilft uns allerdings nicht weiter, wenn es bereits eine ganze Reihe Weiterbildungsreihen zu einer Weiterbildung gibt &#8211; man m&uuml;sste dann alle Eintr&auml;ge des Unterformulars <b>sfmWeiterbildungsreihen <\/b>durchsuchen, um die mit den richtigen Terminen zu finden. Also wollen wir einen Weg finden, um noch einen aussagekr&auml;ftigen Wert zu dem Unterformular mit den Weiterbildungsreihen hinzuzuf&uuml;gen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_05\/pic_956_015.png\" alt=\"Das Formular frmWeiterbildungsdetails in der Formularansicht\" width=\"575\" height=\"807,285\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 15: Das Formular frmWeiterbildungsdetails in der Formularansicht<\/span><\/b><\/p>\n<p><b>Optimieren des Unterformulars sfmWeiterbildungsreihen<\/b><\/p>\n<p>Das Unterformular soll seine Daten nun wie in Bild 16 liefern &#8211; mit dem Startdatum, also dem ersten Termin der Weiterbildungstermine, dem Dozenten, dem Ort sowie der Anzahl der Weiterbildungstermine. <\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_05\/pic_956_016.png\" alt=\"Das Formular frmWeiterbildungsdetails mit ge&auml;ndertem Unterformular\" width=\"650\" height=\"488,2138\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 16: Das Formular frmWeiterbildungsdetails mit ge&auml;ndertem Unterformular<\/span><\/b><\/p>\n<p>Dazu ben&ouml;tigen wir eine pfiffige Abfrage, deren Entwurf Sie in Bild 17 finden. Die Abfrage basiert auf den beiden Tabellen <b>tblWeiterbildungsreihen <\/b>und <b>tblWeiterbildungstermine<\/b>. Letztere kommt hinzu, weil wir ja erstens den ersten Termin dieser Reihe ermitteln wollen und zweitens die Gesamtzahl der Weiterbildungstermine. Diese Abfrage liefert standardm&auml;&szlig;ig alle Datens&auml;tze der Tabelle <b>tblWeiterbildungstermine<\/b>, wobei jeweils ein oder mehrere Eintr&auml;ge der Tabelle einem Datensatz der Tabelle <b>tblWeiterbildungsreihen <\/b>zugeordnet sind. Wir k&ouml;nnen nun durch Einf&uuml;gen einer Gruppierung nach den Feldern, die aus der Tabelle <b>tblWeiterbildungsreihen <\/b>stammen, daf&uuml;r sorgen, dass die Abfrage f&uuml;r jeden Datensatz der Tabelle <b>tblWeiterbildungsreihen <\/b>nur je einen Datensatz liefert. Das Feld <b>Weiterbildungstermin<\/b> der Tabelle <b>tblWeiterbildungstermine <\/b>wird f&uuml;r zwei auszugebende Felder verwendet. Das Feld mit der Bezeichnung <b>Startdatum <\/b>erh&auml;lt die Funktion <b>Min<\/b>, was bedeutet, dass nur der kleinste Wert zur&uuml;ckgeliefert wird &#8211; also jeweils der kleinste Wert des Feldes <b>Weiterbildungstermin<\/b> aus allen Datens&auml;tzen der Tabelle <b>tblWeiterbildungstermine<\/b>, die mit einem Datensatz der Tabelle <b>tblWeiterbildungsreihen <\/b>verkn&uuml;pft sind. &auml;hnlich l&auml;uft es mit dem Feld mit der Bezeichnung <b>Anzahl Termine<\/b>, das mit der Funktion <b>Anzahl <\/b>ausgestattet ist und dementsprechend die Anzahl der mit der Weiterbildungsreihe verkn&uuml;pften Weiterbildungstermine liefert.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_05\/pic_956_017.png\" alt=\"Neue Datenherkunft f&uuml;r das Unterformular sfmWeiterbildungsreihen\" width=\"700\" height=\"245,591\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 17: Neue Datenherkunft f&uuml;r das Unterformular sfmWeiterbildungsreihen<\/span><\/b><\/p>\n<p>Als Datenherkunft des Unterformulars <b>sfmWeiterbildungsreihen <\/b>wird diese Abfrage ja durch die Werte der Eigenschaften <b>Verkn&uuml;pfen von <\/b>und <b>Verkn&uuml;pfen nach <\/b>des Unterformular-Steuerelements auf diejenige <b>WeiterbildungID <\/b>eingeschr&auml;nkt, die gerade im Hauptformular angezeigt wird.<\/p>\n<p><b>Weiterbildungsreihe l&ouml;schen<\/b><\/p>\n<p>Normalerweise k&ouml;nnen Sie einen Datensatz in einem Unterformular einfach l&ouml;schen, indem Sie den Datensatz durch einen Klick auf den Datensatzmarkierer selektieren und dann die <b>Entfernen<\/b>-Taste bet&auml;tigen. Das klappt im Fall des Unterformulars <b>sfmWeiterbildungsreihen <\/b>leider nicht, da die als Datenherkunft verwendete Abfrage nicht aktualisierbar ist. Also f&uuml;gen wir dem Formular noch eine weitere Schaltfl&auml;che zum L&ouml;schen einer Weiterbildungsreihe hinzu. Diese l&ouml;st die Ereignisprozedur aus Listing 8 aus. Die Prozedur ermittelt den Prim&auml;rschl&uuml;sselwert der markierten Weiterbildungsreihe und l&ouml;scht diese anschlie&szlig;end. Dann aktualisiert sie die beiden betroffenen Unterformulare <b>sfmWeiterbildungsreihen <\/b>und <b>sfmWeiterbildungstermine<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdWeiterbildungsreiheLoeschen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     db.Execute \"DELETE FROM tblWeiterbildungsreihen WHERE WeiterbildungsreiheID = \" _\r\n         & Me!sfmWeiterbildungsreihen. Form!WeiterbildungsreiheID\r\n     Me!sfmWeiterbildungsreihen.Form.Requery\r\n     Me!sfmWeiterbildungstermine.Form.Requery\r\n     <span style=\"color:blue;\">Set<\/span> db = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: L&ouml;schen einer Weiterbildungsreihe<\/span><\/b><\/p>\n<p><b>Weitere Feinheiten<\/b><\/p>\n<p>Die Datensatzherk&uuml;nfte der beiden Kombinationsfelder <b>cboDozentID <\/b>und <b>cboWeiterbildungsortID <\/b>sollen gleich durch die Eingabe neuer Werte im Hauptformular erg&auml;nzt werden. Dazu legen wir zwei Ereignisprozeduren an, die jeweils durch das Ereignis <b>Bei nicht in Liste <\/b>ausgel&ouml;st werden. Die beiden Prozeduren f&uuml;hren &auml;hnliche Anweisungen aus, legen aber ihre Daten nat&uuml;rlich in verschiedenen Tabellen an. Sie finden beide Prozeduren in Listing 9. Fehlen noch die beiden Prozeduren f&uuml;r die Schaltfl&auml;chen im unteren Bereich des Formulars mit den Beschriftungen <b>OK <\/b>und <b>Abbrechen<\/b>. Die Abbrechen-Schaltfl&auml;che soll einfach die get&auml;tigten &auml;nderungen im Hauptformular verwerfen und das Formular schlie&szlig;en:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboDozentID_NotInList(NewData<span style=\"color:blue;\"> As String<\/span>, Response<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     Response = acDataErrAdded\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     db.Execute \"INSERT INTO tblDozenten(Dozent) VALUES(''\" & NewData & \"'')\", dbFailOnError\r\n     <span style=\"color:blue;\">Set<\/span> db = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>cboWeiterbildungsortID_NotInList(NewData<span style=\"color:blue;\"> As String<\/span>, Response<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     Response = acDataErrAdded\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     db.Execute \"INSERT INTO tblWeiterbildungsorte(Weiterbildungsort) &quot; _\r\n         &amp; &quot;VALUES(''\" & NewData & \"'')\", dbFailOnError\r\n     <span style=\"color:blue;\">Set<\/span> db = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 9: Anlegen neuer Eintr&auml;ge f&uuml;r die beiden Kombinationsfelder cboDozentID und cboWeiterbildungsortID<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAbbrechen_Click()\r\n     Me.Undo\r\n     DoCmd.Close acForm, Me.Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Schaltfl&auml;che <b>OK <\/b>soll das Formular unsichtbar machen, damit eventuelle &auml;nderungen vom aufrufenden Formular &uuml;bernommen werden k&ouml;nnen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdOK_Click()\r\n     Me.Visible = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Weiterbildungsteilnahmen<\/b><\/p>\n<p>Nun fehlt noch eine entscheidende Funktion: Nat&uuml;rlich m&uuml;ssen wir den Mitarbeitern auch noch die Weiterbildungen zuweisen k&ouml;nnen. Zuerst m&uuml;ssen wir die entsprechenden &auml;nderungen am Datenmodell durchf&uuml;hren, denn es gibt ja noch gar keine Verkn&uuml;pfung zwischen den Mitarbeitern und den Weiterbildungen. Und auch hier stellt sich die Frage, wo wir ansetzen.<\/p>\n<p>Auf den ersten Blick w&uuml;rde man zun&auml;chst eine Verkn&uuml;pfungs-tabelle zum Datenmodell hinzuf&uuml;gen, welche die Tabellen <b>tblMitarbeiter <\/b>und <b>tblWeiterbildungen <\/b>verbindet. Damit l&auml;sst sich zun&auml;chst einmal festlegen, an welchen Weiterbildungen der Mitarbeiter &uuml;berhaupt teilnehmen soll. Daraus wollen wir eine Terminliste f&uuml;r den Mitarbeiter ableiten, welche die Terminliste zumindest einer Weiterbildungsreihe enth&auml;lt. Hier stellt sich eine weitere Frage: Muss ein Mitarbeiter zwingend die Termine einer speziellen Weiterbildungsreihe wahrnehmen oder kann er, soweit angeboten, auch erst zwei Termine der ersten Weiterbildungsreihe besuchen und dann einen weiteren Termin einer anderen Weiterbildungsreihe zur gleichen Weiterbildung In dieser Beispiell&ouml;sung wollen wir diese lockere Variante w&auml;hlen. Das hei&szlig;t nun f&uuml;r das Datenmodell, dass wir eine Verkn&uuml;pfungstabelle zwischen <b>tblMitarbeiter <\/b>und <b>tblWeiterbildungen <\/b>hinzuf&uuml;gen, die wie in Bild 18 aussieht.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_05\/pic_956_018.png\" alt=\"Verkn&uuml;pfungstabelle zur Zuordnung der Weiterbildungen zu den Mitarbeitern\" width=\"575\" height=\"347,9827\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 18: Verkn&uuml;pfungstabelle zur Zuordnung der Weiterbildungen zu den Mitarbeitern<\/span><\/b><\/p>\n<p>Neben dem Prim&auml;rschl&uuml;sselfeld enth&auml;lt die Tabelle die beiden Fremdschl&uuml;sselfelder zur Herstellung der Beziehung zwischen den beteiligten Tabellen sowie ein Feld namens <b>AngemeldetAm<\/b>, welches das Anmeldedatum aufnimmt.<\/p>\n<p>Im Gegensatz zu vielen anderen Verkn&uuml;pfungstabellen ben&ouml;tigen wir hier keinen zusammengesetzten, eindeutigen Index f&uuml;r die beiden Felder <b>WeiterbildungID <\/b>und <b>MitarbeiterID<\/b>, da ja jeder Mitarbeiter  durchaus mehrmals die gleiche Weiterbildung besuchen kann.<\/p>\n<p><b>Weiterbildungstermine dokumentieren<\/b><\/p>\n<p>Um nachvollziehen zu k&ouml;nnen, welche Weiterbildungen ein Mitarbeiter vollst&auml;ndig besucht hat, m&uuml;ssen die einzelnen Besuche dokumentiert werden. Wir ben&ouml;tigen also zweifelsohne eine weitere &auml;nderung am Datenmodell, um die Datumsangaben f&uuml;r die Besuche der Weiterbildungstermine eintragen zu k&ouml;nnen. Diese Tabelle sollte, da ein Mitarbeiter ja an jeder Weiterbildung mehrfach teilnehmen k&ouml;nnen soll, auch einen Bezug zur Tabelle <b>tblWeiterbildungenMitarbeiter<\/b> haben. So k&ouml;nnen wir festlegen, dass ein Weiterbildungstermin zu einer bestimmten Anmeldung eines Mitarbeiters f&uuml;r eine Weiterbildung geh&ouml;rt. Die Tabelle <b>tblMitarbeiterWeiterbildungstermine <\/b>&uuml;bernimmt schlie&szlig;lich die Verkn&uuml;pfung von Mitarbeiter, Weiterbildungstermin und der Weiterbildung (s. Bild 19).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_05\/pic_956_019.png\" alt=\"Zuordnung der Mitarbeiter zu den Weiterbildungsterminen\" width=\"575\" height=\"298,0991\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 19: Zuordnung der Mitarbeiter zu den Weiterbildungsterminen<\/span><\/b><\/p>\n<p><b>Mitarbeiter und Weiterbildungen zuordnen<\/b><\/p>\n<p>Theoretisch gibt es zwei Orte, an denen man Mitarbeiter und Weiterbildungen verkn&uuml;pfen kann: Man k&ouml;nnte sowohl im Detailformular zum jeweiligen Mitarbeiter die Weiterbildungen eintragen, aber auch ein Formular anlegen, das die Weiterbildung anzeigt und alle hinzugef&uuml;gten Teilnehmer. Wir erledigen dies zun&auml;chst &uuml;ber das Formular <b>frmMitarbeiterDetails<\/b>.<\/p>\n<p>Diesem f&uuml;gen wir wie in Bild 20 das Unterformular <b>sfmMitarbeiterWeiterbildungen <\/b>hinzu. Dieses verwendet die Tabelle <b>tblMitarbeiterWeiterbildungen <\/b>als Datenherkunft und zeigt die Daten in der Datenblattansicht an. Damit es nur die dem Mitarbeiter zugeordneten Datens&auml;tze dieser Tabelle anzeigt, sollten die beiden Eigenschaften <b>Verkn&uuml;pfen von <\/b>und <b>Verkn&uuml;pfen nach <\/b>des Unterformular-Steuerelements jeweils den Wert <b>MitarbeiterID <\/b>aufweisen. Das Formular zeigt nur die beiden Felder <b>WeiterbildungID <\/b>(als Kombinationsfeld) sowie das Feld <b>AngemeldetAm <\/b>an. Mit Ersterem w&auml;hlen Sie die hinzuzuf&uuml;gende Weiterbildung aus, mit dem zweiten geben Sie an, wann die Weiterbildung dem Mitarbeiter hinzugef&uuml;gt wurde.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_05\/pic_956_020.png\" alt=\"Unterformular zum Zuweisen von Weiterbildungen zu einem Mitarbeiter\" width=\"575\" height=\"240,3997\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 20: Unterformular zum Zuweisen von Weiterbildungen zu einem Mitarbeiter<\/span><\/b><\/p>\n<p><b>Veranstaltungsliste erstellen<\/b><\/p>\n<p>Wenn eine Weiterbildung f&uuml;r einen Mitarbeiter festgelegt wurde, soll eine Liste mit den Weiterbildungsveranstaltungen f&uuml;r den Mitarbeiter erstellt werden. Dieser werden dann nach der Durchf&uuml;hrung die Termine hinzuf&uuml;gt, an denen der Mitarbeiter die Weiterbildungsveranstaltungen besucht hat.<\/p>\n<p>Nun f&uuml;gen wir ein weiteres Unterformular namens <b>sfmMitarbeiterWeiterbildungstermine <\/b>zum Formular hinzu. Dieses nimmt die Daten der Tabelle <b>tblMitarbeiterWeiterbildungstermine <\/b>auf und zeigt die Felder <b>WeiterbildungsveranstaltungID <\/b>und <b>WeiterbildungDurchgef&uuml;hrtAm<\/b> an. Zwischen den beiden Formularen positionieren wir eine Schaltfl&auml;che, mit welcher der Benutzer nach dem Hinzuf&uuml;gen einer Weiterbildung zum Mitarbeiter die Veranstaltungen in die Tabelle <b>tblMitarbeiterWeiterbildungstermine <\/b>eintragen kann. Diese sollen dann direkt im Anschluss im unteren Unterformular abgebildet werden.<\/p>\n<p>Das zweite Unterformular muss dementsprechend wieder mit den Daten des ersten Unterformulars verkn&uuml;pft sein, was wir zun&auml;chst durch die Festlegung der Eigenschaften des Unterformular-Steuerelements realisieren. Dazu stellen wir <b>Verkn&uuml;pfen von <\/b>auf <b>WeiterbildungMitarbeiterID <\/b>ein. Die Eigenschaft <b>Verkn&uuml;pfen nach <\/b>soll das entsprechende Feld im ersten Unterformular referenzieren, was wir durch den folgenden Ausdruck erreichen:<\/p>\n<pre>Forms!frmMitarbeiterDetails! sfmMitarbeiterWeiterbildungen! WeiterbildungMitarbeiterID<\/pre>\n<p>Dies alles zeigt Bild 21 im Entwurf. Damit die Daten des zweiten Unterformulars bei jeder &auml;nderung des aktuellen Datensatzes im ersten Unterformular aktualisiert werden, gehen wie bereits weiter oben beschrieben vor. Wir deklarieren also wieder eine Objektvariable f&uuml;r das Unterformular:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_05\/pic_956_021.png\" alt=\"Abh&auml;ngige Unterformulare und Schaltfl&auml;che zum Anlegen von Terminen\" width=\"575\" height=\"431,646\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 21: Abh&auml;ngige Unterformulare und Schaltfl&auml;che zum Anlegen von Terminen<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>WithEvents  objSfmMitarbeiterWeiterbildungen<span style=\"color:blue;\"> As <\/span>Form<\/pre>\n<p>Dann weisen wir diesem beim Laden des Formulars einen Verweis auf das Unterformular zu. Au&szlig;erdem legen wir dort fest, dass wir in diesem Klassenmodul auf die beiden Ereignisse <b>Beim Anzeigen <\/b>(<b>OnCurrent<\/b>) und <b>Nach L&ouml;schbest&auml;tigung <\/b>(<b>AfterDelConfirm<\/b>) reagieren wollen (s. Listing 10).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Set<\/span> objSfmMitarbeiterWeiterbildungen = Me!sfmMitarbeiterWeiterbildungen.Form\r\n     <span style=\"color:blue;\">With<\/span> objSfmMitarbeiterWeiterbildungen\r\n         .OnCurrent = \"[Event Procedure]\"\r\n         .AfterDelConfirm = \"[Event Procedure]\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 10: Verweis auf ein Unterformular f&uuml;llen<\/span><\/b><\/p>\n<p>Beim Anzeigen eines Datensatzes im ersten Unterformular soll das zweite Unterformular ebenfalls aktualisiert werden. Dies erledigt die Prozedur aus Listing 11. Die Abfrage, ob das Feld <b>WeiterbildungID <\/b>leer ist, beugt dem Fehler vor, der beim L&ouml;schen eines Datensatzes aus dem oberen Unterformular und der folgenden Aktualisierung des unteren Unterformulars ausgel&ouml;st w&uuml;rde.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objSfmMitarbeiterWeiterbildungen_Current()\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(objSfmMitarbeiterWeiterbildungen.WeiterbildungID)<span style=\"color:blue;\"> Then<\/span>\r\n         Me!sfmMitarbeiterWeiterbildungstermine.Form.Requery\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 11: Unterformular aktualisieren, wenn anderes Unterformular aktualisiert wird<\/span><\/b><\/p>\n<p>Die Prozedur aus Listing 12 schlie&szlig;lich aktualisiert das zweite Unterformular auch dann, wenn der Benutzer den aktuellen Datensatz im ersten Unterformular l&ouml;scht. Schauen wir uns nun an, wie wir die Termine zu der Tabelle <b>tblMitarbeiterWeiterbildungstermine <\/b>zuweisen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objSfmMitarbeiterWeiterbildungen_AfterDelConfirm(Status<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Me!sfmMitarbeiterWeiterbildungstermine.Form.Requery\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 12: Auch nach dem L&ouml;schen soll eine Aktualisierung erfolgen.<\/span><\/b><\/p>\n<p>Dies erledigt die Prozedur aus Listing 13. Im Gegensatz zu einem Beispiel von weiter oben durchlaufen wir nun nicht alle Datens&auml;tze der Tabelle <b>tblWeiterbildungsveranstaltungen <\/b>in einer <b>Do While<\/b>-Schleife, um zu jedem Datensatz einen neuen Datensatz in der Tabelle <b>tblMitarbeiterWeiterbildungstermine <\/b>anzulegen, sondern erledigen dies hier mit der eleganteren, aber un&uuml;bersichtlicheren Variante per <b>INSERT INTO<\/b>-Anweisung &uuml;ber alle betroffenen Datens&auml;tze.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdVeranstaltungenHinzufuegen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     RunCommand acCmdSaveRecord\r\n     db.Execute \"INSERT INTO tblMitarbeiterWeiterbildungstermine(WeiterbildungMitarbeiterID, &quot; _\r\n         &amp; &quot;WeiterbildungsveranstaltungID)  SELECT \" _\r\n         & Me!sfmMitarbeiterWeiterbildungen.Form!WeiterbildungMitarbeiterID _\r\n         & \" AS WeiterbildungMitarbeiterID,  WeiterbildungsveranstaltungID &quot; _\r\n         &amp; &quot;FROM tblWeiterbildungsveranstaltungen WHERE WeiterbildungID = \"  _\r\n         & Me!sfmMitarbeiterWeiterbildungen.Form!WeiterbildungID, dbFailOnError\r\n     Me!sfmMitarbeiterWeiterbildungstermine.Form.Requery\r\n     <span style=\"color:blue;\">Set<\/span> db = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 13: Anlegen der Termine zu einer Weiterbildung f&uuml;r einen Mitarbeiter<\/span><\/b><\/p>\n<p>Dabei f&uuml;llen wir das Feld <b>WeiterbildungMitarbeiterID <\/b>mit dem Prim&auml;rschl&uuml;sselfeld des aktuellen Datensatzes aus dem oberen Unterformular und das Feld <b>WeiterbildungsveranstaltungID <\/b>mit dem entsprechenden Wert aus der Quelltabelle <b>tblWeiterbildungsveranstaltungen<\/b>. Dies alles nat&uuml;rlich nur f&uuml;r die Datens&auml;tze, deren Feld <b>WeiterbildungID <\/b>zu der hier betroffenen Weiterbildung geh&ouml;rt. Schlie&szlig;lich wird noch das untere Unterformular aktualisiert. Das Ergebnis sieht in der Formularansicht nun wie in Bild 22 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_05\/pic_956_022.png\" alt=\"Die Mitarbeiterdetails mit Weiterbildungen und Weiterbildungsterminen\" width=\"575\" height=\"400,336\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 22: Die Mitarbeiterdetails mit Weiterbildungen und Weiterbildungsterminen<\/span><\/b><\/p>\n<p><b>Absolvierte Termine eintragen<\/b><\/p>\n<p>Die Frage ist nun jedoch: Wie geben wir die absolvierten Weiterbildungstermine in das Formular ein Die sch&ouml;nste M&ouml;glichkeit w&auml;re: Das Unterformular bietet zu jeder Veranstaltung per Kombinationsfeld die Auswahl der verf&uuml;gbaren Weiterbildungstermine an. Dies ist allerdings problematisch, da das Kombinationsfeld seine Daten dann in Abh&auml;ngigkeit von einem Wert im gleichen Datensatz anzeigen m&uuml;sste. Dies ist aber nicht mit vertretbarem Aufwand realisierbar. Wir m&ouml;chten aber auf irgendeine Weise die Weiterbildungsveranstaltungen zur gew&uuml;nschten Weiterbildung sehen und eine M&ouml;glichkeit haben, einen der zur aktuellen Weiterbildungsveranstaltung passenden Weiterbildungstermin auszuw&auml;hlen. Anderenfalls k&ouml;nnte der Benutzer ja die Termine von Hand eintragen, was aber den Nachteil mit sich bringen w&uuml;rde, dass er auch Termine eintragen k&ouml;nnte, die f&uuml;r die Weiterbildungsveranstaltung gar nicht angeboten werden. Also suchen wir eine alternative L&ouml;sung, welche die Auswahl der verf&uuml;gbaren Datumsangaben erlaubt. Dazu nutzen wir eine Technik, die wir im Detail im Beitrag <b>Kontextmen&uuml; statt Kombinationsfeld <\/b>vorstellen (<b>www.access-im-unternehmen.de\/953<\/b>). Diese sorgt daf&uuml;r, dass wir die verf&uuml;gbaren Termine ganz einfach per Klick auf das Textfeld per Kontextmen&uuml; ausw&auml;hlen k&ouml;nnen (s. Bild 23).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_05\/pic_956_023.png\" alt=\"Auswahl der verf&uuml;gbaren Datumsangaben per Kontextmen&uuml;\" width=\"450\" height=\"209,5285\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 23: Auswahl der verf&uuml;gbaren Datumsangaben per Kontextmen&uuml;<\/span><\/b><\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Der erste Teil dieser Beitragsreihe zeigt das Datenmodell der Weiterbildungsverwaltung und liefert die grundlegenden Formulare zur Eingabe der Daten zu den Mitarbeitern und zu den Weiterbildungen.<\/p>\n<p>Im zweiten Teil der Reihe zeigen wir, wie Sie die Mitarbeiter komfortabel aus einer Liste zu einer Weiterbildung hinzuf&uuml;gen oder wieder entfernen k&ouml;nnen.<\/p>\n<p>Au&szlig;erdem lernen Sie einige Berichte kennen, die etwa eine Liste der Weiterbildungstermine f&uuml;r einen Mitarbeiter enthalten oder &uuml;bersichten der Teilnehmer einer Weiterbildung.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>WeiterbildungenVerwalten.accdb<\/p>\n<p>WeiterbildungenVerwalten.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{C9480858-FFB9-473C-843A-25E87108C5EB}\/aiu_956.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In diesem Beitrag k&uuml;mmern wir uns um die Verwaltung von Weiterbildungen f&uuml;r Mitarbeiter. Dabei soll man f&uuml;r jede Weiterbildung mehrere Einheiten beziehungsweise Termine festlegen k&ouml;nnen, die dann beliebig oft angeboten werden k&ouml;nnen. Den Mitarbeitern teilt man mit der Beispielanwendung die Weiterbildungen zu und kann die Teilnahme eines jeden Mitarbeiters an den einzelnen Terminen protokollieren.<\/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":[662014,66052014,44000027],"tags":[],"class_list":["post-55000956","post","type-post","status-publish","format-standard","hentry","category-662014","category-66052014","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Weiterbildungen verwalten, Teil I - 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\/Weiterbildungen_verwalten_Teil_I\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Weiterbildungen verwalten, Teil I\" \/>\n<meta property=\"og:description\" content=\"In diesem Beitrag k&uuml;mmern wir uns um die Verwaltung von Weiterbildungen f&uuml;r Mitarbeiter. Dabei soll man f&uuml;r jede Weiterbildung mehrere Einheiten beziehungsweise Termine festlegen k&ouml;nnen, die dann beliebig oft angeboten werden k&ouml;nnen. Den Mitarbeitern teilt man mit der Beispielanwendung die Weiterbildungen zu und kann die Teilnahme eines jeden Mitarbeiters an den einzelnen Terminen protokollieren.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Weiterbildungen_verwalten_Teil_I\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:13:08+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/2e36c8a4c354437a98751cbf4c93c7eb\" \/>\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=\"31\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Weiterbildungen_verwalten_Teil_I\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Weiterbildungen_verwalten_Teil_I\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Weiterbildungen verwalten, Teil I\",\"datePublished\":\"2020-05-22T21:13:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Weiterbildungen_verwalten_Teil_I\\\/\"},\"wordCount\":5708,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Weiterbildungen_verwalten_Teil_I\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/2e36c8a4c354437a98751cbf4c93c7eb\",\"articleSection\":[\"2014\",\"5\\\/2014\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Weiterbildungen_verwalten_Teil_I\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Weiterbildungen_verwalten_Teil_I\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Weiterbildungen_verwalten_Teil_I\\\/\",\"name\":\"Weiterbildungen verwalten, Teil I - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Weiterbildungen_verwalten_Teil_I\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Weiterbildungen_verwalten_Teil_I\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/2e36c8a4c354437a98751cbf4c93c7eb\",\"datePublished\":\"2020-05-22T21:13:08+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Weiterbildungen_verwalten_Teil_I\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Weiterbildungen_verwalten_Teil_I\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Weiterbildungen_verwalten_Teil_I\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/2e36c8a4c354437a98751cbf4c93c7eb\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/2e36c8a4c354437a98751cbf4c93c7eb\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Weiterbildungen_verwalten_Teil_I\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Weiterbildungen verwalten, Teil I\"}]},{\"@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":"Weiterbildungen verwalten, Teil I - 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\/Weiterbildungen_verwalten_Teil_I\/","og_locale":"de_DE","og_type":"article","og_title":"Weiterbildungen verwalten, Teil I","og_description":"In diesem Beitrag k&uuml;mmern wir uns um die Verwaltung von Weiterbildungen f&uuml;r Mitarbeiter. Dabei soll man f&uuml;r jede Weiterbildung mehrere Einheiten beziehungsweise Termine festlegen k&ouml;nnen, die dann beliebig oft angeboten werden k&ouml;nnen. Den Mitarbeitern teilt man mit der Beispielanwendung die Weiterbildungen zu und kann die Teilnahme eines jeden Mitarbeiters an den einzelnen Terminen protokollieren.","og_url":"https:\/\/access-im-unternehmen.de\/Weiterbildungen_verwalten_Teil_I\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:13:08+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/2e36c8a4c354437a98751cbf4c93c7eb","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"31\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Weiterbildungen_verwalten_Teil_I\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Weiterbildungen_verwalten_Teil_I\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Weiterbildungen verwalten, Teil I","datePublished":"2020-05-22T21:13:08+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Weiterbildungen_verwalten_Teil_I\/"},"wordCount":5708,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Weiterbildungen_verwalten_Teil_I\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/2e36c8a4c354437a98751cbf4c93c7eb","articleSection":["2014","5\/2014","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Weiterbildungen_verwalten_Teil_I\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Weiterbildungen_verwalten_Teil_I\/","url":"https:\/\/access-im-unternehmen.de\/Weiterbildungen_verwalten_Teil_I\/","name":"Weiterbildungen verwalten, Teil I - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Weiterbildungen_verwalten_Teil_I\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Weiterbildungen_verwalten_Teil_I\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/2e36c8a4c354437a98751cbf4c93c7eb","datePublished":"2020-05-22T21:13:08+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Weiterbildungen_verwalten_Teil_I\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Weiterbildungen_verwalten_Teil_I\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Weiterbildungen_verwalten_Teil_I\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/2e36c8a4c354437a98751cbf4c93c7eb","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/2e36c8a4c354437a98751cbf4c93c7eb"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Weiterbildungen_verwalten_Teil_I\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Weiterbildungen verwalten, Teil I"}]},{"@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\/55000956","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=55000956"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000956\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000956"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000956"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000956"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}