Vereinsverwaltung: Formulare

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

In den Beiträgen “Vereinsverwaltung: Von Excel zum Datenmodell” und “Vereinsverwaltung: Migration” haben wir uns um die Erstellung eines Datenmodells und die Migration bestehender Beispieldaten aus einer Excel-Tabelle gekümmert. Für die Bearbeitung der Daten aus den so erstellten und gefüllten Tabellen wollen wir nun eine Benutzeroberfläche programmieren. Der vorliegende Beitrag zeigt, wie wir die Formulare gestalten.

Ausgangsposition

In den beiden vorhergehenden Teilen dieser Beitragsreihe, nämlich Vereinsverwaltung: Von Excel zum Datenmodell (www.access-im-unternehmen.de/1106) und Vereinsverwaltung: Migration (www.access-im-unternehmen.de/1107) haben wir exemplarisch gezeigt, wie wir aus den vorliegenden Daten und Anforderungen ein Datenmodell für eine Vereinsverwaltung erstellen. Das Ergebnis finden Sie in Bild 1. Der Kern des Datenmodells ist die Tabelle tblMitglieder, um die herum wir eine Menge weiterer Tabellen angelegt haben. Diese dienen entweder als Lookup-Tabellen für die Fremdschlüsselfelder der Tabelle tblMitglieder oder nehmen andere Daten auf – zum Beispiel die Dauer der Vereinszugehörigkeit (tblVereinszugehoerigkeiten), die Altersklassen oder die Zusammenfassung von mehreren Mitgliedern zu einer Familie (tblFamilienmitglieder).

Datenmodell der Vereinsverwaltung

Bild 1: Datenmodell der Vereinsverwaltung

Vorbereiten der Feldbeschriftungen

Wir wollen ganz einfach mit einem Detailformular für die Tabelle tblMitglieder starten. Bevor wir damit beginnen, wollen wir noch die Feldbeschriftungen für die einzelnen Felder anpassen. Wenn wir nämlich die Felder einer Tabelle nach dem Zuweisen der Tabelle an die Eigenschaft Datenherkunft des Formulars aus der Feldliste in den Formularentwurf ziehen wollen, trägt Access immer den Feldnamen in das automatisch angelegte Bezeichnungsfeld ein. Das heißt, dass für die Anrede beispielsweise der Feldname AnredeID als Bezeichnungsfeld verwendet wird. Damit wir nicht immer die Bezeichnungsfelder anpassen müssen, stellen wir gleich den gewünschten Feldnamen in der Tabellendefinition ein, und zwar wie in Bild 2. Hier legen wir beispielsweise den Wert Anrede für die Eigenschaft Beschriftung fest. Auf die gleiche Weise gehen wir mit den folgenden Feldern vor:

Anpassen der Feldbeschriftungen

Bild 2: Anpassen der Feldbeschriftungen

  • Strasse wird zu Straße
  • RabattklasseID wird zu Rabattklasse
  • MitgliedsnummerHauptverein wird zu Mitgliedsnr. (Hauptverein)
  • EMail wird zu E-Mail
  • GeschlechtID wird zu Geschlecht

Doppelpunkt aktivieren

Damit Access beim Hinzufügen der Felder aus der Feldliste in den Detailbereich des Formulars nicht nur die passenden Beschriftungen für die Bezeichnungsfelder einträgt, sondern diese auch noch um einen Doppelpunkt ergänzt, müssen Sie gegebenenfalls noch einmal Hand anlegen. öffnen Sie dazu ein neues, leeres Formular und klicken Sie auf die Schaltfläche zum Hinzufügen eines neuen Textfeldes (nur anklicken, noch nicht einfügen!). Das Eigenschaftenblatt zeigt nun auf der Registerseite Format fast ganz unten die Eigenschaft Mit Doppelpunkt an. Diese stellen Sie auf den Wert Ja ein (siehe Bild 3).

Aktivieren der Doppelpunkte für Beschriftungen

Bild 3: Aktivieren der Doppelpunkte für Beschriftungen

Speichern Sie das Formular nun unter dem Namen Normal. Prüfen Sie dann, ob in den Access-Optionen wie in Bild 4 diese Bezeichnung für die Eigenschaft Formularvorlage festgelegt ist. Wenn Sie nun neue Formulare anlegen, berücksichtigen diese die Einstellungen, die wir hier für den Steuerelementtyp Textfeld vorgenommen haben.

Bezeichnungen der Vorlagen für Formulare und Berichte

Bild 4: Bezeichnungen der Vorlagen für Formulare und Berichte

Formular für die Mitglieder anlegen

Nun legen wir ein neues, leeres Formular an und stellen seine Eigenschaft Datenherkunft auf die Tabelle tblMitglieder ein. Speichern Sie das Formular vorsichtshalber gleich unter dem Namen frmMitglieddetails. Nun aktivieren Sie die Feldliste mit dem Ribbon-Befehl Entwurf|Tools|Vorhandene Felder hinzufügen. Markieren Sie alle Einträge des Fensters Feldliste und ziehen Sie diese in den Detailbereich des Formularentwurfs (siehe Bild 5).

Hinzufügen der Felder zum Formular frmMitglieddetails

Bild 5: Hinzufügen der Felder zum Formular frmMitglieddetails

Hier tragen unsere Vorbereitungen nun Früchte: Sowohl die Beschriftungen der Bezeichnungsfelder entsprechen den von uns angegebenen Werten als auch die Doppelpunkte wurden wir gewünscht hinzugefügt.

Daten aus weiteren Tabellen hinzufügen

Bevor wir die bisher hinzugefügten Steuer-elemente in sinnvollen Gruppen anordnen, schauen wir uns noch an, welche Daten aus den anderen Tabellen wir noch benötigen:

  • tblFamilienmitglieder: Wir könnten in einem Unterformular die übrigen Familienmitglieder anzeigen, sofern diese vorhanden sind.
  • tblVereinszugehoerigkeiten: Die Vereinszugehörigkeiten sollten auf jeden Fall in einem Unterformular angezeigt werden.
  • tblMitgliederMannschaften/tblMannschaften: Auch die Zugehörigkeiten zu einer oder mehrerer Mannschaften könnte man in diesem Formular dokumentieren und auch bearbeiten.
  • tblAnreden, tblRabattklassen, tblGeschlecht: Die Werte dieser Felder werden bereits über Nachschlagefelder dargestellt.

Bei den Daten der Tabellen tblFamilienmitglieder, tblVereinszugehoerigkeiten und tblMitgliederMannschaften können wir festlegen, auf welche Art wir die Daten anzeigen wollen. Wir wollen in dieser Beispiellösung ein paar verschiedene Ansätze demonstrieren, aber die Ergonomie soll auch nicht zu kurz kommen. Schauen wir uns die Tabellen im Detail an.

Bearbeiten der Vereinszugehörigkeiten

Die Vereinszugehörigkeiten sind die einfachste Darstellung. Es handelt sich ja einfach nur um eine 1:n-Beziehung, wobei jedes Mitglied eine oder mehrere Vereinszugehörigkeiten aufweisen kann. Da es vermutlich nicht allzuoft geschieht, dass ein Mitglied den Verein verlässt und dann zurückkehrt, wollen wir diese Daten in einem Listenfeld anzeigen, dessen Einträge wir über einen Doppelklick bearbeiten können beziehungsweise durch entsprechende Schaltflächen neue Vereinszugehörigkeiten anlegen oder löschen können.

An dieser Stelle fällt auf, dass wir die Eintritts- und Austrittsdaten noch gar nicht aus der Excel-Tabelle in das neue Datenmodell übernommen haben. Das holen wir nun noch nach. Dabei unterstützt uns die Funktion Eintrittsdatum aus Listing 1. Diese öffnet zunächst ein Recordset auf Basis der Tabelle mit den aus der Excel-Datei importierten Mitgliedsdaten namens Mitglieder. In einer Do While-Schleife durchläuft sie alle Datensätze dieser Tabelle und ermittelt dabei zunächst den Wert des Primärschlüsselfeldes MitgliedID der Tabelle tblMitglieder, unter der das Mitglied importiert wurde. Um den entsprechenden Datensatz zu ermitteln, nutzen wir die DLookup-Funktion und suchen in der Tabelle tblMitglieder nach dem Datensatz, in dessen Feld Mitgliedsnummer der Wert gespeichert ist, den wir in der Excel-Datei in der Spalte Mitgl-Nr finden. Wenn wider Erwarten kein passender Datensatz gefunden wird, erhält lngMitgliedID den Wert 0 und die Anweisungen innerhalb der folgenden If…Then-Bedingung werden nicht ausgeführt. Stattdessen gibt die Routine eine entsprechende Meldung im Direktbereich des VBA-Editors aus.

Public Function Eintrittsdatum()
     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Dim lngMitgliedID As Long
     Dim datEintritt As Date, datAustritt As Date
     Dim strAustritt As String
     Set db = CurrentDb
     Set rst = db.OpenRecordset("SELECT * FROM Mitglieder", dbOpenDynaset)
     Do While Not rst.EOF
         lngMitgliedID = Nz(DLookup("MitgliedID", "tblMitglieder", "Mitgliedsnummer = ''''" & rst![Mitgl-Nr] & "''''"), 0)
         If Not lngMitgliedID = 0 Then
             datEintritt = rst!Eintrittsdatum
             strAustritt = Nz(rst!Bemerkung, "")
             datAustritt = 0
             If InStr(1, strAustritt, "abg.") > 0 Then
                 strAustritt = Replace(strAustritt, "abg.", "")
                 strAustritt = Trim(strAustritt)
                 If IsDate(strAustritt) Then
                     datAustritt = CDate(strAustritt)
                 Else
                     Debug.Print "Austrittsdatum aus ''''" & rst!Bemerkung & "'''' konnte nicht ermittelt werden."
                 End If
             End If
             If InStr(1, strAustritt, "gest.") > 0 Then
                 strAustritt = Replace(strAustritt, "gest.", "")
                 strAustritt = Replace(strAustritt, "am", "")
                 strAustritt = Trim(strAustritt)
                 If IsDate(strAustritt) Then
                     datAustritt = CDate(strAustritt)
                 Else
                     Debug.Print "Austrittsdatum aus ''''" & rst!Bemerkung & "'''' konnte nicht ermittelt werden."
                 End If
             End If
             If datAustritt > 0 Then
                 db.Execute "INSERT INTO tblVereinszugehoerigkeiten(MitgliedID, Eintrittsdatum, Austrittsdatum) " _
                     & "VALUES(" & lngMitgliedID & ", " & SQLDatum(datEintritt) & ", " & SQLDatum(datAustritt) & ")", _
                     dbFailOnError
             Else
                 db.Execute "INSERT INTO tblVereinszugehoerigkeiten(MitgliedID, Eintrittsdatum) VALUES(" _
                     & lngMitgliedID & ", " & SQLDatum(datEintritt) & ")", dbFailOnError
             End If
         Else
             Debug.Print "Mitglied mit Mitgliedsnummer ''''" & rst![Mitgl-Nr] & "'''' nicht gefunden."
         End If
         rst.MoveNext
     Loop
End Function

Listing 1: Prozedur zum Ermitteln der Eintritts- und Austrittsdaten

Wurde das Mitglied jedoch gefunden, ermittelt die Prozedur den Wert der Spalte Eintrittsdatum und speichert diesen in der Variablen datEintrittsdatum. Während diese Spalte konsistent mit Datumswerten gefüllt war, müssen wir das eventuell vorhandene Austrittsdatum mühsam aus der Spalte Bemerkungen ermitteln. Dazu schreiben wir den Inhalt dieser Spalte in die Variable strAustritt. Es gibt in der Excel-Datei zwei Varianten von Austrittsdaten. Hat sich ein Mitglied abgemeldet, findet sich ein Eintrag wie “1.1.2018 abg.”, wenn ein Mitglied verstorben ist, ein Eintrag wie “am 1.1.2018 gest.”.

Wir bearbeiten beide Fälle in jeweils einer If…Then-Bedingung. Die erste prüft, ob strAustritt die Zeichenfolge abg. enthält. Falls ja, ersetzen wir mit der Replace-Methode die Zeichenfolge abg. durch eine leere Zeichenfolge und speichern das Ergebnis wieder in strAustritt. Anschließend entfernen wir alle führenden und folgenden Leerzeichen mit der Trim-Funktion. Die folgende If…Then-Bedingung prüft mit der IsDate-Funktion, ob strAustritt nun ein gültiges Datum enthält. Falls ja, landet dieser Wert nach Konvertierung mit CDate in der Variablen datAustritt, falls nicht, erscheint wieder eine entsprechende Meldung im VBA-Direktbereich.

Auf ähnliche Weise kümmern wir uns dann um verstorbene Mitglieder. Hier ersetzen wir allerdings die beiden Zeichenketten gest. und am durch leere Zeichenketten und verarbeiten die verbleibende Zeichenkette wie zuvor beschrieben.

Anschließend folgen je nach Inhalt von datAustritt zwei verschiedene SQL-Anfügeabfragen. Enthält die Variable datAustritt einen Wert größer 0, was einem gültigen Datum entspricht, dann führen wir die erste INSERT INTO-Abfrage aus. Diese legt einen neuen Datensatz in der Tabelle tblVereinszugehoerigkeiten an und trägt die ermittelten Werte für die Felder MitgliedID, Eintrittsdatum und Austrittsdatum ein. Sollte datAustritt keinen Wert enthalten, soll das Feld Austrittsdatum leer bleiben – in diesem Fall verwenden wir die INSERT INTO-Anweisung aus dem Else-Teil der Bedingung und tragen nur die beiden Werte MitgliedID und Eintrittsdatum in die Tabelle ein. Das Ergebnis in der Tabelle tblVereinszugehoerigkeiten sieht dann wie in Bild 6 aus.

Vereinszugehörigkeiten nach dem Import

Bild 6: Vereinszugehörigkeiten nach dem Import

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar