Eingangs hatten wir bereits erläutert, dass Berichte und Formulare über eine Eigenschaft „Printer“ verfügen, die das „Printer“-Objekt des Druckers darstellt, der für den Ausdruck verwendet werden soll.
Wurde für den Bericht über SEITE EINRICHTEN auf der Registerkarte „Seite“ die Option STAN DARDDRUCKER eingestellt, setzt Access das „Printer“-Objekt des Berichtes auf „Application.Printer“. Sie können diese Einstellung übrigens über die Eigenschaft „UseDefaultPrinter“ des Berichtes abfragen. Wenn für den Bericht die Option SPEZIELLER DRUCKER eingestellt und ein entsprechender Drucker gewählt wurde, speichert Access den Bericht mit dem zum ausgewählten Drucker gehörenden, aus der „Printers“-Auflistung ausgelesenen „Printer“-Objekt.
Um nun einen Bericht auf einem anderen Drucker auszugeben, muss das „Printer“- Objekt des Berichtes vor dem Ausdruck durch das „Printer“-Objekt des gewünschten Druckers ersetzt werden. In der Beispieldatenbank wird das im Formular „Bericht über beliebigen Drucker ausgeben“ demonstriert.
Im Formular sehen Sie zwei Listen: eine Liste BERICHTE, die die in der aktuellen Datenbank verfügbaren Berichte auflistet, und eine Liste DRUCKER mit den auf dem System verfügbaren Druckern.
Nach Auswahl des Berichtes und des gewünschten Druckers startet ein Klick auf die Schaltfläche DRUCKEN den Ausdruck auf dem eingestellten Drucker. Wenn die Option VORSCHAU aktiviert ist, er folgt eine Anzeige des Berichtes in der Seitenansicht auf dem Bildschirm.
So funktioniert die gezielte Ausgabe
Die Ereignisprozedur „Beim Klicken“ der Schaltfläche DRUCKEN führt folgende Anweisungen aus:
Private Sub btnDruck_Click()
Dim R As Report, strReport As String, strPrinter As String, strStdPrinter As String
Dim prtCurr As Printer
On Error Resume Next
strReport = Me.lstBerichte.Value
If Err <> 0 Then
Beep
Exit Sub
End If
Err = 0
strPrinter = Me.clDrucker
If Err <> 0 Then
Beep
Exit Sub
End If
On Error GoTo 0
Hier werden zunächst der gewählte Bericht und der dafür eingestellte Drucker ausgelesen. Kommt es da bei zu einem Fehler, weil eine der beiden Einstellungen noch nicht erfolgt ist, gibt es einen akustischen Hinweis und die Routine wird verlassen.
strStdPrinter = Application.Printer.DeviceName
Für einen später folgenden Vergleich lesen wir hier den aktuell gesetzten Standarddrucker aus.
strStdPrinter = Application.Printer.DeviceName
DoCmd.OpenReport strReport, acViewPreview, , , acHidden
Set R = Reports(strReport)
If R.UseDefaultPrinter And strPrinter = strStdPrinter Then GoTo PrtOK
Wie erwähnt muss das „Printer“-Objekt des Berichtes durch das „Printer“-Objekt des gewünschten Druckers ersetzt werden. Dazu wird der Bericht zunächst in der Vorschau und im Modus „Versteckt“ geöffnet, um ein störendes Flackern des Bildschirms durch die folgenden Zugriffe zu vermeiden.
Danach wird eine Referenz auf den Bericht in die Variable „R“ gesetzt, um die weiteren Zugriffe zu vereinfachen. Im Anschluss erfolgt über „UseDefault Printer“ eine Prüfung, ob die Ausgabe auf dem Standarddrucker erfolgen soll und ob er bereits als Ausgabedrucker gewählt wurde. Ist das der Fall, sind keine weiteren Aktionen notwendig.
Die folgenden Anweisungen werden dann durch eine Verzweigung an die Marke „Prt OK“ übersprungen.
Set prtCurr = Printers(strPrinter) ‚Gewählten Drucker auslesen…
Set R.Printer = prtCurr ‚…und für Bericht setzen
Andernfalls muss das „Printer“-Objekt des Berichtes durch das „Printer“-Objekt des gewählten Druckers ersetzt werden. Dazu wird ein neues, temporäres „Printer“-Objekt „prtCurr“ verwendet, das über „Set prtCurr = Printers(strPrinter)“ zunächst entsprechend initialisiert wird. Mit „Set R.Printer = prtCurr“ wird das „Printer“-Objekt dann dem Bericht zugewiesen und aktiviert.
PrtOK:
If Me.cbPreview Then
DoCmd.OpenReport strReport, acViewPreview
Else
On Error Resume Next
Application.Echo False
DoCmd.SelectObject acReport, strReport, False
DoCmd.PrintOut
DoCmd.Close acReport, strReport
Application.Echo True
End If
End Sub
Anschließend wird abhängig vom Status der Option VORSCHAU der Bericht in der Seitenansicht angezeigt oder der versteckte Bericht selektiert, ausgedruckt und dann wieder geschlossen.
Wichtige Besonderheiten im Formular
In der Liste BERICHTE erscheint neben dem Namen der Berichte der jeweils eingestellte Drucker. Diese Informationen werden beim Öffnen des Formulars wie im folgenden Ausschnitt gezeigt ausgelesen.
Private Sub Form_Load()
Dim db As DATABASE
Dim conTmp As Container
Dim docTmp As Document
Dim strX As String, strReport As String, R As Report
Dim prtLoop As Printer
Me.txtStandard = Application.Printer.DeviceName
Set db = CurrentDb()
Set conTmp = db.Containers(„Reports“)
With Me.lstBerichte
For Each docTmp In conTmp.Documents
strReport = docTmp.Name
DoCmd.OpenReport strReport, acViewPreview, , , acHidden
Set R = Reports(strReport)
If R.UseDefaultPrinter Then
strX = strReport & „;Standard“
Else
strX = strReport & „;“ & R.Printer.DeviceName
End If
DoCmd.Close acReport, strReport, acSaveNo
.AddItem strX
Next docTmp
End With
Me.lstBerichte = Me.lstBerichte.Column(0, 0)
With Me.clDrucker
For Each prtLoop In Application.Printers
.AddItem prtLoop.DeviceName
Next ‚prtLoop
End With
Me.clDrucker = Me.txtStandard
End Sub
Der entscheidende Teil ist im Listing fett hervorgehoben.
Die „Reports“-Auflistung des „Database. Containers“-Objektes liefert zunächst die Namen der einzelnen Berichte. Diese werden versteckt in der Vorschau geöffnet und per Objektvariable „R“ referenziert.
Mit dem Kommando „UseDefaultPrinter“ auf „True“, wird „Standard“ als Drucker verwendet.
Andernfalls lesen wir über „Printer.Device- Name“ den Namen des Druckers aus und fügen diese Information zur Anzeige hinzu.