{"id":55001107,"date":"2017-12-01T00:00:00","date_gmt":"2020-05-13T21:27:32","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1107"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Vereinsverwaltung_Migration","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Vereinsverwaltung_Migration\/","title":{"rendered":"Vereinsverwaltung: Migration"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/7bd427dbffd64301bba568080bdf58cf\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Im Beitrag &#8222;Vereinsverwaltung: Von Excel zum Datenmodell&#8220; haben wir gezeigt, wie Sie eine exemplarische Excel-Tabelle mit den Daten zur Mitgliedsverwaltung in ein -Access-Datenmodell umwandeln. Dabei haben wir die Daten der Excel-Datei bereits in der Datenbank verf&uuml;gbar gemacht. Neben der damit verbundenen konzeptionellen Arbeit kommt nun der interessante Teil: die Programmierung von VBA-Code und Abfragen, um die Daten aus der monolithischen Excel-Tabelle in das Datenmodell zu &uuml;bertragen.<\/b><\/p>\n<p>Dabei haben wir einige Brocken bereits aus dem Weg ger&auml;umt: Die Excel-Tabelle enthielt n&auml;mlich beispielsweise nicht nur reine Daten in Form von Zahlen und Buchstaben, sondern auch verschiedene Markierungen in Form von verschiedenen Hintergrundfarben, fett gedrucktem Text oder farbigem Text. Diese haben wir bereits in der Excel-Tabelle in entsprechende Werte umgewandelt, die wie allerdings auf den folgenden Seiten noch interpretieren m&uuml;ssen.<\/p>\n<h2>Schritt 1: Mitglieder &uuml;bertragen<\/h2>\n<p>Die Basis der beiden Tabellen, also der Ausgangstabelle im Excel-Format als auch der Zieltabellen ist eine Tabelle zum Speichern der Personen, hier von Mitgliedern eines Sportvereins. Damit k&ouml;nnen wir auch beginnen. Die Tabelle Mitglieder enth&auml;lt alle Daten, welche die Excel-Tabelle uns bereitgestellt hat. Daraus suchen wir uns nun die Felder heraus, die in die von uns entworfenen Tabelle <b>tblMitglieder <\/b>passen.<\/p>\n<p>Der Automatismus zum Migrieren der Daten besteht aus ein paar Abfrage, welche uns die Daten in der gew&uuml;nschten Form extrahieren, sowie einer VBA-Prozedur im Modul <b>mdlMigration<\/b>. Diese hei&szlig;t <b>Migrieren <\/b>und steuert die Migration der Daten aus der Excel-Tabelle in die Tabellen unseres Datenmodells.<\/p>\n<p>F&uuml;r die &uuml;bernahme der Daten aus der Tabelle <b>Mitglieder <\/b>in die Tabelle <b>tblMitglieder <\/b>erstellen wir eine Abfrage auf Basis der Tabelle <b>Mitglieder<\/b>. Dieser f&uuml;gen wir also nach dem Erstellen zun&auml;chst die Tabelle <b>Mitglieder <\/b>aus dem Dialog <b>Tabellen anzeigen <\/b>hinzu &#8211; mit dem Ergebnis aus Bild 1.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_06\/pic_1107_001.png\" alt=\"Anlegen einer Abfrage zum &uuml;bernehmen der Stammdaten\" width=\"499,6607\" height=\"309,6111\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Anlegen einer Abfrage zum &uuml;bernehmen der Stammdaten<\/span><\/b><\/p>\n<p>Wir wollen aus dieser Abfrage eine Anf&uuml;geabfrage machen, welche Daten aus der Tabelle <b>Mitglieder <\/b>an die Tabelle <b>tblMitglieder <\/b>anf&uuml;gt. Dazu w&auml;hlen Sie aus dem Ribbon den Befehl <b>Entwurf|Abfragetyp|Anf&uuml;gen <\/b>aus.<\/p>\n<p>Dies &ouml;ffnet den Dialog <b>Anf&uuml;gen<\/b>, mit dem Sie die Tabelle <b>tblMitglieder <\/b>als Zieltabelle festlegen (s. Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_06\/pic_1107_002.png\" alt=\"Angabe der Zieltabelle\" width=\"499,6607\" height=\"325,3989\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Angabe der Zieltabelle<\/span><\/b><\/p>\n<p>Danach k&ouml;nnen Sie die Felder der Quelltabelle aus der Liste im oberen Bereich in das Entwurfsraster ziehen oder per Doppelklick dorthin bef&ouml;rdern. Sofern Access automatisch ein gleichnamiges Feld in der Zieltabelle erkennt, f&uuml;gt es direkt einen entsprechenden Eintrag in die Zeile <b>Anf&uuml;gename<\/b> ein. Sollte dies nicht automatisch funktionieren, was etwa beim Feld <b>Geb.-Datum<\/b> der Fall ist, w&auml;hlen Sie das Zielfeld selbst aus &#8211; in diesem Fall <b>Geburtsdatum <\/b>(s. Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_06\/pic_1107_003.png\" alt=\"Auswahl der Zielfelder\" width=\"499,6607\" height=\"419,8098\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Auswahl der Zielfelder<\/span><\/b><\/p>\n<p>Nun gibt es beim Feld <b>PLZ<\/b> das erste Hindernis: Wir haben ja schon beim Import der Tabelle gesehen, dass Access das zun&auml;chst vorgesehene Zahlenfeld nicht komplett f&uuml;llen konnte, da einige Datens&auml;tze einen zus&auml;tzlichen Buchstaben enthielten &#8211; n&auml;mlich den f&uuml;hrenden L&auml;ndercode etwa in <b>CH-8005<\/b>. Genau genommen liefert das Feld <b>PLZ <\/b>f&uuml;r die Schweizer Mitglieder das L&auml;nderk&uuml;rzel, die Postleitzahl und auch noch den Ort &#8211; warum auch immer der Ersteller das so gemacht hat: Die Daten geh&ouml;ren nat&uuml;rlich auf drei Felder aufgeteilt. Also &auml;ndern wir den Ausdruck f&uuml;r das Feld <b>PLZ <\/b>ein wenig um:<\/p>\n<pre>PLZ: Wert(Ersetzen([Postlz];\"CH-\";\"\"))<\/pre>\n<p>Dieser Ausdruck ersetzt zun&auml;chst im Feld <b>Postlz <\/b>die Zeichenfolge <b>CH- <\/b>durch eine leere Zeichenfolge. Aus <b>CH-8005 Z&uuml;rich <\/b>wird dann schon einmal <b>8005 Z&uuml;rich<\/b>. Wie erhalten wir davon nur die f&uuml;hrenden Ziffern Ganz einfach &#8211; mit der <b>Wert<\/b>-Funktion (unter VBA <b>Val<\/b>).<\/p>\n<p>Der Ort k&ouml;nnte so einfach sein, wenn dieser nicht f&uuml;r die oben genannten F&auml;lle komplett in der Zeile <b>Postlz <\/b>stehen w&uuml;rde und f&uuml;r alle anderen in der Spalte <b>Ort<\/b>. Doch mit ein wenig Geschick erhalten wir die gew&uuml;nschten Werte. Dazu legen wir f&uuml;r das Feld <b>Ort <\/b>einen neuen Ausdruck namens <b>OrtX <\/b>an (damit es keinen Zirkelbezug gibt) und f&uuml;llen diesen mit der folgenden Formel:<\/p>\n<pre>OrtX: Wenn(IstNull([Ort]);Teil([Postlz];<span style=\"color:blue;\">InStrRev<\/span>([Postlz];\" \")+1);[Ort])<\/pre>\n<p>Hier finden wir eine <b>Wenn<\/b>-Bedingung, die im ersten Abschnitt pr&uuml;ft, ob Ort den Wert <b>Null <\/b>enth&auml;lt. In diesem Fall ermitteln wir aus dem Feld <b>Postlz <\/b>den Teil hinter dem letzten gefundenen Leerzeichen &#8211; bei <b>CH-8005   Z&uuml;rich <\/b>liefert dies also <b>Z&uuml;rich<\/b>. Ist das Feld <b>Ort <\/b>nicht leer, liefern wir einfach den Wert dieses Feldes zur&uuml;ck.<\/p>\n<p>Komplizierter wird es mit dem Land, denn da wir ja nun die L&auml;nderkennzeichen aus der Postleitzahl entfernen wollen, soll das Land in das Feld <b>Land<\/b> eingetragen werden. Das ist auch interessant, weil wir in der Ursprungstabelle &uuml;berhaupt kein Feld haben, welches das Land angibt. Wir gehen aber davon aus, dass alle Datens&auml;tze, die nicht das L&auml;nderk&uuml;rzel <b>CH <\/b>in der Postleitzahl tragen, Deutschland als Land aufweisen. Also verwenden wir den folgenden Ausdruck:<\/p>\n<pre>Land: Wenn(Wenn(<span style=\"color:blue;\">InStr<\/span>([postlz];\"-\")&gt;0;Links([postlz];<span style=\"color:blue;\">InStr<\/span>([postlz];\"-\")-1);\"DE\")=''''CH'''';''''Schweiz'''';''''Deutschland'''')<\/pre>\n<p>Hier haben wir es mit ein paar Verschachtelungen zu tun. Die innere <b>Wenn<\/b>-Bedingung liefert das L&auml;nderk&uuml;rzel, wenn <b>Postlz <\/b>ein Minuszeichen enth&auml;lt, wenn kein Minuszeichen vorliegt, folgt <b>DE <\/b>als L&auml;nderkennzeichen.<\/p>\n<p>Die &auml;u&szlig;ere <b>Wenn<\/b>-Bedingung liefert das Land <b>Schweiz<\/b>, wenn das von der inneren Bedingung gelieferte K&uuml;rzel <b>CH <\/b>lautet, sonst <b>Deutschland<\/b>. Das ist zugegebenerma&szlig;en improvisiert und wird kompliziert, wenn es mehr solcher Sonderf&auml;lle gibt.<\/p>\n<p>An einer solchen Stelle muss man dann entscheiden, ob man doch manuell die fehlerhaften Datens&auml;tze anpasst oder gegebenenfalls eine VBA-Routine baut, die etwas &uuml;bersichtlicher daherkommt.<\/p>\n<p>Diese k&ouml;nnte etwa wie folgt aussehen:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>LandErmitteln(strPLZ<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strLaenderkuerzel<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intPosStrich<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strLand<span style=\"color:blue;\"> As String<\/span>\r\n     intPosStrich = <span style=\"color:blue;\">InStr<\/span>(strPLZ, \"-\")\r\n     <span style=\"color:blue;\">If <\/span>intPosStrich = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strLand = \"Deutschland\"\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         strLaenderkuerzel = <span style=\"color:blue;\">Left<\/span>(strPLZ, intPosStrich - 1)\r\n         Select Case strLaenderkuerzel\r\n             <span style=\"color:blue;\">Case <\/span>\"CH\"\r\n                 strLand = \"Schweiz\"\r\n             <span style=\"color:blue;\">Case <\/span>\"NL\"\r\n                 strLand = \"Niederlande\"\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     LandErmitteln = strLand\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>In der Abfrage greifen Sie wie folgt auf diese Funktion zu:<\/p>\n<pre>Land: LandErmitteln([Postlz])<\/pre>\n<p>Die Funktion erh&auml;lt den Wert f&uuml;r das Feld <b>Postlz <\/b>als Parameterwert. Sie ermittelt dann die Position des ersten Minuszeichens und speichert diese in der Variablen <b>intPosStrich<\/b>.<\/p>\n<p>Ist kein Minuszeichen vorhanden, erh&auml;lt die Variable den Wert <b>0<\/b>. In diesem Fall liefert die Funktion <b>Deutschland<\/b> zur&uuml;ck. Anderenfalls liest sie das L&auml;nderk&uuml;rzel aus und weist in einer <b>Select Case<\/b>-Bedingung die Bezeichnung des entsprechenden Landes zu.<\/p>\n<h2>PLZ und Ort per VBA<\/h2>\n<p>F&uuml;r den Fall, dass mehrere L&auml;nder hinzukommen, stellen wir auch die Ermittlung von <b>PLZ <\/b>und <b>Ort <\/b>noch auf VBA um. F&uuml;r die PLZ sieht die Funktion wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>PLZErmitteln(strPLZ<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strLaenderkuerzel<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intPosStrich<span style=\"color:blue;\"> As Integer<\/span>\r\n     intPosStrich = <span style=\"color:blue;\">InStr<\/span>(strPLZ, \"-\")\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> intPosStrich = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strPLZ = <span style=\"color:blue;\">Mid<\/span>(strPLZ, intPosStrich + 1)\r\n         strPLZ = Val(strPLZ)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     PLZErmitteln = strPLZ\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p>Die Funktion nimmt den Werte des Feldes <b>Postlz <\/b>entgegen und ermittelt die Position des Minuszeichens. Wenn der so ermittelte Wert gr&ouml;&szlig;er als 0 ist, ist ein Minuszeichen vorhanden. In diesem Fall entfernt die Funktion zuerst den Teil vor dem Minuszeichen inklusive Minuszeichen.<\/p>\n<p>Im zweiten Schritt ermittelt sie mit der <b>Val<\/b>-Funktion alle Ziffern bis zum ersten Zeichen, das keine Ziffer ist, und gibt das Ergebnis zur&uuml;ck. Sollte der Parameter <b>strPLZ <\/b>eine einfache PLZ liefern, wird diese als Funktionsergebnis zur&uuml;ckgegeben.<\/p>\n<p>Der Ausdruck im Feld der Abfrage lautet:<\/p>\n<pre>PLZ: PLZErmitteln([Postlz])<\/pre>\n<p>Den Ort ermitteln wir, indem wir die PLZ und den Ort untersuchen und diese Felder auch als Parameter &uuml;bergeben. Das ist problemlos m&ouml;glich, wie der folgende Ausdruck f&uuml;r das Feld <b>OrtX <\/b>zeigt (<b>X <\/b>angef&uuml;gt, um keinen Zirkelbezug zu erzeugen):<\/p>\n<pre>OrtX: OrtErmitteln([Postlz];[Ort])<\/pre>\n<p>Die Funktion nimmt diese beiden Parameter wie folgt entgegen:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>OrtErmitteln(strPLZ<span style=\"color:blue;\"> As String<\/span>,  strOrt<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strLaenderkuerzel<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intPosStrich<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intLeerzeichen<span style=\"color:blue;\"> As Integer<\/span>\r\n     intPosStrich = <span style=\"color:blue;\">InStr<\/span>(strPLZ, \"-\")\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> intPosStrich = 0<span style=\"color:blue;\"> Then<\/span>\r\n         intLeerzeichen = <span style=\"color:blue;\">InStrRev<\/span>(strPLZ, \" \")\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> intLeerzeichen = 0<span style=\"color:blue;\"> Then<\/span>\r\n             strOrt = <span style=\"color:blue;\">Mid<\/span>(strPLZ, <span style=\"color:blue;\">InStrRev<\/span>(strPLZ, \" \"))\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     OrtErmitteln = strOrt\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Dabei pr&uuml;ft sie wieder, an welcher Position sich gegebenenfalls das Minuszeichen befindet. Falls eines vorhanden ist, ermittelt die Funktion als N&auml;chstes, wo sich die hinterste Leerstelle befindet.<\/p>\n<p>Ist eine vorhanden, wie in <b>CH-8005   Z&uuml;rich<\/b>, erh&auml;lt die Variable <b>intLeerzeichen <\/b>einen Wert ungleich <b>0 <\/b>und der Teil hinter dem letzten Leerzeichen wird in der Variablen <b>strOrt <\/b>gespeichert. Dieser Wert wird dann als R&uuml;ckgabewert zur&uuml;ckgeliefert. Wenn kein Minuszeichen gefunden wird, liefert die Funktion den Inhalt des Parameters <b>strOrt <\/b>zur&uuml;ck.<\/p>\n<h2>Aktives oder passives Mitglied<\/h2>\n<p>Ob es sich um ein aktives oder passives Mitglied handelt, finden wir &uuml;ber das Feld <b>Ak\/Pa <\/b>der Originaltabelle heraus. In den Originaldaten finden wir dabei redundante Daten, denn diese enth&auml;lt sowohl die Altersklasse als auch das Alter des Mitglieds.<\/p>\n<p>Die Altersklasse soll aber aus dem Geburtsdatum und dem Stichtag f&uuml;r das aktuelle Jahr ermittelt werden. Also entnehmen wir diesem Feld nur die Angabe, ob es sich um ein aktives oder passives Mitglied handelt. Daf&uuml;r legen wir direkt eine passende VBA-Routine an:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>AktivPassiv(strAktivPassiv<span style=\"color:blue;\"> As String<\/span>) <span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">InStr<\/span>(1, strAktivPassiv, \"P\") = 0<span style=\"color:blue;\"> Then<\/span>\r\n         AktivPassiv = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Der Ausdruck f&uuml;r das Feld lautet:<\/p>\n<pre>Aktiv: AktivPassiv([Ak\/Pa])<\/pre>\n<h2>Geschlecht<\/h2>\n<p>Aus dem Feld <b>Ak\/Pa<\/b> k&ouml;nnen wir auch das Geschlecht des Mitglieds ermitteln. Wie im Beitrag <b>Vereinsverwaltung: Von Excel zum Datenmodell <\/b>(<b>www.access-im-unternehmen.de\/1106<\/b>) erw&auml;hnt, weisen jeweils die Buchstaben <b>M <\/b>und <b>W <\/b>auf das Geschlecht hin &#8211; etwa wie in <b>EPM <\/b>(<b>Erwachsene Passiv M&auml;nnlich<\/b>) oder <b>WJ <\/b>(<b>Weibliche Jugend<\/b>).<\/p>\n<p>Es gibt zwar hier ein paar Inkonsistenzen bez&uuml;glich der Anordnung der Buchstaben (zum Beispiel kommen <b>WJP <\/b>oder <b>WPJ <\/b>vor), aber hier geht es uns zun&auml;chst darum, dass immer einer der Buchstaben <b>W <\/b>oder <b>M <\/b>enthalten sind. Die passende VBA-Funktion sieht so aus:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GeschlechtErmitteln(strGeschlecht <span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngGeschlechtID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">InStr<\/span>(1, strGeschlecht, \"M\") = 0<span style=\"color:blue;\"> Then<\/span>\r\n         lngGeschlechtID = 1\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         lngGeschlechtID = 2\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     GeschlechtErmitteln = lngGeschlechtID\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Der Ausdruck in der Abfrage <b>qryMitgliederMigrieren <\/b>lautet wie folgt:<\/p>\n<pre>Geschlecht: GeschlechtErmitteln([Ak\/Pa])<\/pre>\n<p>Die Funktion liefert hier den entsprechenden Fremdschl&uuml;sselwert f&uuml;r den passenden Datensatz der Tabelle <b>tblGeschlechter <\/b>zur&uuml;ck.<\/p>\n<h2>Anreden ermitteln<\/h2>\n<p>Aus diesem Feld k&ouml;nnen wir dann auch die Anreden ermitteln. Der Feldausdruck lautet:<\/p>\n<pre>Anrede: AnredeErmitteln([Ak\/Pa])<\/pre>\n<p>Die Funktion sieht so aus:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>AnredeErmitteln(strAnrede<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngAnredeID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">InStr<\/span>(1, strAnrede, \"M\") = 0<span style=\"color:blue;\"> Then<\/span>\r\n         lngAnredeID = 1\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         lngAnredeID = 2\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     AnredeErmitteln = lngAnredeID\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<h2>Beitrag und Rabattklasse ermitteln<\/h2>\n<p>Bei den Beitr&auml;gen und den Rabattklassen wird es interessant. Hierzu finden wir im Feld <b>Bemerkungen <\/b>der Tabelle <b>Mitglieder <\/b>Werte wie die folgenden:<\/p>\n<pre>100,00= 40%=60,00\r\n100,00-20%\r\n100,00-30%\r\n100,00-30%=70,00\r\n100,00-40%=60,00\r\n110,00-20%\r\n110,00-20% =88,00\r\n110,00-20%=88,00\r\n110,00-30%=77,00\r\n110,00-30%=77,00\r\n135\r\n210,00\r\n30,00-20%\r\n30,00-30%\r\n30,00-30%=18,00\r\n95,00-20%\r\n95,00-30%\r\n95,00-30%=67,00\r\nEhrenmitglied\r\nF&ouml;rdermitglied\r\nHo236\/30,00-30%\r\nSpende<\/pre>\n<p>Das Feld <b>Beitrag \/ &euro; <\/b>enth&auml;lt dann den tats&auml;chlichen Beitrag inklusive Abzug durch die Rabattklasse.<\/p>\n<p>Wir m&uuml;ssen nun zun&auml;chst die Tabelle <b>tblBeitragsklassen <\/b>mit den Bezeichnungen, Altersangaben, Aktiv\/Passiv und dem Beitrag f&uuml;llen. Wollen wir das automatisch\/per Abfrage erledigen lassen oder manuell durchf&uuml;hren Wir erledigen dies diesmal manuell, da es wohl mehr Zeit kostet, einen entsprechenden Algorithmus zu programmieren als die Datens&auml;tze selbst in die Tabelle einzutragen.<\/p>\n<p>Es kommt noch hinzu, dass f&uuml;r die verschiedenen Altersklassen angegebenen Beitr&auml;ge nicht konsistent sind. Eine R&uuml;ckfrage beim Auftraggeber ergab dann, dass es zum Beispiel auch Studentenbeitr&auml;ge gibt. Allerdings war aus der Mitglieder-Tabelle nicht ersichtlich, ob ein Mitglied ein Student ist oder nicht. Diese nachtr&auml;gliche Information k&ouml;nnte nun auch das Datenmodell etwas durcheinanderwerfen, denn wir wollen ja nur &uuml;ber die Eigenschaften der Tabelle <b>tblMitglieder <\/b>und die Werte der Tabelle <b>tblBeitragsklassen <\/b>den Beitrag eines Mitglieds ermitteln.<\/p>\n<p>Also m&uuml;ssen wir wohl noch ein Feld einf&uuml;gen, mit dem wir angeben, ob es sich bei dem Mitglied um einen Studenten, Sch&uuml;ler oder Auszubildenden handelt. Die Liste der Beitr&auml;ge, die wir vom Verein erhielten, lieferte noch weitere zus&auml;tzliche Informationen: So kann ein Mitglied auch ein so genanntes Elternmitglied sein (also ein Mitglied, das ein Kind im Verein hat).<\/p>\n<p>Jedes weitere Elternmitglied sollte die H&auml;lfte des Beitrags f&uuml;r Elternmitglieder bezahlen. &#8222;Jedes weitere Elternmitglied&#8220; Wie viele Eltern hat ein Kind Wir wollen nun nicht auch noch ein Feld einf&uuml;gen, das festlegt, ob ein Mitglied ein weiteres Elternmitglied ist.<\/p>\n<p>Wie aber wollen wir diesen Sachverhalt abbilden, ohne allzu gro&szlig;e &auml;nderungen am Datenmodell vorzunehmen Wir f&uuml;gen einfach ein weiteres Feld namens <b>Elternmitglied <\/b>mit dem Datentyp <b>Ja\/Nein <\/b>zur Tabelle <b>tblMitglieder <\/b>hinzu und ber&uuml;cksichtigen dieses Feld auch in der Tabelle <b>tblBeitragsklassen<\/b>. Wenn wir dann in der Tabelle <b>tblFamilienmitglieder<\/b> die Zuordnung vornehmen, k&ouml;nnen wir mithilfe eines zus&auml;tzlichen Feldes namens Reihenfolge die Reihenfolge einstellen und im Falle mehrerer Familienmitglieder mit dem Attribut <b>Familienmitglied <\/b>festlegen, ob diese 100 oder 50 EUR Beitrag zahlen m&uuml;ssen.<\/p>\n<p>Die Tabelle <b>tblBeitragsklassen <\/b>sieht nach dem manuellen Import wie in Bild 4 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_06\/pic_1107_004.png\" alt=\"Tabelle mit dem Beitragsklassen\" width=\"649,559\" height=\"232,5966\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Tabelle mit dem Beitragsklassen<\/span><\/b><\/p>\n<p>Allerdings stellte sich nach einem kl&auml;renden Gespr&auml;ch heraus, dass es wohl sinnvoller ist, nur passive und aktive Erwachsene zu f&uuml;hren sowie die Kinder-Beitragsklassen &#8211; die &uuml;brigen Klassen sollten &uuml;ber Rabatte abgebildet werden.<\/p>\n<h2>Familienmitglieder<\/h2>\n<p>Die n&auml;chste Aufgabe ist das Importieren der Familienmitglieder beziehungsweise deren Notation in der Tabelle <b>tblFamilienmitglieder<\/b>. Das zugrunde liegende Feld ist das Feld <b>FB<\/b>. Es enth&auml;lt f&uuml;r alle Mitglieder, die zu einer Familie geh&ouml;ren, einen Eintrag der mit <b>F <\/b>beginnt und die Nummer der Familie enth&auml;lt &#8211; also beispielsweise <b>F1<\/b>, <b>F2 <\/b>oder <b>F31<\/b>.<\/p>\n<p>Wir wollen nun alle entsprechenden Eintr&auml;ge durchlaufen, ermitteln, welcher Beitrag der h&ouml;chste in einer Familie ist und dieses Mitglied als Familienoberhaupt festlegen.<\/p>\n<p>Die anderen werden dann &uuml;ber die Tabelle <b>tblFamilienmitglieder <\/b>zu diesem Mitglied hinzugef&uuml;gt. <\/p>\n<p>Dazu erstellen wir eine Abfrage, welche uns die Daten aus der Importtabelle <b>Mitglieder <\/b>und die der Tabelle <b>tblMitglieder <\/b>zusammenf&uuml;hrt &#8211; und zwar &uuml;ber das Feld <b>Mitgliedsnummer <\/b>beziehungsweise <b>Mitgl-Nr<\/b> (s. Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_06\/pic_1107_006.png\" alt=\"Abfrageentwurf zur Ermittlung der Familienmitglieder\" width=\"499,6607\" height=\"338,3667\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Abfrageentwurf zur Ermittlung der Familienmitglieder<\/span><\/b><\/p>\n<p>Das Ergebnis sieht wie in Bild 6 aus. Wir lesen nun in einer Prozedur nacheinander alle Familien ein, indem wir jeweils ein Recordset mit den Eintr&auml;gen f&uuml;llen, die einer Familie entsprechen und den passenden Wert im Feld <b>FB <\/b>aufweisen (<b>F1<\/b>, <b>F2 <\/b>und so weiter).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_06\/pic_1107_005.png\" alt=\"Abfrage zur Ermittlung der Familienmitglieder\" width=\"499,6607\" height=\"315,5751\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Abfrage zur Ermittlung der Familienmitglieder<\/span><\/b><\/p>\n<p>Diese durchlaufen wir mit der Prozedur aus Listing 1. Dabei ermitteln wir zun&auml;chst die eindeutigen Werte im Feld <b>FB <\/b>(also <b>F1<\/b>, <b>F2<\/b>, &#8230;) und durchlaufen diese in einer &auml;u&szlig;eren <b>Do While<\/b>-Schleife. In einer inneren <b>Do While<\/b>-Schleife erstellen wir dann jeweils ein Recordset auf Basis der Abfrage <b>qryFamilienbeitraegeImport<\/b>, wobei dieses nur die Datens&auml;tze f&uuml;r die aktuelle Familie liefert &#8211; und zwar in der absteigenden Reihenfolge im Feld <b>Beitrag \/ &euro;<\/b>. Wenn aktuell der erste Datensatz durchlaufen wird (<b>rstQuelle.AbsolutePosition = 0<\/b>), erhalten wir den Datensatz zum Familienoberhaupt, also zum Mitglied mit dem h&ouml;chsten Beitrag.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Familienmitglieder()\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>rstQuelle<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>rstFamilien<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>lngFamilienoberhauptID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rstFamilien = db.OpenRecordset(\"SELECT DISTINCT FB FROM Mitglieder\", dbOpenDynaset)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rstFamilien.EOF\r\n         <span style=\"color:blue;\">Set<\/span> rstQuelle = db.OpenRecordset(\"SELECT * FROM qryFamilienbeitraegeImport WHERE FB = ''''\" & rstFamilien!FB _\r\n              & \"'''' ORDER BY [Beitrag \/ &euro;] DESC\", dbOpenDynaset)\r\n         <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rstQuelle.EOF\r\n             <span style=\"color:blue;\">If <\/span>rstQuelle.AbsolutePosition = 0<span style=\"color:blue;\"> Then<\/span>\r\n                 lngFamilienoberhauptID = rstQuelle!MitgliedID\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 db.Execute \"INSERT INTO tblFamilienmitglieder(FamilienoberhauptID, FamilienmitgliedID, \" _\r\n                     & \"Reihenfolge) VALUES(\" & lngFamilienoberhauptID & \", \" & rstQuelle!MitgliedID & \", \" _\r\n                     & rstQuelle.AbsolutePosition & \")\", dbFailOnError\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             rstQuelle.Move<span style=\"color:blue;\">Next<\/span>\r\n         <span style=\"color:blue;\">Loop<\/span>\r\n         rstFamilien.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Ermitteln der Familienmitglieder<\/span><\/b><\/p>\n<p>Den Prim&auml;rschl&uuml;sselwert dieses Datensatzes merken wir uns in der Variablen <b>lngFamilienoberhauptID<\/b>. F&uuml;r die folgenden Eintr&auml;ge, deren Eigenschaft <b>AbsolutePosition <\/b>gr&ouml;&szlig;er als <b>0 <\/b>ist, tragen wir dann jeweils einen Datensatz in die Tabelle <b>tblFamilienmitglieder <\/b>ein.<\/p>\n<p>Dabei geben wir den Wert aus <b>lngFamilienoberhauptID <\/b>als Wert des Feldes <b>Familienoberhaupt<\/b> ein, den Wert des Feldes <b>rstQuelle!MitgliedID <\/b>in das Feld <b>FamilienmitgliedID <\/b>und den Wert der Eigenschaft <b>AbsolutePosition <\/b>in das Feld <b>Reihenfolge<\/b>. Das Ergebnis sieht wie in Bild 7 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_06\/pic_1107_007.png\" alt=\"Tabelle der Familienmitglieder\" width=\"599,593\" height=\"197,7086\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Tabelle der Familienmitglieder<\/span><\/b><\/p>\n<p>Ben&ouml;tigen wir nun noch den Inhalt der Felder <b>Beitrag \/ &euro; <\/b>und <b>Bemerkung<\/b> Ja, denn wir wollen sowohl f&uuml;r diese als auch f&uuml;r alle anderen Mitglieder die Werte aus der Ausgangstabelle in die Zieltabellen &uuml;bernehmen. <\/p>\n<p>Kurzgefasst: Die &uuml;bernahme dieser Daten war nur mit einer ma&szlig;geschneiderten VBA-Routine m&ouml;glich, welche zun&auml;chst die Beitr&auml;ge ohne Rabatte ermittelte und dar&uuml;ber dann die Rabattklasse. Dies haben wir so geregelt, dass es tats&auml;chlich nur wenige Beitragsklassen gibt, die allein &uuml;ber das Alter und den Status im Feld <b>Aktiv <\/b>bestimmt werden. Dazu gibt es eine Abfrage namens <b>qryBeitraege<\/b>, welche die Tabellen <b>tblMitglieder<\/b>, <b>tblBeitragsklassen<\/b>, <b>tblRabattklassen <\/b>und <b>tblOptionen <\/b>zusammenf&uuml;hrt, um in Abh&auml;ngigkeit vom Stichtag aus der Tabelle <b>tblOptionen <\/b>das Alter und somit die Beitragsklasse zu ermitteln. <\/p>\n<p>Die Ermittlung des Familienbeitrags als zus&auml;tzliche Rabattstufe ist noch etwas komplizierter, sodass wir diese in einem separaten Beitrag beleuchten werden.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Bisher haben wir die Tabellen erstellt und die Daten aus der Excel-Tabelle in die neuen Tabellen migriert. Dabei haben wir teils eine Aktualisierungsabfrage genutzt, teils haben wir mit VBA-Prozeduren gearbeitet. In den n&auml;chsten Teil der Beitragsreihe werden wir dann die Benutzeroberfl&auml;che und die Berichte f&uuml;r die Mitgliederverwaltung liefern.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Vereinsverwaltung_Anonymisiert.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/3DAF3B2D-4C66-43BD-B4C2-1EAA9561002E\/aiu_1107.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Beitrag &#8222;Vereinsverwaltung: Von Excel zum Datenmodell&#8220; haben wir gezeigt, wie Sie eine exemplarische Excel-Tabelle mit den Daten zur Mitgliedsverwaltung in ein -Access-Datenmodell umwandeln. Dabei haben wir die Daten der Excel-Datei bereits in der Datenbank verf&uuml;gbar gemacht. Neben der damit verbundenen konzeptionellen Arbeit kommt nun der interessante Teil: die Programmierung von VBA-Code und Abfragen, um die Daten aus der monolithischen Excel-Tabelle in das Datenmodell zu &uuml;bertragen.<\/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":[662017,66062017,44000021],"tags":[],"class_list":["post-55001107","post","type-post","status-publish","format-standard","hentry","category-662017","category-66062017","category-Tabellen_und_Datenmodellierung"],"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>Vereinsverwaltung: Migration - 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\/Vereinsverwaltung_Migration\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Vereinsverwaltung: Migration\" \/>\n<meta property=\"og:description\" content=\"Im Beitrag &quot;Vereinsverwaltung: Von Excel zum Datenmodell&quot; haben wir gezeigt, wie Sie eine exemplarische Excel-Tabelle mit den Daten zur Mitgliedsverwaltung in ein -Access-Datenmodell umwandeln. Dabei haben wir die Daten der Excel-Datei bereits in der Datenbank verf&uuml;gbar gemacht. Neben der damit verbundenen konzeptionellen Arbeit kommt nun der interessante Teil: die Programmierung von VBA-Code und Abfragen, um die Daten aus der monolithischen Excel-Tabelle in das Datenmodell zu &uuml;bertragen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Vereinsverwaltung_Migration\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-13T21:27:32+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/7bd427dbffd64301bba568080bdf58cf\" \/>\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=\"15\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vereinsverwaltung_Migration\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vereinsverwaltung_Migration\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Vereinsverwaltung: Migration\",\"datePublished\":\"2020-05-13T21:27:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vereinsverwaltung_Migration\\\/\"},\"wordCount\":2648,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vereinsverwaltung_Migration\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/7bd427dbffd64301bba568080bdf58cf\",\"articleSection\":[\"2017\",\"6\\\/2017\",\"Tabellen und Datenmodellierung\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Vereinsverwaltung_Migration\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vereinsverwaltung_Migration\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vereinsverwaltung_Migration\\\/\",\"name\":\"Vereinsverwaltung: Migration - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vereinsverwaltung_Migration\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vereinsverwaltung_Migration\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/7bd427dbffd64301bba568080bdf58cf\",\"datePublished\":\"2020-05-13T21:27:32+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vereinsverwaltung_Migration\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Vereinsverwaltung_Migration\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vereinsverwaltung_Migration\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/7bd427dbffd64301bba568080bdf58cf\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/7bd427dbffd64301bba568080bdf58cf\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vereinsverwaltung_Migration\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Vereinsverwaltung: Migration\"}]},{\"@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":"Vereinsverwaltung: Migration - 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\/Vereinsverwaltung_Migration\/","og_locale":"de_DE","og_type":"article","og_title":"Vereinsverwaltung: Migration","og_description":"Im Beitrag \"Vereinsverwaltung: Von Excel zum Datenmodell\" haben wir gezeigt, wie Sie eine exemplarische Excel-Tabelle mit den Daten zur Mitgliedsverwaltung in ein -Access-Datenmodell umwandeln. Dabei haben wir die Daten der Excel-Datei bereits in der Datenbank verf&uuml;gbar gemacht. Neben der damit verbundenen konzeptionellen Arbeit kommt nun der interessante Teil: die Programmierung von VBA-Code und Abfragen, um die Daten aus der monolithischen Excel-Tabelle in das Datenmodell zu &uuml;bertragen.","og_url":"https:\/\/access-im-unternehmen.de\/Vereinsverwaltung_Migration\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-13T21:27:32+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/7bd427dbffd64301bba568080bdf58cf","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"15\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Vereinsverwaltung_Migration\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Vereinsverwaltung_Migration\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Vereinsverwaltung: Migration","datePublished":"2020-05-13T21:27:32+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Vereinsverwaltung_Migration\/"},"wordCount":2648,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Vereinsverwaltung_Migration\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/7bd427dbffd64301bba568080bdf58cf","articleSection":["2017","6\/2017","Tabellen und Datenmodellierung"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Vereinsverwaltung_Migration\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Vereinsverwaltung_Migration\/","url":"https:\/\/access-im-unternehmen.de\/Vereinsverwaltung_Migration\/","name":"Vereinsverwaltung: Migration - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Vereinsverwaltung_Migration\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Vereinsverwaltung_Migration\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/7bd427dbffd64301bba568080bdf58cf","datePublished":"2020-05-13T21:27:32+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Vereinsverwaltung_Migration\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Vereinsverwaltung_Migration\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Vereinsverwaltung_Migration\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/7bd427dbffd64301bba568080bdf58cf","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/7bd427dbffd64301bba568080bdf58cf"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Vereinsverwaltung_Migration\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Vereinsverwaltung: Migration"}]},{"@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\/55001107","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=55001107"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001107\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001107"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001107"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001107"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}