Aufgabenplaner

Im Artikel Berichtsansicht haben Sie eine neue Ansicht für Berichte kennen gelernt, die ganz neue Möglichkeiten eröffnet. Sie können damit hierarchische Daten anzeigen, ohne das TreeView-Steuerelement nutzen zu müssen und in einer Kombination aus Bericht und Formular arbeiten. Das wollen wir gleich einmal in einer Lösung ausprobieren, mit der Sie Ihre täglichen Aufgaben verwalten können.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1801_Aufgabenplaner.accdb.

Vorarbeiten

Die Vorarbeiten zu diesem Artikel haben im Artikel Berichtsansicht stattgefunden. Dort haben wir bereits ein kleines Datenmodell mit den beiden Tabellen tblAufgaben und tblKategorien erstellt und ein Grundgerüst eines Berichts, der im Entwurf wie in Bild 1 aussieht.

Ausgangspunkt dieser Lösung - der Bericht rptAufgabenplaner

Bild 1: Ausgangspunkt dieser Lösung – der Bericht rptAufgabenplaner

Kontrollkästchen nutzen

Wenn Sie nun auf das Kontrollkästchen klicken, erfolgt nicht die erwartete änderung des Zustands des Kontrollkästchens. Im Gegenteil – ein Warnsignal macht deutlich, dass die gewünschte Funktion nicht verfügbar ist. Also schauen wir uns an, ob wir das Kontrollkästchen auf andere Weise für unsere Zwecke einsetzen können.

Dazu hinterlegen wir für die Ereigniseigenschaft Beim Klicken des Kontrollkästchens eine Ereignisprozedur. Vorher stellen wir die Eigenschaft Name dieses Steuerelements jedoch noch von Erledigt auf chkErledigt um. Wählen Sie dann den Wert [Ereignisprozedur] für die Eigenschaft Beim Klicken aus und klicken Sie auf die Schaltfläche mit den drei Punkten.

Wir gehen nun einmal naiv an die Aufgabe heran und hinterlegen die folgende Prozedur für das Ereignis:

Private Sub chkErledigt_Click()
    If Me!Erledigt = False Then
        Me!Erledigt = True
    Else
        Me!Erledigt = False
    End If
End Sub

Hier wollen wir schlicht prüfen, welchen Wert das Feld Erledigt aktuell hat und den Wert in Abhängigkeit davon auf True oder False ändern. Wenn wir nun in die Berichtsansicht wechseln und auf das Kontrollkästchen eines der Einträge klicken, erhalten wir die Fehlermeldung aus Bild 2.

Fehler beim Zuweisen eines Wertes an ein Feld im Bericht

Bild 2: Fehler beim Zuweisen eines Wertes an ein Feld im Bericht

Offensichtlich weisen die gefundenen Felder eines Berichts auch in der Berichtsansicht keine Möglichkeit auf, Werte zuzuweisen. Doch damit geben wir uns noch nicht geschlagen. Es gibt ja noch die Möglichkeit, die Daten in der zugrunde liegenden Tabelle zu ändern – und wer weiß, vielleicht können wir den Bericht ja nach dieser Aktion aktualisieren, sodass er doch noch den geänderten Wert im Kontrollkästchen anzeigt

Tabellenwert ändern und Bericht aktualisieren

Die Prozedur chkErledigt_Click aktualisieren wir nun wie in Listing 1.

Private Sub chkErledigt_Click()
     Dim db As DAO.Database
     Dim lngAufgabeID As Long
     Dim bolErledigt As Boolean
     Dim strSQL As String
     lngAufgabeID = Me!AufgabeID
     If Me!Erledigt = False Then
         bolErledigt = True
     Else
         bolErledigt = False
     End If
     Set db = CurrentDb
     strSQL = "UPDATE tblAufgaben SET Erledigt = " & CInt(bolErledigt) & " WHERE AufgabeID = " & lngAufgabeID
     db.Execute strSQL, dbFailOnError
     Me.Requery
     Me!chkErledigt.SetFocus
End Sub

Listing 1: Prozedur zum Einstellen des Wertes des Feldes Erledigt

Die neue Version der Prozedur ermittelt zunächst den Primärschlüsselwert des aktuellen Datensatzes, also den Wert des Feldes AufgabeID.

Dazu muss dieses Feld zunächst einmal zum Entwurf des Berichts hinzugefügt werden, am Besten in den Detailbereich. Da wir die Anzeige dieses Wertes in einem Textfeld für die Benutzung des Berichts nicht benötigen, stellen wir die Eigenschaft Sichtbar des Textfeldes auf Nein ein (siehe Bild 3).

Hinzufügen des Feldes AufgabeID als unsichtbares Textfeld

Bild 3: Hinzufügen des Feldes AufgabeID als unsichtbares Textfeld

Danach können wir das Feld nutzen, um den Wert des Primärschlüssels des aktuellen Datensatzes zu ermitteln und in der Variablen lngAufgabeID zu speichern. Auch den Wert des Feldes Erledigt fragen wir hier ab. Hat dieses den Wert False, tragen wir den Wert True in die Variable bolErledigt ein und umgekehrt. Dieser Variable soll den einzustellenden Wert für das Feld Erledigt aufnehmen.

Danach fügen wir der Variablen db einen Verweis auf das aktuelle Database-Objekt hinzu und stellen in der Variablen strSQL die auszuführende SQL-Abfrage zusammen. Wenn wir den Wert des Feldes Erledigt für den ersten Datensatz mit dem Primärschlüsselwert 1 auf True einstellen wollen, sieht der Inhalt von strSQL etwa so aus:

UPDATE tblAufgaben SET Erledigt = -1 WHERE AufgabeID = 1

Diese Abfrage führen wir dann mit der Execute-Methode des Database-Objekts aus. Anschließend aktualisieren wir den Inhalt des Berichts in der Berichtsansicht mit der Requery-Methode, was tatsächlich zum gewünschten Ergebnis führt (siehe Bild 4).

Nun werden die Kontrollkästchen korrekt aktualisiert.

Bild 4: Nun werden die Kontrollkästchen korrekt aktualisiert.

Die Anweisung zum Einstellen des Fokus auf das Kontrollkästchen verhindert, dass das Textfeld mit der Bezeichnung der Aufgabe im Anschluss den Fokus erhält.

Aufgabenbezeichnung bearbeiten

Wie Sie sich vorstellen können, ist auch das Bearbeiten des Inhalts eines Textfeldes in der Berichtsansicht nicht ohne Weiteres möglich. Aber auch hier gibt es Workarounds.

Der einfachste ist, den Text einer Bezeichnung per Doppelklick in einer InputBox anzuzeigen und mit dieser dann den neuen Wert für die Bezeichnung abzufragen. Dazu hinterlegen wir für das Ereignis Beim Doppelklicken des Textfeldes mit dem Feld Bezeichnung, dessen Eigenschaft Name wir zuvor auf txtBezeichnung ändern, die Ereignisprozedur aus Listing 2. Diese arbeitet weitgehend wie die aus dem ersten Beispiel zum ändern des Wertes des Feldes Erledigt.

Private Sub txtBezeichnung_DblClick(Cancel As Integer)
     Dim db As DAO.Database
     Dim strBezeichnung As String
     Dim strSQL As String
     Dim lngAufgabeID As Long
     strBezeichnung = Me!txtBezeichnung
     lngAufgabeID = Me!AufgabeID
     strBezeichnung = InputBox("Neue Bezeichnung eingeben:", "Bezeichnung ändern", strBezeichnung)
     If Len(strBezeichnung) > 0 Then
         Set db = CurrentDb
         strSQL = "UPDATE tblAufgaben SET Bezeichnung = '" & strBezeichnung & "' WHERE AufgabeID = " & lngAufgabeID
         db.Execute strSQL, dbFailOnError
         Me.Requery
     End If
End Sub

Listing 2: Prozedur zum Einstellen des Wertes des Feldes Bezeichnung

Neue Aufgabe anlegen

Wenn Sie eine neue Aufgabe anlegen wollen, wird es schon interessanter. Hier gibt es verschiedene Möglichkeiten:

  • Für das geplante Datum der Aufgabe ist noch kein Eintrag im Bericht vorhanden. Dann muss eine komplett neue Aufgabe angelegt werden – inklusive Bezeichnung, geplantem Erledigungsdatum und Kategorie.
  • Das Datum der Aufgabe ist bereits im Bericht vorhanden, aber es liegt für dieses Datum noch keine Aufgabe in der gewünschten Kategorie vor. Dann können wir in einem Formular zum Anlegen der neuen Aufgabe zumindest schon einmal das Datum vorbelegen.
  • Es ist auch bereits eine Aufgabe unterhalb des gewünschten Datums vorhanden, welche der betreffenden Kategorie angehört. Dann braucht man nur die Bezeichnung der Aufgabe einzugeben.

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar