Zeiträume per Listenfeld und InputBox

Die Beispieldatenbank Vereinsverwaltung erwartet an einer Stelle die Eingabe der Vereinszugehörigkeit. Je Mitglied kann es auch mehrere Vereinszugehörigkeiten geben. Diese wollen wir diesmal in einem Listenfeld darstellen und ohne Verwendung eines eigenen Detailformulars per InputBox verwalten. Dass dies gar nicht unbedingt einfacher oder schneller geht, zeigt der vorliegende Beitrag.

Der größte Aufwand bei der Verwaltung von Zeiträumen entsteht durch die überprüfung der eingegebenen Werte: Das Startdatum darf nicht hinter dem Enddatum liegen, die Zeiträume der verschiedenen Datensätze dürfen sich nicht überlappen. In diesem Beitrag zeigen wir, wie Sie die Zeiträume zu einem bestimmten Thema, hier die Vereinszugehörigkeiten von Mitgliedern zu einem Verein, in einem Listenfeld anzeigen und per InputBox verwalten wollen. Diese Zeiträume könnten aber auch etwa die Beschäftigungszeiten in einem Unternehmen sein – und Sie finden sicher noch weitere Beispiele. In unserem Beispiel kümmern wir uns um die Einträge der Tabelle tblVereinszugehoerigkeiten, die wie in Bild 1 mit der Tabelle tblMitglieder verknüpft ist.

Mitglieder und Vereinszugehörigkeiten

Bild 1: Mitglieder und Vereinszugehörigkeiten

Das Listenfeld lstVereinszugehoerigkeiten sowie die beiden Schaltflächen cmdNeueVereinszugehoerigkeit und cmdVereinszugehoerigkeitLoeschen füllen wir gleich mit Code. Ein Klick auf die Schaltfläche cmdNeueVereinszugehoerigkeit soll beispielsweise eine InputBox wie in Bild 2 anzeigen.

Zeiträume per InputBox eingeben

Bild 2: Zeiträume per InputBox eingeben

Zuvor wollen wir jedoch noch die Daten der Tabelle tblVereinszugehoerigkeiten im Listenfeld anzeigen. Wie Sie diese Steuer-elemente anlegen, erläutern wir im Beitrag Vereinsverwaltung: Formulare (www.access-im-unternehmen.de/1134).

Datensatzherkunft für das Listenfeld

Das Listenfeld soll alle Datensätze der Tabelle tblVereinszugehoerigkeiten anzeigen, die dem aktuell im Formular frmMitglieddetails angezeigten Mitglied zugeordnet sind. Außerdem sollen die Daten aufsteigend nach dem Eintrittsdatum sortiert werden. Dies erledigen wir mit der Abfrage aus Bild 3. Diese verwendet alle Felder der Tabelle tblVereinszugehoerigkeiten, das Fremdschlüsselfeld MitgliedID wird jedoch nur als Kriterium verwendet. Damit nur die Vereinszugehörigkeiten zum aktuellen Mitglied erscheinen, stellen wir das Kriterium dieses Feldes auf [Forms]![frmMitglieddetails]![MitgliedID] ein. Dies führt dazu, dass die Datensätze automatisch gefiltert werden. Damit das Listenfeld nur die für die Bearbeitung wichtigen Spalten anzeigt, stellen wir die Eigenschaft Spaltenanzahl auf 3 und die Eigenschaft Spaltenbreiten auf 0cm;3cm;3cm ein.

Datensatzherkunft des Listenfeldes lstVereinszugehoerigkeiten

Bild 3: Datensatzherkunft des Listenfeldes lstVereinszugehoerigkeiten

Damit erhalten wir dann, sofern schon einige Datensätze vorliegen, in der Formularansicht Daten wie etwa in Bild 4. Wenn wir dann den Datensatz im Formular wechseln, aktualisiert dies allerdings noch nicht die im Listenfeld angezeigten Daten. Dazu müssen wir noch die Ereignisprozedur Beim Anzeigen zum Formular hinzufügen und diese wie folgt ergänzen:

Zwei Datensätze im Listenfeld

Bild 4: Zwei Datensätze im Listenfeld

Private Sub Form_Current()
     Me!lstVereinszugehoerigkeiten.Requery
End Sub

Danach gelingt die Aktualisierung des Listenfeldes beim Datensatzwechsel reibungslos.

Hinzufügen eines neuen Zeitraums

Die durch die Schaltfläche cmdNeueVereinszugehoerigkeit ausgelöst Ereignisprozedur soll dem Benutzer die Möglichkeit geben, einen neuen Zeitraum zum aktuellen Mitglied hinzuzufügen (siehe Listing 1). Die Prozedur ermittelt zunächst mit einer InputBox-Anweisung das Eintrittsdatum für die neue Vereinszugehörigkeit. Dann prüft sie, ob die Variable, welche das Ergebnis der Funktion aufgenommen hat, eine Zeichenkette mit einer Länge größer 0 aufweist. Dies ist unter folgenden Bedingungen nicht der Fall: Wenn der Benutzer das Feld leer lässt und auf OK klickt oder wenn er direkt auf Abbrechen klickt – dann wird unabhängig vom aktuell in die InputBox eingetragenen Wert eine leere Zeichenfolge zurückgeliefert. Sollte strEintritt nach dieser Zeile also eine Zeichenkette mit mindestens einem Zeichen enthalten, ist die folgende If…Then-Bedingung erfüllt. Eine weitere If…Then-Bedingung prüft dann, ob der Benutzer ein gültiges Datum eingegeben hat. Falls nicht, wird der Else-Teil ausgeführt, welcher den Benutzer darauf hinweist, dass er kein gültiges Eintrittsdatum eingegeben hat. Ist das Datum jedoch gültig, speichern wir die in den Datentyp Date konvertierte Zeichenkette in der Variablen datEintritt. Danach können wir mit der Abfrage des Austrittsdatums fortfahren. Normalerweise gehen wir davon aus, dass eine neue Vereinszugehörigkeit nur ein Eintrittsdatum enthält, daher füllen wir den Standardtext dieser InputBox mit dem Text Noch aktiv., was wie in Bild 5 aussieht.

Vorbelegung für das Austrittsdatum

Bild 5: Vorbelegung für das Austrittsdatum

Nach der Eingabe des Benutzers prüft die folgende If…Then-Bedingung, ob sowohl die zurückgelieferte Zeichenkette eine Länge von mindestens einem Zeichen aufweist und der Text nicht mit dem Standardwert Noch aktiv. übereinstimmt. Falls nicht, wird im Else-Teil der Bedingung über die Execute-Methode des Database-Objekts db eine INSERT INTO-Anweisung ausgeführt, welche einen neuen Datensatz in der Tabelle tblVereinszugehoerigkeiten anlegt und dabei die Felder MitgliedID und Eintrittsdatum mit dem Primärschlüsselwert des aktuellen Datensatzes im Formular und dem Wert aus datEintritt füllt. Dabei nutzen wir die Hilfsfunktion SQLDatum aus dem Modul mdlTools, um das Datum SQL-konform abzubilden (als yyyy-mm-dd). Danach aktualisieren wir die Anzeige im Listenfeld mit der Requery-Methode des Listenfeldes.

Hat der Benutzer jedoch ein gültiges Austrittsdatum angegeben, weil er etwa aus statistischen Gründen frühere Vereinszugehörigkeiten nachtragen möchte, prüft die Prozedur, ob es sich bei strAustritt um ein gültiges Datum handelt. Auch hier erscheint im Else-Teil eine entsprechende Meldung, falls strAustritt kein gültiges Datum enthält.

Ist strAustritt ein Datum, wird es mit CDate in die

Date-Variable datAustritt überführt. Da nun beide Datumsangaben vorhanden sind, können wir noch prüfen, ob das Eintrittsdatum gegebenenfalls hinter dem Austrittsdatum liegt und den Benutzer darauf hinweisen. Er muss den Vorgang dann erneut starten. Sind die Daten hingegen korrekt, fügt die Prozedur den Datensatz mit einer INSERT INTO-Aktionsabfrage zur Tabelle tblVereinszugehoerigkeiten hinzu. Diesmal berücksichtigt sie dabei nicht nur die Felder MitgliedID und Eintrittsdatum, sondern auch noch das Feld Austrittsdatum.

ändern eines bestehenden Zeitraums

Wenn der Benutzer doppelt auf einen der vorhandenen Einträge klickt, löst dies die Ereignisprozedur lstVereinszugehoerigkeiten_DblClick aus, die Sie in Listing 2 finden.

Private Sub lstVereinszugehoerigkeiten_DblClick(Cancel As Integer)
     Dim db As DAO.Database
     Dim datEintritt As Date, datAustritt As Date
     Dim strEintritt As String, strAustritt As String
     Dim lngVereinszugehoerigkeitID As Long
     lngVereinszugehoerigkeitID = Nz(Me!lstVereinszugehoerigkeiten.Column(0), 0)
     If lngVereinszugehoerigkeitID = 0 Then
         MsgBox "Sie müssen einen Eintrag auswählen.", vbOKOnly, "Kein Eintrag ausgewählt."
         Exit Sub
     End If
     strEintritt = Nz(Me!lstVereinszugehoerigkeiten.Column(1), "")
     strAustritt = Nz(Me!lstVereinszugehoerigkeiten.Column(2), "")
     strEintritt = InputBox("Geben Sie das Eintrittsdatum an.", "Startdatum", strEintritt)
     Set db = CurrentDb
     If Len(strEintritt) > 0 Then
         If IsDate(strEintritt) Then
             datEintritt = CDate(strEintritt)
             strAustritt = InputBox("Geben Sie das Austrittsdatum an.", "Austrittsdatum", strAustritt)
             If Len(strAustritt) > 0 Then
                 If IsDate(strAustritt) Then
                     datAustritt = CDate(strAustritt)
                     If datEintritt > datAustritt Then
                         MsgBox ("Das Eintrittsdatum muss vor dem Austrittsdatum liegen. Die Eingabe wird abgebrochen.")
                         Exit Sub
                     Else
                         db.Execute "UPDATE tblVereinszugehoerigkeiten SET Eintrittsdatum = " & SQLDatum(datEintritt) _
                             & ", Austrittsdatum = " & SQLDatum(datAustritt) & " WHERE VereinszugehoerigkeitID = " _
                             & Me!lstVereinszugehoerigkeiten, dbFailOnError
                         Me!lstVereinszugehoerigkeiten.Requery
                     End If
                 Else
                     MsgBox ("''''" & strAustritt & "'''' ist kein gültiges Austrittsdatum.")
                     Exit Sub
                 End If
             Else
                 db.Execute "UPDATE tblVereinszugehoerigkeiten SET Eintrittsdatum = " & SQLDatum(datEintritt) _
                      & ", Austrittsdatum = NULL WHERE VereinszugehoerigkeitID = " _
                      & lngVereinszugehoerigkeitID, dbFailOnError
                 Me!lstVereinszugehoerigkeiten.Requery
             End If
         Else
             MsgBox ("''''" & strEintritt & "'''' ist kein gültiges Eintrittsdatum.")
             Exit Sub
         End If8
     Else
         MsgBox ("Das Eintrittsdatum kann nicht geleert werden.")
         Exit Sub
     End If
End Sub

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

TestzugangOder bist Du bereits Abonnent? Dann logge Dich gleich hier ein. Die Zugangsdaten findest Du entweder in der aktuellen Print-Ausgabe auf Seite U2 oder beim Online-Abo in der E-Mail, die Du als Abonnent regelmäßig erhältst:

Schreibe einen Kommentar