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.