Aktivitäten zählen

Führen Sie Strichlisten Zum Beispiel über Anrufe bei Kunden, Störungen durch Arbeitskollegen, verzehrten Kaffee oder andere Dinge, die Sie während der Arbeit aufzeichnen möchten Damit ist es nun vorbei: Wir bieten Ihnen den ultimativen Aktivitätenzähler. Damit definieren Sie beliebig viele Aktivitäten in verschiedenen Kategorien und erhöhen die Anzahl mit einem einfachen Mausklick. Die Aktivitäten werden natürlich zur späteren Auswertung inklusive Datum gespeichert.

Das Formular aus Bild 1 ist das wesentliche Element der Benutzeroberfläche des Aktivitätenzählers. Dieses Formular erlaubt das Wechseln des aktuellen Tages und zeigt jeweils die Anzahl der verschiedenen Aktivitäten für das aktuelle Datum an.

pic002.png

Bild 1: Aktivitäten zählen per Mausklick

Mit den beiden Schaltflächen rechts neben dem Textfeld zur Eingabe des Datums schalten Sie jeweils einen Tag vor oder zurück. Das Datumstextfeld selbst ist mit der Klasse clsDatebox ausgestattet.

Das bedeutet, dass Sie die Eingabemarke auf einem Datumsteil platzieren können (entweder Tag, Monat oder Jahr) und den Wert mit den Tasten Nach oben und Nach unten einstellen können.

Unten zeigt das Formular die vorhandenen Aktivitätsbezeichnungen an, das Textfeld neben der jeweiligen Aktivität markiert die Anzahl für den aktuellen Tag. Die beiden Schaltflächen rechts neben der Anzahl dienen zum Erhöhen oder Vermindern des angezeigten Wertes. Negative Werte können auf diese Weise nicht eingetragen werden.

Fehlt noch die Schaltfläche mit der Beschriftung Aktivitäten bearbeiten. Diese öffnet den Dialog aus Bild 2, der eine Übersicht der vorhandenen Aktivitätsbezeichnungen anzeigt. Markieren Sie einen Eintrag und klicken auf die Schaltfläche Aktivitätsbezeichnung löschen, wird diese entfernt.

pic003.png

Bild 2: Verwalten der Aktivitätsbezeichnungen

Ein Doppelklick auf einen Listenfeldeintrag öffnet die Detailansicht mit dem gewünschten Datensatz und die Schaltfläche Neue Aktivitätsbezeichnung zeigt den gleichen Dialog zur Eingabe einer neuen Aktivitätsbezeichnung an.

Dieser Dialog sieht wie in Bild 4.

pic004.png

Bild 3: Anlegen neuer Aktivitätsbezeichnungen

pic005.png

Bild 4: Verwalten und Anlegen neuer Kategorien

Datenmodell des Aktivitätszählers

Das Datenmodell der Datenbank ist überschaubar. Es enthält drei Tabellen und sieht wie in Bild 5 aus. Die Tabelle tblAktivitaetskategorien enthält lediglich das Primärschlüsselfeld AktivitaetskategorieID und das Feld zur Eingabe der Bezeichnung der Kategorie.

pic001.png

Bild 5: Datenmodell der Aktivitäten-Datenbank

Die Tabelle tblAktivitaetsbezeichnungen enthält die Namen der verschiedenen Aktivitäten. Außerdem verweist sie mit dem Fremdschlüsselfeld AktivitaetskategorieID auf die Tabelle tblAktivitaetskategorien, damit jeder Bezeichnung eine Kategorie zugewiesen werden kann.

Fehlt noch die Tabelle tblAktivitaeten. Diese enthält zunächst das Fremdschlüsselfeld AktivitaetsbezeichnungID, mit dem Sie die jeweilige Aktivität festlegen.

Das Feld Aktivitaetsdatum enthält das Datum, an dem die im Feld Aktivitaetsanzahl gespeicherte Anzahl der entsprechenden Aktivität aufgezeichnet wurde.

Damit wird deutlich, dass Sie für die beiden Felder AktivitaetsbezeichnungID und Aktivitaetsdatum einen eindeutigen, zusammengesetzten Schlüssel definieren müssen: Für jede Aktivität soll nur eine Anzahl pro Tag aufgezeichnet werden.

Aktivitäten pflegen

Schauen wir uns zunächst die Formulare zur Verwaltung der Aktivitätsbezeichnungen und Aktivitätskategorien an. Das Formular frmAktivitaetsbezeichnungen ist in Bild 6 abgebildet und enthält ein Listenfeld namens lst. Das Listenfeld soll die Namen der Aktivitätsbezeichnung und der Kategorie anzeigen.

pic007.png

Bild 6: Das Formular zum Verwalten der Aktivitätsbezeichnungen in der Entwurfsansicht

Deshalb enthält die als Datensatzherkunft verwendete Abfrage die beiden Tabellen tblAktivitaetsbezeichnungen und tblAktivitaetskategorien (s. Bild 7). Zusätzlich liefert die Datensatzherkunft den Wert des Feldes AktivitaetsbezeichnungID. Damit dieses nicht angezeigt wird, sind die Eigenschaften Spaltenanzahl und Spaltenbreiten auf die Werte 3 und 0cm;6cm eingestellt (die dritte Spalte wird auf der verbleibenden Breite angezeigt).

pic006.png

Bild 7: Datenherkunft des Listenfeldes zur Anzeige der Aktivitätsbezeichnungen

Ein Doppelklick auf einen Eintrag im Listenfeld löst die Prozedur aus Listing 1 aus. Diese prüft zunächst, ob der Doppelklick überhaupt einen Eintrag getroffen hat.

Listing 1: Öffnen des Formulars zum Bearbeiten von Aktivitätsdetails

Private Sub lst_DblClick(Cancel As Integer)
    If Not IsNull(Me!lst) Then
        DoCmd.OpenForm "frmAktivitaetsbezeichnungdetails", WindowMode:=acDialog, _
            WhereCondition:="AktivitaetsbezeichnungID = " & Me!lst, DataMode:=acFormEdit
        Me!lst.Requery
    End If
End Sub

Falls ja, öffnet die DoCmd.OpenForm-Methode das Formular frmAktivitaetsbezeichnungDetails zum Bearbeiten eines bestehenden Datensatzes. Dieser wird mit dem Parameter WhereCondition auf den im Listenfeld angeklickten Eintrag festgelegt.

Wenn Sie einen neuen Eintrag anlegen möchten, klicken Sie auf die Schaltfläche cmdNeu.

Dies löst die folgende Prozedur aus, die das gleiche Formular öffnet – nur diesmal mit dem Wert acFormAdd für den Parameter DataMode. Anschließend wird das Listenfeld aktualisiert:

Private Sub cmdNeu_Click()
    DoCmd.OpenForm "frmAktivitaetsbezeichnungDetails", WindowMode:=acDialog, DataMode:=acFormAdd
    Me!lst.Requery
End Sub

Ein Klick auf die Schaltfläche cmdLoeschen hingegen löst die Prozedur aus Listing 2 aus. Diese Prozedur prüft ebenfalls, ob der Benutzer überhaupt auf einen Eintrag geklickt hat und nicht etwa in den leeren Bereich des Listenfeldes.

Listing 2: Löschen einer Aktivitätsbezeichnung

Private Sub cmdLoeschen_Click()
    Dim db As DAO.Database
    If Not IsNull(Me!lst) Then
        If MsgBox("Soll die Aktivitätsbezeichnung ''" & Me!lst.Column(1) & "'' wirklich gelöscht werden", _
                vbYesNo + vbExclamation, "Aktivitätsbezeichnung löschen") = vbYes Then
            Set db = CurrentDb
            db.Execute "DELETE FROM tblAktivitaetsbezeichnungen WHERE AktivitaetsbezeichnungID = " & Me!lst
            Me!lst.Requery
            Set db = Nothing
        End If
    End If
End Sub

Falls ja, erscheint ein Meldungsfenster mit der Frage, ob der Benutzer den Datensatz wirklich löschen möchte. Falls ja, verwendet die Prozedur die Execute-Methode des aktuellen Database-Objekts, um eine entsprechende DELETE-Abfrage auszuführen. Anschließend wird das Listenfeld aktualisiert.

Aktivitätsbezeichnungen im Detail

Das Formular frmAktivitaetsbezeichnungenDetail zeigt eine einzelne Aktivitätsbezeichnung an und erlaubt das Einstellen der Bezeichnung sowie der Kategorie, unter der diese Bezeichnung geführt wird (s. Bild 8).

pic008.png

Bild 8: Das Formular mit der Detailansicht einer Aktivitätsbezeichnung in der Entwurfsansicht

Ein spezielles Feature dieses Formulars ist die Möglichkeit, neue Kategorien direkt in das Kombinationsfeld einzutragen. Dies wird durch die Prozedur aus Listing 3 realisiert, die durch das Ereignis Bei Nicht in Liste ausgelöst wird.

Listing 3: Anlegen einer neuen Aktivitätsbezeichnung

Private Sub cboAktivitaetkategorieID_NotInList(NewData As String, Response As Integer)
    Response = acDataErrAdded
    Dim db As DAO.Database
    Set db = CurrentDb
    db.Execute "INSERT INTO tblAktivitaetskategorien(Aktivitaetskategorie) VALUES (''" & NewData & "'')", _
        dbFailOnError
    Set db = Nothing
End Sub

Die Prozedur speichert den mit dem Parameter NewData übergebenen Wert in der Tabelle tblAktivitaetskategorien und gibt für den Parameter Response den Wert acDataErrAdded zurück, was die sonst erscheinende Meldung vermeidet.

Ein Klick auf die Schaltfläche cmdDetails rechts vom Kombinationsfeld zur Auswahl der Kategorie löst die Prozedur aus Listing 4 aus. Diese öffnet das Formular frmAktivitaetskategorien. Dieses funktioniert prinzipiell genau so wie das Formular frmAktivitaetsbezeichnungen.

Listing 4: Öffnen der Übersicht der Kategorien

Private Sub cmdDetails_Click()
    DoCmd.OpenForm "frmAktivitaetskategorien", WindowMode:=acDialog, _
        OpenArgs:=Me!cboAktivitaetkategorieID
    If IstFormularGeoeffnet("frmAktivitaetskategorien") Then
        Me!cboAktivitaetkategorieID = Forms!frmAktivitaetskategorien!lst
        DoCmd.Close acForm, "frmAktivitaetskategorien"
    End If
End Sub

Interessant ist jedoch folgendes Feature: Beim Öffnen des Formulars zum Bearbeiten eines vorhandenen Datensatzes wird dieser direkt im Listenfeld markiert. Dazu wird erstens der aktuell im Kombinationsfeld cboAktivitaetskategorie ausgewählte Eintrag mit dem Parameter OpenArgs an das aufgerufene Formular übergeben.

Dann prüft die Prozedur, die beim Laden des so geöffneten Formulars ausgelöst wird, den Wert des Öffnungsarguments. Sie prüft, ob das Öffnungsargument gefüllt ist, und stellt das Listenfeld auf den damit übergebenen Wert ein:

Private Sub Form_Load()
    If Not IsNull(Me.OpenArgs) Then
        Me!lst = Me.OpenArgs
    End If
End Sub

Nach dem Schließen des Formulars frmAktivitaetskategorien prüft die aufrufende Prozedur cmdDetails_Click, ob das Formular noch geöffnet ist. Falls ja, liest sie den den Wert der im Listenfeld ausgewählten Kategorie ein und legt diese für das Kombinationsfeld cboAktivitaetskategorie fest.

Beim Schließen des Detailformulars frmAktivitaetsbezeichnungDetails ist Vorsicht angesagt. Wenn Sie ein Formular mit der DoCmd.Close-Methode schließen, das gebundene Felder mit Restriktionen enthält, können Probleme auftreten.

Wenn der aktuelle Datensatz die Restriktionen nämlich nicht erfüllt, wird das Formular einfach geschlossen, ohne den Datensatz zu speichern – und ohne dass der Benutzer überhaupt davon erfährt, dass der Datensatz nicht gespeichert wurde! Also fügen wir in der Prozedur, die beim Klicken auf die Schaltfläche cmdOK ausgelöst wird, vorsichtshalber eine kleine Validierung durch (s. Listing 5).

Listing 5: Schließen des Formulars frmAktivitaetskategorien

Private Sub cmdOK_Click()
    If Me.Dirty Then
        If IsNull(Me!txtAktivitaetsbezeichnung) Then
            MsgBox "Geben Sie eine Bezeichnung ein."
            Me!txtAktivitaetsbezeichnung.SetFocus
            Exit Sub
        End If
        If IsNull(Me!cboAktivitaetkategorieID) Then
            MsgBox "Wählen Sie eine Kategorie aus."
            Me!cboAktivitaetkategorieID.SetFocus
            Exit Sub
        End If
    End If
    DoCmd.Close acForm, Me.Name
End Sub

Diese prüft zunächst, ob die Daten des aktuellen Datensatzes überhaupt geändert wurden. Falls ja, untersucht die Prozedur die Werte der beiden Felder auf Gültigkeit. Nur wenn beide in Ordnung sind, wird das Formular geschlossen, sonst erscheint eine entsprechende Meldung.

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

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar