Zeiträume per Listenfeld und InputBox

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

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

Listing 2: Bearbeiten eines vorhandenen Zeitraums

Die Prozedur ermittelt zunächst über die Eigenschaft Column(0) des Listenfeld-Steuerelements den Wert des in der ersten Spalte angezeigten Feldes. Wobei “angezeigt” der falsche Begriff ist, denn wir haben die Breite dieser Spalte ja auf 0cm eingestellt, wodurch die Spalte faktisch ausgeblendet wird. Der darin enthaltene Wert des Primärschlüsselfeldes der Tabelle tblVereinszugehoerigkeiten für den aktuell markierten Datensatz landet jedenfalls in der Variablen lngVereinszugehoerigkeitID. Gegebenenfalls hat der Benutzer auf eine leere Stelle im Listenfeld geklickt. In diesem Fall liefert Column(0) den Wert Null zurück, den wir durch die Funktion Nz durch den Wert 0 ersetzen. Hat lngVereinszugehoerigkeitID danach den Wert 0, zeigt die Prozedur eine Meldung an, die den Benutzer darauf hinweist, dass er den Doppelklick für einen bestehenden Eintrag ausführen muss. Nun folgt ein vorbereitender Schritt für die Bearbeitung der bestehenden Daten: Wir speichern die in der zweiten und dritten Spalte des markierten Eintrags im Listenfeld befindlichen Werte in den Variablen strEintritt und strAustritt. Dann zeigen wir eine InputBox an, die das Eintrittsdatum abfragen soll und den Wert aus strEintritt als Standardwert nutzt (siehe Bild 6).

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