Home > Artikel > Ausgabe 10/2011 > Berichte öffnen

Berichte öffnen

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).

Wer mit Access arbeitet, möchte in der Regel auch die enthaltenen Daten hübsch aufbereitet als Bericht präsentieren. Damit der Bericht erscheint, ist allerdings noch ein wenig Handarbeit nötig: Schließlich wollen Sie dem Benutzer Ihrer Datenbank ja hoffentlich nicht das Datenbankfenster oder den Navigationsbereich als Steuerzentrale anbieten, sondern das Öffnen von Berichten und anderen Elementen per Menü, Ribbon oder schlicht von einem Formular aus ermöglichen. Dieser Artikel liefert die nötigen Grundlagen zum Anzeigen von Berichten.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1110_BerichteOeffnen.mdb.

Bericht, öffne Dich!

Zum Öffnen von Formularen und Berichten gibt es im Wesentlichen zwei Möglichkeiten: per Doppelklick auf den entsprechenden Eintrag im Datenbankfenster (bis Access 2003) oder im Navigationsbereich (ab Access 2007) oder mit dem VBA-Befehl DoCmd.OpenForm beziehungsweise DoCmd.OpenReport. Dieser Artikel dreht sich um letztere Anweisung, die einen Bericht auf verschiedene Arten öffnet – und auf verschiedene Benutzeraktionen hin. Zum Testen öffnen Sie einfach den VBA-Editor, aktivieren das Direktfenster mit der Tastenkombination Strg + G und tippen dort einfach folgenden Befehl ein:

DoCmd.OpenReport ""

Uups – schon sendet Access den Bericht an den Drucker. Da der durchschnittliche Access-Entwickler in seiner Laufbahn wohl mindestens zehn Mal mehr Formulare als Berichte öffnet, vergisst er gern, dass DoCmd.OpenReport nur mit dem Berichtsnamen als Parameter den Bericht direkt druckt. Damit der Bericht nicht gedruckt, sondern in der Seitenansicht angezeigt wird, fügen Sie einen weiteren Parameter namens View hinzu und vergeben für diesen den Wert acViewPreview:

DoCmd.OpenReport "rptArtikel", View:=acViewPreview

Das funktioniert: Der Bericht erscheint in der Seitenansicht (siehe Bild 1). Wenn Sie die Seitenansicht eines Berichts etwa über die Schaltfläche eines Formulars öffnen möchten, erstellen Sie zunächst ein Formular mit einer Schaltfläche namens cmdSeitenansicht. Wählen Sie für die Eigenschaft Beim Klicken den Wert [Ereignisprozedur] aus und klicken Sie auf die Schaltfläche mit den drei Punkten (...) rechts neben der Eigenschaft.

Ein in der Seitenvorschau geöffneter Bericht

Bild 1: Ein in der Seitenvorschau geöffneter Bericht

Die nun im VBA-Editor angezeigte leere Ereignisprozedur füllen Sie wie folgt:

Private Sub cmdSeitenansicht_Click()

     DoCmd.OpenReport "rptArtikel", _

         View:=acViewPreview

End Sub

Wenn Sie nun in die Formularansicht wechseln und die Schaltfläche betätigen, erscheint der Bericht wie oben beschrieben (siehe Formular frmBerichteOeffnen, Bericht rptArtikel).

Weitere Berichtsansichten

Neben der Seitenansicht, die Sie mit dem Wert acViewPreview für den Parameter View erhalten, gibt es noch einige weitere Ansichten:

  • acViewDesign: Entwurfsansicht, dient der Anpassung des Entwurfs des Berichts.
  • acViewLayout: Layoutansicht. Wurde mit Access 2007 eingeführt und erlaubt das Anpassen des Entwurfs, während der Bericht Daten anzeigt.
  • acViewNormal: Druckt den Bericht.
  • acViewPivotChart, acViewPivotTable: Werden als Paramter angeboten, funktionieren aber nicht.
  • acViewPreview: Öffnet die Seitenansicht des Berichts.
  • acViewReport: Öffnet die Berichtsansicht (seit Access 2007). Die Berichtsansicht erlaubt interaktiven Zugriff auf einen Bericht.

Angezeigte Daten einschränken

Es gibt zwei Möglichkeiten, die in einem Bericht anzuzeigenden Daten anzuzeigen. Beide legen Sie über einen Parameter der DoCmd.OpenForm-Methode fest:

  • Filtername: Erwartet den Namen einer Abfrage, deren WHERE-Abschnitt als Filter verwendet wird.
  • WhereCondition: Erwartet die Angabe eines SQL-Ausdrucks wie Artikelname LIKE 'A*'.

Die Eigenschaft Filtername ist also eher für Benutzer gedacht, die SQL-Bedingungen lieber mit der Entwurfsansicht von Abfragen definieren, während WhereCondition die direkt Eingabe der SQL-Bedingung erlaubt.

Schauen wir uns zunächst die Methode mit dem Parameter Filtername genau an. Wir öffnen wiederum den Bericht rptArtikel der Beispieldatenbank in der Seitenansicht. Dieser soll nur diesmal nicht alle Datensätze, sondern nur diejenigen anzeigen, deren Feld Artikelname einen Wert enthält, der mit A beginnt. Die für den Parameter Filtername anzugebende Abfrage bezieht sich optimalerweise auf die gleiche Tabelle, die auch in der Datenherkunft des Berichts verwendet wird, also tblArtikel. Der Bericht entnimmt der Abfrage lediglich die Bedingung. Sie brauchen also nicht etwa alle Felder in das Entwurfsraster zu ziehen, die auch im Bericht erscheinen, sondern nur diejenigen, die in der Bedingung verwendet werden. Wir wollen erstmal nur alle Datensätze anzeigen, deren Artikelname mit A beginnt und erstellen daher eine Abfrage wie in Bild 2. Speichern Sie die Abfrage unter dem Namen qryArtikelMitA und rufen Sie den Bericht dann mit folgender Anweisung auf:

Diese Abfrage dient als Filter eines Berichts und wird mit dem Parameter Filtername übergeben.

Bild 2: Diese Abfrage dient als Filter eines Berichts und wird mit dem Parameter Filtername übergeben.

DoCmd.OpenReport "rptArtikel", View:=acViewPreview, Filtername:="qryFilterNurArtikelMitA"

Das Ergebnis sehen Sie in Bild 3. Es funktioniert – der Bericht zeigt genau die richtigen Datensätze an. Fragt sich, was geschieht, wenn Sie die Datensätze der Abfrage anderweitig einschränken, etwa durch ein Kriterium für ein Feld einer verknüpften Tabelle. Ein Beispiel finden Sie in Bild 4: Dort sollen alle Artikel geliefert werden, die von Kunden gekauft wurden, deren Firmenname mit A beginnt. Öffnen wir den Bericht mit folgender Anweisung:

Abfrage, deren Filterkriterium nicht aus der Tabelle stammt, die als Datenherkunft des zu filternden Berichts dient

Bild 3: Abfrage, deren Filterkriterium nicht aus der Tabelle stammt, die als Datenherkunft des zu filternden Berichts dient

Dieser Bericht wurde mithilfe einer für das Kriterium Filter angegebenen Abfrage gefiltert.

Bild 4: Dieser Bericht wurde mithilfe einer für das Kriterium Filter angegebenen Abfrage gefiltert.

DoCmd.OpenReport "rptArtikel", View:=acViewPreview, Filtername:="qryArtikelVonKundeA"

Das Ergebnis sehen Sie in Bild 5: Der Bericht verlangt nach einen Wert für ein Feld namens tblKunden.Firma, das zwar mit der Abfrage als Bedingung übergeben wurde, aber durch die Datenherkunft des Berichts nicht bedient wird. Einem Klick auf die Schaltfläche Abbrechen quittiert Access überdies mit einer Fehlermeldung (siehe Bild 6). Auf diese Meldung und ihre Behandlung kommen wir später zurück. Zunächst einmal bleibt festzuhalten: Die mit der als Filter­name übergebenen Ab­frage festgelegten Kriterien dürfen sich nur auf Felder beziehen, die auch in der Datenherkunft des Berichts befinden.

Beim Öffnen mit einer Abfrage für den Parameter Filtername, die Kriterien enthält, die nicht in der Datenherkunft des Berichts vorkommen, erscheint eine Parameterabfrage.

Bild 5: Beim Öffnen mit einer Abfrage für den Parameter Filtername, die Kriterien enthält, die nicht in der Datenherkunft des Berichts vorkommen, erscheint eine Parameterabfrage.

Diese Fehlermeldung erscheint, wenn der Befehl DoCmd.OpenReport durch den Benutzer abgebrochen wird.

Bild 6: Diese Fehlermeldung erscheint, wenn der Befehl DoCmd.OpenReport durch den Benutzer abgebrochen wird.

Bedingung selbst zusammenstellen

Eigentlich kann man sich das Erstellen einer Abfrage und das Zuweisen ihres Namens mit dem Parameter Filtername sparen, denn das manuelle Zusammenstellen einfacher Kriterien geht einfach schneller von der Hand. Wenn Sie sich also nicht davor scheuen, Ausdrücke wie Artikelname LIKE 'A*' selbst zusammenzustellen, verwenden Sie lieber gleich den Parameter WhereCondition und übergeben Sie das gewünschte Kriterium damit. Der dem vorherigen Beispiel entsprechende Aufruf sieht somit wie folgt aus:

DoCmd.OpenReport "rptArtikel", View:=acViewPreview, WhereCondition:="Artikelname LIKE 'A*'"

Wichtig ist hier, dass die Bedingung korrekt formulieren. In diesem Fall liegt das Augenmerk auf das für ein Textkriterium notwendige Einfassen des Vergleichswertes in Anführungszeichen. Da bereits das komplette Kriterium in Anführungszeichen gesetzt wird, können Sie für den Vergleichswert kein einzelnes Anführungszeichen verwenden. Access würde denken, dass der Ausdruck für WhereCondition hinter dem zweiten Anführungszeichen zu Ende ist und den Rest als weiteren Parameter interpretieren, was wegen des fehlenden Aufzählungszeichens (,) bereits beim Kompilieren einen Fehler auslöst (siehe Bild 7). Stattdessen setzen Sie, wie oben, das Hochkomma ein ('):

Falscher Umgang mit Anführungszeichen wird an Ort und Stelle reklarmiert.

Bild 7: Falscher Umgang mit Anführungszeichen wird an Ort und Stelle reklarmiert.

... WhereCondition:="Artikelname LIKE 'A*'"

Oder Sie verdoppeln die innerhalb der äußeren Anführungszeichen liegenden Anführungszeichen:

... WhereCondition:="Artikelname LIKE ""A*"""

Beides führt letztendlich zum gleichen Ergebnis.

Fenstermodus

Sie können den Bericht, wenn der denn als Fenster geöffnet und nicht gedruckt werden soll, auf verschiedene Arten darstellen. Wenn Sie den dazu verwendeten Parameter WindowMode nicht angeben, benutzt Access den Standardwert acWindowNormal. Es gibt die folgenden Alternativen:

  • acIcon: Der Bericht wird geöffnet und gleich minimiert.
  • acHidden: Der Bericht wird unsichtbar geöffnet.
  • acDialog: Der Bericht wird als modaler Dialog geöffnet. Dies führt dazu, dass die aufrufende Prozedur erst fortgesetzt wird, wenn der Benutzer den Bericht schließt.

Die Option acDialog wird meist zum Öffnen von Formularen verwendet, die zur Eingabe oder Bearbeitung von Daten dienen. Damit soll verhindert werden, dass der Benutzer Daten in mehreren Formularen gleichzeitig bearbeitet und stattdessen jeweils nur eine Baustelle gleichzeitig beackert. Problematisch wird dies, wenn Sie ein Formular als modalen Dialog öffnen und von dort aus einen Bericht anzeigen. Wenn Sie beim Öffnen des Berichts nicht den Parameter WindowMode mit dem Wert acDialog übergeben, wird der Bericht im Hintergrund des öffnenden Formulars angezeigt. Sie können den Bericht dann nicht aktivieren, um diesen beispielsweise auszudrucken oder die angezeigte Seite oder Ansicht zu wechseln.

Falls Sie den Bericht mit acDialog öffnen, erhält der Bericht zwar den Fokus und wird im Vordergrund angezeigt, aber Sie können dennoch nicht auf die Menüleiste beziehungsweise das Ribbon zugreifen, um den Bericht zu drucken. Das ist allerdings auch mit den Befehlen des Kontextmenüs möglich (siehe Bild 8).

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!