Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.
André Minhorst, Duisburg; Manfred Hoffbauer, Düsseldorf
In den Tipps und Tricks der vorliegenden Ausgabe finden Sie einige interessante Möglichkeiten, die Ausgabe von Berichten effizienter zu gestalten. Dabei beziehen sich die folgenden Tipps und Tricks zum größten Teil auf die Schritte, die um die eigentliche Berichterstellung herum erfolgen. Nach der Lektüre der kommenden Seiten können Sie Ihre Datenbank zum Beispiel leicht vor Benutzern schützen, die Berichte ohne Daten oder ohne Vorhandensein eines Druckers ausgeben möchten.
Was ist schon ein Bericht ohne Daten Das sollten Sie sich überlegen, bevor Sie Ihre Kunden oder Mitarbeiter auf eine von Ihnen entwickelte Datenbank loslassen.
Um zu verhindern, dass Berichte ohne Daten angezeigt werden, gibt es prinzipiell zwei Möglichkeiten: Entweder Sie überprüfen die Datenherkunft vor dem Aufrufen des Berichts oder Sie verwenden die Ereigniseigenschaft Bei ohne Daten von Berichten.
Datenherkunft vor dem öffnen des Berichts überprüfen
Während der Entwicklungsphase einer Datenbank oder bei Datenbanken für interne Zwecke ist das öffnen von Berichten über einen Doppelklick auf den entsprechenden Eintrag im Datenbankfenster gängige Praxis.
In den meisten Fällen erfordert das öffnen von Berichten aber die übergabe von Parametern wie Filterbedingungen und dergleichen oder die Datenbank soll von Mitarbeitern oder Kunden verwendet werden. Hier erfolgt das öffnen von Berichten in der Regel über entsprechende Prozeduren, die der Benutzer entweder durch das Betätigen von Schaltflächen oder die Verwendung von Menüeinträgen aufruft.
In diesen Fällen können Sie leicht vor dem eigentlichen öffnen des Berichts dessen Datenherkunft überprüfen.
Falls die Datenherkunft keine Daten enthält, geben Sie eine entsprechende Meldung aus und unterbinden das öffnen des Berichts.
Hinweis
Wenn Sie noch einen Schritt weiter gehen möchten, können Sie die Steuerelemente, die dem öffnen des Berichts dienen, erst bei Vorhandensein von Daten aktivieren und ansonsten deaktivieren. Dies zieht aber in der Regel einen unverhältnismäßig hohen Programmieraufwand nach sich.
Verwenden der Ereigniseigenschaft Bei Ohne Daten
Berichte stellen die Ereigniseigenschaft Bei Ohne Daten zur Verfügung, die beim öffnen eines Berichts mit leerer Datenherkunft ausgelöst wird.
Ein Beispiel für den Aufbau dieser Prozedur finden Sie in Quellcode 1.
Neben einer entsprechenden Meldung, die den Benutzer auf das Fehlen der Daten hinweist, müssen Sie den Wert des Parameters Cancel auf den Wert True setzen. Nur dann wird das öffnen des Berichts abgebrochen.
Private Sub Report_NoData(Cancel As Integer) MsgBox "Der Bericht enthält keine Daten." Cancel = True End Sub
Quellcode 1
Private Sub cmdBerichtDrucken_Click() On Error GoTo cmdBerichtDrucken_Click_Err DoCmd.OpenReport "<Berichtsname>" Exit Sub cmdBerichtDrucken_Click_Err: If Err.Number = 2501 Then Resume Next End If End Sub
Quellcode 2
Bild 1: Standarddrucker in der Registry
Wenn Sie den Bericht per Code und nicht über das Datenbankfenster aufgerufen haben, löst das Abbrechen des öffnen-Vorgangs einen Fehler aus. Diesen sollten Sie in der Prozedur mit der Anweisung zum öffnen des Berichts berücksichtigen und eine Fehlerbehandlung wie in Quellcode 2 verwenden.
Bevor ein Bericht überhaupt in der Vorschau angezeigt geschweige denn ausgedruckt werden kann, muss auf dem aktuellen Rechner zunächst einmal ein Drucker installiert und als Standarddrucker definiert sein.
Wenn Sie versuchen, einen Bericht ohne installierten Standarddrucker auszugeben, erhalten Sie eine entsprechende Fehlermeldung.
Bei der Ermittlung des Standarddruckers hilft Ihnen die API-Funktion GetProfileString. Die Funktion dient dem Auslesen bestimmter Werte aus der Windows-Registry (siehe Bild 1) bzw. in früheren Windows-Versionen aus der Datei Win.ini.
Diese Funktion (s. Quellcode 3) deklarieren Sie im Kopf eines neuen VBA-Moduls. Die Funktion StandarddruckerErmitteln ruft die API-Funktion auf und übergibt beim Aufruf automatisch die für die Ermittlung des Standarddruckers erforderlichen Parameter (s. Quellcode 4).
Außerdem verarbeitet sie das Ergebnis der Funktion direkt mit der Funktion TeilstringErmitteln (s. Quellcode 5) weiter, die den ersten der Einträge des Ergebnisses ausliest.
Zeichenketten trennen per Funktion
Die Funktion TeilstringErmitteln hat drei Parameter: Gesamtstring, Trennzeichen und Teilstringnummer. Mit dem ersten Parameter übergeben Sie der Funktion die auszuwertende Zeichenkette.
Der zweite Parameter enthält das Zeichen, das in der Zeichenkette als Trennzeichen verwendet wird – also beispielsweise Komma, Semikolon und so weiter. Der dritte Parameter enthält die Nummer des Elements der Liste, das die Funktion zurückgeben soll.
Private Declare Function GetProfileString Lib "kernel32" Alias "GetProfileStringA" _ (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As _ String, ByVal lpReturnedString As String, ByVal nSize As Long) As Long
Quellcode 3
Public Function StandarddruckerErmitteln() As String Dim Rueckgabewert As String Dim Funktionsergebnis As Long Rueckgabewert = String(255, Chr(0)) Funktionsergebnis = GetProfileString("Windows", "Device", "", Rueckgabewert, _ Len(Rueckgabewert)) If Funktionsergebnis > 0 Then GetDefaultPrinter = TeilstringErmitteln(Rueckgabewert, ",", 1) Else GetDefaultPrinter = "" End If End Function
Quellcode 4
Private Function TeilstringErmitteln(Gesamtstring As String, Trennzeichen As String, _ Teilstringnummer As Integer) As String Dim Startposition As Integer Dim Endposition As Integer Dim AktuelleStringnummer As Integer Dim AktuellesZeichen As Integer AktuellesZeichen = 1 Startposition = 0 For AktuelleTeilstringnummer = 1 To Teilstringnummer - 1 AktuellesZeichen = InStr(AktuellesZeichen, Gesamtstring, Trennzeichen) If AktuellesZeichen = 0 Then Teilstring = "" Exit Function Else AktuellesZeichen = AktuellesZeichen + 1 End If Next AktuelleTeilstringnummer Startposition = AktuellesZeichen Endposition = InStr(Startposition + 1, Gesamtstring, Trennzeichen) If Endposition = 0 Then Endposition = Len(Gesamtstring) + 1 End If Teilstring = Mid$(Gesamtstring, Startposition, Endposition - Startposition) End Function
Quellcode 5
Im vorliegenden Fall übergibt die Funktion StandarddruckerErmitteln der Funktion TeilstringErmitteln die Zeichenkette Acrobat PDFWriter,winspool,LPT1:, als Trennzeichen das Komma und als Nummer des zurückzugebenden Elements die 1.
Die Funktion TeilstringErmitteln gibt folgerichtig die Zeichenkette Acrobat PDFWriter zurück.
Praxis-Tipp
Falls Sie nicht bereits über eine Funktion zum Zerlegen von Zeichenketten verfügen, sollten Sie die Funktion TeilstringErmitteln kopieren und Ihrer Funktionssammlung hinzufügen. Sie kann in vielen weiteren Fällen verwendet werden.
Private Sub cmdBerichtDrucken_Click() If StandarddruckerErmitteln = "" Then MsgBox "Bitte legen Sie einen Standarddrucker fest bzw. installieren Sie " _ & "einen Drucker, falls keiner installiert ist.", _ vbOKOnly + vbExclamation, "Kein Standarddrucker definiert" Else DoCmd.OpenReport "<Berichtsname>" End If End Sub
Quellcode 6
Zur sinnvollen Anwendung der Funktionen müssen Sie diese vor dem Anzeigen von Berichten aufrufen und überprüfen, ob ein Standarddrucker festgelegt ist.
Ist das nicht der Fall, geben Sie einfach eine entsprechende Meldung aus, damit der Benutzer die notwendigen Schritte einleiten kann. Eine entsprechende Prozedur können Sie Quellcode 6 entnehmen.
Die Prozedur wird durch das Betätigen einer Schaltfläche namens cmdBerichtDrucken gestartet und sie überprüft, ob die Funktion StandarddruckerErmitteln einen Wert zurückgibt.
Falls sie eine leere Zeichenkette zurückgibt, erscheint eine entsprechende Meldung. In allen anderen Fällen wird der Bericht auf dem Standarddrucker ausgedruckt.
Die meisten Access-Anwendungen stellen je eine Schaltfläche für die Anzeige der Vorschau und für das Ausdrucken eines Berichts zur Verfügung.
Die durch die Schaltflächen ausgelösten Anweisungen unterscheiden sich nur in dem Parameter View, der einmal acViewPreview und einmal acViewNormal heißt.
Diese Vorgehensweise hat zwei Nachteile: Erstens wird das Dokument immer automatisch auf dem Standarddrucker ausgegeben und zweitens ist diese Methode wenig Windows-konform und damit gewöhnungsbedürftig.
Als Alternative bietet sich folgende Variante an: Stellen Sie dem Benutzer für jeden Bericht Schaltflächen beziehungsweise Menüleisteneinträge zur Verfügung, die der Anzeige des Berichts in der Vorschau dienen.
Bild 2: Drucken-Schaltfläche der Symbolleiste von Berichten
Das Ausdrucken erfolgt zentral über die Menü- bzw. Symbolleiste. Beim öffnen eines Berichts sind sowohl im Menü Datei als auch auf der entsprechenden Symbolleiste (siehe Bild 2) Schaltflächen zum Drucken des aktuell angezeigten Objekts vorhanden.
Und auch in benutzerdefinierten Menüs können Sie leicht entsprechende Einträge unterbringen, wie Bild 3 zeigt.
Bild 3: Drucken-Schaltfläche in einer benutzerdefinierten Menüleiste
Private Sub Report_Activate() MenuepunktAktivieren Application.CommandBars("Buchhaltung"). _ Controls("&Datei").Controls("D&rucken") End Sub Private Sub Report_Deactivate() MenuepunktDeaktivieren Application.CommandBars("Buchhaltung"). _ Controls("&Datei").Controls("D&rucken") End Sub
Quellcode 7
Wenn Sie eine selbst erstellte Schaltfläche auf einem Formular oder in einer benutzerdefinierten Menüleiste zum Ausdrucken von Berichten verwenden möchten, steht die folgende Aufgabe vor Ihnen: Die Schaltfläche soll beim Anzeigen eines Berichtes aktiviert und beim Schließen des Berichtes wieder deaktiviert werden. Optimalerweise wird die Drucken-Schaltfläche auch bereits wieder deaktiviert, wenn aktuell kein Bericht den Focus hat.
Um das zu realisieren, verwenden Sie die beiden Ereigniseigenschaften Bei Aktivierung und Bei Deaktivierung des Berichtes. Das Aktivieren und Deaktivieren von Schaltflächen ist relativ trivial. Komplizierter wird es bei Einträgen in Menü- und Symbolleisten.
Dazu können Sie die im Beitrag Dynamische Menüs mit VBA aus Ausgabe 4/2003 von Access im Unternehmen vorgestellten Funktionen MenuepunktAktivieren und MenuepunktDeaktivieren verwenden.
Für die im Beitrag Einnahme-überschussrechnung mit Access der vorliegenden Ausgabe werden beispielsweise die beiden Prozeduren aus Quellcode 7 verwendet.
Sie können diese Vorgehensweise auch verwenden, wenn Sie mehrere Berichte gleichzeitig geöffnet haben. Dazu müssen Sie die beiden Ereignisprozeduren lediglich für jeden Bericht anlegen.
Wenn Sie dann von einem zum anderen Bericht wechseln, wird zunächst das Ereignis Bei Deaktivierung des ersten Berichts und dann das Ereignis Bei Aktivierung des zweiten Berichts ausgelöst. Auf diese Weise ist die Drucken-Schaltfläche immer aktiviert.
Berichte mit vertikalen Linien stellen im Prinzip kein Problem dar. Sie legen die Linie an, überprüfen das Aussehen des Berichts in der Vorschauansicht und passen gegebenenfalls noch einige Feinheiten an. Aber wehe, Sie wollen eine oder mehrere Felder des Berichts flexibel gestalten und setzen dazu die Eigenschaft Vergrößerbar des jeweiligen Feldes auf den Wert Ja. Dann zeigt der Bericht zwar den Feldinhalt über mehrere Zeilen an, aber die Linie wird nicht mit vergrößert.
Bild 4: Zur kurze Linien in vergrößerbaren Bereichen
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
Testzugang
eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel
diesen und alle anderen Artikel mit dem Jahresabo