Home > Artikel > Ausgabe 1/2018 > Aufgabenplaner

Aufgabenplaner

  PDF ansehen

  Download PDF und Beispieldatenbank

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

End Sub

Ein Klick auf die Abbrechen-Schaltfläche schließt ebenfalls das Formular, ruft aber zuvor noch die Undo-Methode des Formulars auf, was zum Verwerfen der seit dem letzten Speichern durchgeführten Änderungen führt:

Private Sub cmdAbbrechen_Click()

Me.Undo

DoCmd.Close acForm, Me.Name

End Sub

Das heißt nicht, dass der Benutzer nicht auch vor dem Betätigen der Abbrechen-Schaltfläche einen Datensatz anlegen kann: Er kann durchaus Daten eingeben und den Datensatz etwa durch Betätigen der Tastenkombination Strg + S speichern.

Damit er einen neuen Datensatz, den er später verwerfen will, nicht durch Navigieren zu einem neuen Datensatz mit der Tabulator-Taste speichert, stellen wir die Eigenschaft Zyklus auf Aktueller Datensatz ein.

Anlegen einer neuen Aufgabe für ein bestimmtes Datum

Wenn der Benutzer die Schaltfläche cmdNeuMitDatum wählt, die sich im Bereich Erledigen am - Kopfbereich befindet, soll das Datum im Feld ErledigenAm voreingestellt werden. Dazu übergeben wir dem Formular frmAufgabe dieses Datum mit dem Öffnungsargument der DoCmd.OpenForm-Methode.

Die Prozedur cmdNeuMitDatum_Click sieht dementsprechend wie folgt aus:

Private Sub cmdNeuMitDatum_Click()

DoCmd.OpenForm "frmAufgabe", WindowMode:=acDialog, DataMode:=acFormAdd, OpenArgs:=Me!ErledigenAm

Me.Requery

End Sub

Den so übergebenen Wert müssen wir im geöffneten Formular natürlich auch noch verarbeiten.

Da wir gleich auf die DefaultValue-Eigenschaft der TextBox-Steuerelemente zugreifen wollen, benennen wir diese noch um. Dazu fügen wir den bisherigen, automatisch vergebenen Steuerelementnamen, die mit den Feldnamen übereinstimmen, jeweils das Präfix txt hinzu. Aus ErledigenAm wird dann also txtErledigen am. Warum das Ganze? Vorher hießen Steuer­element und gebundenes Feld gleich. Gebundene Felder haben jedoch nicht die Eigenschaft DefaultValue, was zu Problemen führen kann. Also sorgen wir lieber durch entsprechende Benennung für eine problemlose Zuweisung der Standardwerte.

Das Aufnehmen des Öffnungsarguments gelingt mit der folgenden Prozedur, die durch das Ereignis Beim Öffnen des Formulars ausgelöst wird. Wenn die Eigenschaft OpenArgs des Formulars einen Wert mit einer Länge größer als 0 aufweist, dann wollen wir die Eigenschaft DefaultValue des Textfeldes txtErledigenAm auf den Wert von Me.OpenArgs einstellen. Da diese Eigenschaft nur Zeichenketten entgegennimmt, müssen wir Me.OpenArgs noch in Anführungszeichen einfassen, die wir mit Chr(34) angeben:

Private Sub Form_Open(Cancel As Integer)

If Len(Me.OpenArgs) > 0 Then

Me!txtErledigenAm.DefaultValue = Chr(34) & Me.OpenArgs & Chr(34)

End If

End Sub

Wenn der Benutzer nun wie in Bild 7 auf die Hinzufügen-Schaltfläche cmdNeuMitDatum klickt, erscheint das passende Formular mit voreingestelltem Datum.

Anlegen einer neuen Aufgabe für ein bestimmtes Datum

Bild 7: Anlegen einer neuen Aufgabe für ein bestimmtes Datum

Hier braucht der Benutzer nun nur noch den Bezeichnungstext einzugeben und die Kategorie auszuwählen. Ein Klick auf die Schaltfläche cmdOK schließt das Formular und speichert den neu angelegten Datensatz automatisch. Der Aufruf der Requery-Methode im Bericht in der Berichtsansicht sorgt dann gleich dafür, dass der neue Datensatz auch in der Liste der Aufgaben erscheint.

Anlegen einer neuen Aufgabe mit Datum und Kategorie

Wenn der Benutzer bereits weiß, zu welcher Kategorie die neue Aufgabe gehören soll, kann er auf die Hinzufügen-Schaltfläche cmdNeuMitKategorie neben der Bezeichnung der Kategorie klicken. Hier haben wir nun zwei Möglichkeiten:

  • Da ja Datum und Kategorie praktisch schon ausgewählt wurden, brauchen wir nur noch die Bezeichnung der Aufgabe. Wir kommen also theoretisch mit einer einfachen InputBox aus.
  • Alternativ zeigen wir wieder das Formular frmAufgabe an, diesmal allerdings mit den beiden vorausgefüllten Feldern ErledigenAm und KategorieID. Dies könnte interessant sein, wenn noch weitere Felder hinzukommen wie etwa eine Beschreibung der Aufgabe.

Also schauen wir uns letztere Variante an und fügen noch die Funktionen hinzu, um den zweiten Parameter zu übergeben.

Die Ereignisprozedur für die Schaltfläche cmdNeuMitKategorie sieht wie folgt aus:

Private Sub cmdNeuMitKategorie_Click()

DoCmd.OpenForm "frmAufgabe", WindowMode:=acDialog, DataMode:=acFormAdd, OpenArgs:=Me!ErledigenAm & "|" & Me!KategorieID

Me.Requery

End Sub

Die Prozedur hängt an das Öffnungsargument, das wir mit dem letzten Parameter übergeben, noch ein Pipe-Zeichen und die ID der Kategorie an, für die der Benutzer die Schaltfläche cmdNeuMitKategorie angeklickt hat. Damit wir diese Prozedur nutzen können, müssen wir noch das Feld KategorieID zum Bericht rptAufgabenplaner hinzufügen. Gleichzeitig stellen wir seine Eigenschaft Sichtbar auf den Wert Nein ein (siehe Bild 8).

Hinzufügen eines unsichtbaren Feldes mit der KategorieID

Bild 8: Hinzufügen eines unsichtbaren Feldes mit der KategorieID

Dieses müssen wir nun noch auswerten, was wieder in der Ereignisprozedur Form_Load des Formulars frmAufgabe geschieht. Diese Prozedur sieht wie in Listing 3 aus.

Private Sub Form_Open(Cancel As Integer)

     Dim datDatum As Date

     Dim lngKategorieID As Long

     Dim strOpenArgs() As String

     If Len(Me.OpenArgs) > 0 Then

         strOpenArgs = Split(Me.OpenArgs, "|")

         datDatum = strOpenArgs(0)

         Me!txtErledigenAm.DefaultValue = Chr(34) & datDatum & Chr(34)

         If UBound(strOpenArgs) - LBound(strOpenArgs) > 0 Then

             lngKategorieID = strOpenArgs(1)

             Me!cboKategorieID.DefaultValue = lngKategorieID

         End If

     End If

End Sub

Listing 3: Voreinstellen der Standardwerte beim Öffnen des Formulars frmAufgabe

Die Prozedur prüft wieder, ob Me.OpenArgs überhaupt einen Wert enthält. Falls ja, erstellt sie ein Array aus allen Elementen, die durch das Pipe-Zeichen voneinander getrennt werden.

Wenn wir also etwa die Zeichenkette 1.1.2018|1 übergeben, landet 1.1.2018 im ersten Feld des Arrays und 1 im zweiten Feld. Wenn wir, wie etwa von der Schaltfläche cmdNeuMitDatum aus, nur das Datum übergeben, wird das Array nur ein Element enthalten, nämlich das Datum. Das Datum schreibt die Prozedur in die Variable datDatum, welches im Anschluss als Standardwert an das Steuer­element txtErledigenAm übergeben wird.

Dann prüft die Prozedur, ob das Array mehr als ein Element hat, indem sie den Index des ersten vom Index des letzten Elementes abzieht und prüft, ob der Wert größer als 0 ist.

Falls ja, wird der Wert des zweiten Elements des Arrays in die Variable lngKategorieID geschrieben und von dort als Standardwert des Kombinationsfeldes cboKategorieID übernommen.

Auf diese Weise verarbeiten wir alle Aufrufe – egal, ob Me.OpenArgs keinen, einen oder zwei Elemente liefert.

Bestehende Aufgaben bearbeiten

Wie Sie die Bezeichnung einer Aufgabe bearbeiten können, haben wir ja schon weiter oben gezeigt – per Doppelklick auf die Bezeichnung und anschließendes Bearbeiten in der dann erscheinenden InputBox.

Was aber, wenn wir auch das Datum oder die Kategorie bearbeiten wollen, weil der Benutzer beispielsweise beim Anlegen Daten falsch eingegeben hat? Entweder wir verwerfen die InputBox und zeigen beim Doppelklick auf den Text das Formular frmAufgabe an oder wie fügen noch eine Schaltfläche zum Bearbeiten der Aufgabe hinzu.

Letzteres scheint intuitiver zu sein, also wählen wir diese Variante. Nicht jeder Benutzer versucht, einfach mal doppelt auf einen Eintrag zu klicken ...

Die Schaltfläche fügen wir dann rechts neben der Beschriftung der Aufgabe im Detailbereich des Berichts ein, wo ja noch keine Schaltfläche untergebracht ist. Und wenn wir schon einmal dabei sind, legen wir auch gleich noch eine Schaltfläche an, mit der wir den betreffenden Datensatz löschen können. Das Ergebnis sieht dann im Entwurf wie in Bild 9 aus.

Schaltflächen zum Bearbeiten oder Löschen einer Aufgabe

Bild 9: Schaltflächen zum Bearbeiten oder Löschen einer Aufgabe

Die Prozedur, die durch die Schaltfläche cmdBearbeiten ausgelöst wird, sieht wie folgt aus:

Private Sub cmdBearbeiten_Click()

DoCmd.OpenForm "frmAufgabe", WindowMode:=acDialog, DataMode:=acFormEdit, WhereCondition:="AufgabeID = " & Me!AufgabeID

Me.Requery

End Sub

Die Prozedur nutzt wieder die Methode DoCmd.OpenForm, um das Formular frmAufgabe zu öffnen. Diesmal erhält der zweite Parameter namens DataMode jedoch den Wert acFormEdit, damit das Formular zum Bearbeiten eines Datensatzes und nicht zum Anlegen eines neuen Datensatzes geöffnet wird.

Außerdem übergeben wir mit dem Parameter WhereConditon eine Bedingung, welche dafür sorgt, dass im geöffneten Formular der Datensatz angezeigt wird, dessen Feld AufgabeID den Wert des aktuellen Datensatzes enthält. Das Resultat sieht wie in Bild 10 aus. Nach dem Schließen des Formulars frmAufgabe aktualisiert die Requery-Methode wieder den Inhalt des Berichts.

Bearbeiten eines bestehenden Eintrags

Bild 10: Bearbeiten eines bestehenden Eintrags

Löschen eines Datensatzes

Die Schaltfläche cmdLoeschen, die wir bereits weiter oben angelegt haben, löst die Prozedur aus Listing 4 aus. Die Prozedur fragt zunächst den Benutzer per MsgBox, ob dieser den Datensatz tatsächlich löschen möchte.

Private Sub cmdLoeschen_Click()

     Dim db As DAO.Database

     If MsgBox("Aufgabe '" & Me!Bezeichnung & "' wirklich löschen?", vbCritical + vbOKCancel, "Aufgabe löschen") = vbOK Then

         Set db = CurrentDb

         db.Execute "DELETE FROM tblAufgaben WHERE AufgabeID = " & Me!AufgabeID, dbFailOnError

         Me.Requery

     End If

End Sub

Listing 4: Löschen eines Datensatzes

Dazu wird die Bezeichnung der Aufgabe in der Meldung angezeigt (siehe Bild 11). Klickt der Benutzer hier auf die Schaltfläche OK, werden die Anweisungen innerhalb der If...Then-Bedingung ausgeführt.

Löschen einer Aufgabe

Bild 11: Löschen einer Aufgabe

Hier wird ein Database-Objekt auf Basis der aktuellen Datenbank gefüllt und dann die Execute-Methode dieses Objekt ausgeführt. Als Parameter übergeben wir eine Anweisung, die per DELETE den Datensatz löscht, für den der Benutzer die Schaltfläche cmdLoeschen angeklickt hat.

Zusammenfassung und Ausblick

Diese kleine Lösung zeigt die Möglichkeiten, welche die Berichtsansicht von Access bietet. Statt der Seitenansicht, die keinerlei Interaktion ermöglicht, können wir hier einfach oder doppelt auf Steuer­elemente klicken, um Aktionen auszulösen oder auch Schaltflächen anbringen, mit denen wir die gewünschten Ereignisprozeduren aufrufen.

Weiter geht es im Artikel Berichte im Unterformular, der zeigt, wie Sie einen Bericht in der Berichtsansicht in einem Unterformular anzeigen und im Hauptformular Funktionen unterbringen, mit denen Sie die Daten in der Berichtsansicht filtern oder anderweitig manipulieren können.