Home > Artikel > Ausgabe 1/2018 > Aufgabenplaner

Aufgabenplaner

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

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.

Letzteres könnten wir mit der InputBox aus dem vorherigen Beispiel erledigen. Die ersten beiden Schritte erfordern jedoch den Einsatz eines Formulars, mit dem die drei Eigenschaften festgelegt beziehungsweise mit Standardwerten belegt werden können.

Formular zum Anlegen neuer Aufgaben

Das Formular zum Anlegen neuer Aufgaben soll frmAufgabe heißen und an die Tabelle tblAufgaben gebunden sein.

Die Steuer­elemente sind schnell hinzugefügt, sodass der Entwurf – inklusive zweier Schaltflächen namens cmdOK und cmdAbbrechen – wie in Bild 5 aussieht.

Entwurf des Formulars zur Eingabe einer Aufgabe

Bild 5: Entwurf des Formulars zur Eingabe einer Aufgabe

Da wir mit dem Formular immer nur einen Datensatz bearbeiten möchten, stellen wir die Eigenschaften Datensatzmarkierer, Navigationsschaltflächen, Trennlinien und Bildlaufleisten jeweils auf den Wert Nein ein. Damit das Formular beim Öffnen zentriert angezeigt wird, erhält die Eigenschaft Automatisch zentrieren den Wert Ja.

Interessanter wird allerdings das Öffnen vom Bericht aus sowie das Voreinstellen der Standardwerte für das Feld Datum und gegebenenfalls zusätzlich für das Feld KategorieID.

Einen einzigen Wert könnten wir beim Aufruf mit der DoCmd.OpenForm-Methode leicht mit dem Parameter OpenArgs übergeben. Wenn je nach Anforderung jedoch ein zweiter Parameter übergeben werden soll, wird es spannend.

Aufruf des Formulars

Schauen wir uns jedoch erst einmal an, wie wir das Formular überhaupt vom Bericht rptAufgabenplaner aus aufrufen. Dazu fügen wir dem Bericht drei Schaltflächen hinzu, die wir in den Bereichen Seitenkopf, ErledigenAm - Kopfbereich und KategorieID - Kopfbereich anlegen.

Für eine hübsche Optik sollen die Schaltflächen jedoch keinen Text anzeigen, sondern ein Icon. Dieses fügen wir nach dem Anlegen der Schaltfläche über den Ribbon-Eintrag Entwurf|Steuerelemente|Bild einfügen hinzu. Damit nur das Icon angezeigt wird, aber nicht die eigentliche Schaltfläche, stellen wir die Eigenschaft Hintergrund auf Transparent ein. Außerdem stellen wir die Eigenschaft Rahmenart auf Transparent ein.

Die drei Schaltflächen versehen wir mit den Namen cmdNeu, cmdNeuMitDatum und cmdNeuMitKategorie. Am einfachsten ist es, wenn Sie eine Schaltfläche anlegen und für diese das Bild und den Hintergrund einstellen und diese dann in die übrigen Bereiche kopieren. Das Ergebnis sieht dann schließlich wie in Bild 6 aus. Die Schaltfläche cmdNeu soll das Formular frmAufgabe mit einem neuen, komplett leeren Datensatz anzeigen. Dafür hinterlegen wir die folgende Ereignisprozedur:

Bericht mit Schaltflächen

Bild 6: Bericht mit Schaltflächen

Private Sub cmdNeu_Click()

DoCmd.OpenForm "frmAufgabe", WindowMode:=acDialog, DataMode:=acFormAdd

Me.Requery

End Sub

Nachdem der Benutzer die Daten eingegeben hat, schließt er das Formular durch Betätigen der Schaltfläche cmdOK, welche die folgende Ereignisprozedur auslöst:

Private Sub cmdOK_Click()

DoCmd.Close acForm, Me.Name

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!