Schnappschüsse von Berichten

Access-Berichte auf dem Bildschirm darzustellen, ist die eine Sache, die Weitergabe eine andere. Bei der papierlosen Weitergabe (etwa für den Versand per E-Mail) kommt meist das PDF-Format zum Einsatz. Ohne Hilfsmittel wie Adobe Acrobat oder kostenlose Alternativen ist das nicht möglich. Leider fristet das in Access integrierte Snapshot-Format, das einige ähnlichkeiten mit PDF aufweist, ein Schattendasein. Wir werfen einen genaueren Blick auf dieses Format.

Schnappschüsse erzeugen und anzeigen

Einen Bericht kann man in Access per Menübefehl in eine Snapshot-Datei umwandeln: Markieren Sie einen Bericht im Datenbankfenster und wählen Sie nach einem Rechtsklick den Eintrag Exportieren… aus dem Kontextmenü aus. Alternativ steht dieser Menüeintrag auch über das Hauptmenü und Datei/Exportieren… zur Verfügung. Im nun erscheinenden Dateiauswahldialog stellen Sie als Dateityp Snapshot Format (*.snp) ein. Ein anschließender Klick auf OK öffnet die Drucken-Fortschrittsanzeige von Windows und zeigt die Zahl der exportierten Berichtsseiten an. Wenn Sie im Dateiauswahldialog ein Häkchen auf Autostart gesetzt hatten, öffnet sich anschließend der Snapshot Viewer und zeigt den Bericht an – allerdings nur, wenn der Snapshot Viewer als Teil von Office oder nachträglich installiert wurde. Sollte das nicht der Fall sein, dann springt wahrscheinlich der Installer von Office an und versucht, die Installation des Viewers nachzuholen. Gelingt auch das nicht – etwa, weil die Installationsquelle nicht verfügbar ist -, dann kommt es zur Fehlermeldung “OLE-Server nicht verfügbar”. Die Installations-CD brauchen Sie nicht zwingend: Der Snapshot Viewer kann kostenlos bei Microsoft heruntergeladen werden [1].

Snapshots weisen unter der Voraussetzung, dass keine Bilder in den Bericht eingefügt wurden, eine ähnliche Dateigröße wie entsprechende PDF-Dokumente auf. Jeder, der den Snapshot Viewer auf seinem Rechner hat, kann sie ansehen. Ein installiertes Office ist nicht notwendig.

Neben der EXE-Version des Snapshot Viewers installiert das Setup immer auch ein ActiveX-Steuerelement namens snapview.ocx. Mit diesem Steuerelement können Sie Snapshot-Dateien auch innerhalb von Formularen anzeigen.

Die EXE-Version wie auch das ActiveX-Steuerelement können übrigens nicht nur lokale Dateien öffnen, sondern auch Snapshots direkt aus dem Internet herunterladen und anzeigen. Dazu wählen Sie den Menübefehl Datei/öffnen des Snapshot Viewers aus und geben als Dateiname eine Internetadresse wie http://www.moss-soft.de/public/aiu/test.snp ein.

Was sind Snapshots

Da eine Snapshot-Datei keine Verbindung mehr zur Datenquelle des Ursprungsberichts hat, kann es sich nur um ein grafisches Abbild des Berichts handeln. Die recht kleinen Dateigrößen deuten auf ein hoch komprimiertes Format hin. Da sich ein Snapshot im Viewer ohne Qualitätsverlust nahezu beliebig vergrößern lässt, liegt offensichtlich eine Vektorgrafik vor – Pixelgrafiken würden verschwimmen.

Tatsächlich enthält eine Snapshot-Datei eingebettete EMF-Grafiken (Enhanced Metafile Format). Solche Dateien lassen sich etwa mit der Windows-Bildvorschau betrachten.

Der genaue Aufbau sieht folgendermaßen aus: Die SNP-Datei ist in Wirklichkeit ein CAB-Archiv (ein CAB ist ein mit dem LZ77-Ableger MSZIP komprimiertes Archiv). Machen Sie den Test: Benennen Sie eine SNP-Datei in CAB oder ZIP um, und öffnen Sie sie mit einem Archivierer Ihrer Wahl. Sie werden feststellen, dass sich im Archiv jeweils eine Datei namens _AccRpt_.snp befindet.

Diese wiederum ist ein so genanntes Compound Document, eine Storage-Datei. Eine Storage-Datei kann selbst viele Dateien beherbergen, die Storage-Streams (Word- oder Exceldateien beispielsweise sind ebenfalls Storage-Dateien). Wenn Sie einen Blick auf den Inhalt werfen wollen, installieren Sie den unter [2] als Freeware erhältlichen Storage Viewer. Er wird, wenn Sie die extrahierte Datei _AccRpt_.snp auf ihn ziehen, eine durchnummerierte Liste von Streams anzeigen. Das sind die einzelnen Seiten des Berichts im EMF-Format. Daneben gibt es noch einen Stream namens “Header”, der Eigenschaften des Berichts wie den für ihn eingestellten Drucker oder diverse Abmessungen enthält.

EMF-Format

Grafik-Dateien im Enhanced Metafile Format enthalten keine Bildpunkte, sondern Steueranweisungen, so genannte Meta Records. Diese Steueranweisungen korrelieren eng mit den Grafikfunktionen des Windows-GDI32-API. Wenn etwa ein Schriftzug angezeigt werden soll, dann gibt ein Meta Record lediglich die Formatierung des Fonts, die Positionierung auf der Seite und den Text-String an. Die Viewer-Anwendung übernimmt dann das Rendern dieser Information auf die grafische Oberfläche über GDI32-Funktionen. Der Vorteil ist eine beliebige Skalierbarkeit ohne Qualitätseinbußen. Eine Berichtsseite wird im entsprechenden EMF-Stream, also als Folge von Grafikanweisungen gespeichert, die im Allgemeinen von oben nach unten gemäß der Positionen der Steuerelemente im Bericht übersetzt werden. Es gibt nur zwei Ausnahmen, bei denen die Grafik nicht als Vektorformat übergeben wird: In den Bericht eingebettete Bilder und ActiveX-Steuerelemente. Beide werden in einem Bitmap-Format in den EMF-Stream aufgenommen. Das ist zugleich ein Nachteil gegenüber dem PDF-Format, in dem solche Pixel-Bilder zum Beispiel JPG-komprimiert enthalten sind. Bilder und ActiveX-Steuerelemente im Bericht sorgen damit für eine unverhältnismäßige Vergrößerung der Snapshot-Datei.

EMF-Extractor

Muss man das alles wissen Nun, wenn Sie davon Kenntnis haben, können Sie beispielsweise Routinen programmieren, die aus dem Berichts-Snapshot die EMF-Grafiken extrahieren. Diese können dann weiterverwendet werden, um sie beispielsweise in einer Bildverarbeitung zu Pixelformaten umzuwandeln oder um die EMF-Grafiken verlustfrei in ein Word-Dokument einzubetten.

Das Formular frmEMFExtractor der Beispieldatenbank snapshots.mdb ermöglicht dies. Man kann mit ihm eine Snapshot-Datei laden und die enthaltenen EMF-Grafiken in ein Verzeichnis ausgeben lassen. Eine Vorstellung der dabei zum Einsatz kommenden Routinen würde an dieser Stelle den Rahmen sprengen, da diese vor API-Aufrufen nur so strotzen und die geniale OLE-Typelibrary olelib.tlb des Visual Basic MVP Eduardo Morcillo [3] einsetzen, die der Demo-Datenbank beigefügt ist. Dass es auch ohne einen TLB-Verweis funktioniert, zeigen die Report Utilities von Stephen Lebans [4], die allerdings erheblich aufwändiger gestaltet sind.

Um brauchbare Ergebnisse zu erhalten, ist noch etwas zu beachten: Es ist nicht egal, welcher Drucker in den Einstellungen des Berichts, aus dem die Snapshot-Datei erzeugt wird, angegeben wurde. Unter Seite einrichten können Sie im Berichtsentwurf den Drucker festlegen und außerdem Einstellungen für ihn vornehmen. Diese Einstellungen speichert Access im Bericht, sie beeinflussen die EMF-Grafiken des Snapshots. Wenn nämlich für die Druckeinstellung eine hohe Auflösung, sagen wir 600 dpi, gewählt wurde, muss das Ausgabeprogramm diesen Wert auf 96 dpi für die Anzeige am Bildschirm herunterrechnen. Das führt eventuell dazu, dass die Umrandungen von Steuerelementen sehr dünn ausfallen und verschluckt werden. Beim Konvertieren der EMF-Dateien in Pixelformate zeigt sich der gleiche Effekt. Darum ist es sinnvoll, für den als Snapshot zu exportierenden Bericht einen Drucker zu wählen, der geringe dpi-Einstellungen zulässt. Ein Beispiel wären PDF-Drucker oder der Microsoft Office Document Imaging Writer, der sich mit Office XP oder Office 2003 installieren lässt.

Snapshots per VBA erzeugen

Statt über das Menü kann ein Bericht über die Docmd.OutputTo-Methode auch mit VBA in eine Snapshot-Datei exportiert werden (in eine Zeile):

DoCmd.OutputTo acOutputReport, "rptKunden", acFormatSNP, CurrentProject.Path & "\bericht.snp", False

Diese Anweisung speichert den Bericht rptKunden im aktuellen Verzeichnis der Datenbank als Snapshot-Datei bericht.snp ab. Der Aufruf der Methode führt zur Anzeige des Druckfortschritts von Windows. Das lässt sich leider nicht umgehen. Wenn Sie für den letzten Parameter der Methode den Wert True übergeben, öffnet sich anschließend automatisch der Snapshot Viewer.

Ein wichtiger Hinweis zur Access-Konstanten acFormatSNP: Dahinter verbirgt sich ein String mit dem Inhalt Snapshot Format (*.snp). Leider gibt es in der Version Access 2003 einen Bug, der zum Scheitern der Methode führt, wenn man diese Konstante verwendet, weil sie dort offenbar anders definiert ist und den Ausdruck Snapshot Format oder Snapshot-Format (*.snp) erwartet. Das Service Pack 2 von Office 2003 behebt diesen Bug. Dieser Umstand ist bedauerlich, weil man ja nicht wissen kann, auf welcher Version die Datenbank betrieben wird. Als Workaround empfiehlt sich deshalb der Einsatz einer alternativen Funktion zum Ausgeben eines Snapshots (s. Listing 1).

Listing 1: Routine zum Erzeugen von Snapshot-Dateien aus Berichten unter Umgehung des acFormatSNP-Bugs

Function OutputSnapshot(Reportname As String, _
     OutputFile As String, _
     Optional Autostart As Boolean) As Boolean
     Dim i As Long
     Dim arrFormats As Variant
     Dim bOK As Boolean 
     arrFormats = Array("Snapshot Format", _
     "Snapshot Format (*.snp)", _
     "Snapshot-Format (*.snp)")
     On Error Resume Next
     For i = 0 To 2
         Err.Clear
         DoCmd.OutputTo acOutputReport, _
         Reportname, _
         arrFormats(i), _
         OutputFile, Autostart
             If Err.Number = 0 Then
                 Debug.Print arrFormats(i)
                 bOK = True
                 Exit For
             End If
         Next i
     OutputSnapshot = bOK
End Function

Dabei werden verschiedene Format-Strings durchgetestet, bis einer zum Erfolg führt (Err.Number = 0) – die Funktion gibt dann True zurück. Man könnte die Liste der Formate im Array arrFormats noch erweitern, falls die drei Einträge nicht ausreichen sollten (offenbar gibt es einige fremdsprachige Access-Versionen, die noch andere Format-Strings kennen …).

Snapshot Viewer
im Formular

Dass man Berichte im Snapshot-Format zwischenspeichern, weitergeben und im Viewer anzeigen kann, ist ja ganz nett. Bedeutung kommt dem Format aber zusätzlich durch das Snapshot Viewer-ActiveX-Steuerelement zu (nachfolgend kurz Snapshot Viewer-OCX). Sie können dieses Steuerelement in ein Formular einbetten, indem Sie im Formularentwurf den Menüpunkt Einfügen/ActiveX-Steuerelement… auswählen und aus der Liste den Eintrag Snapshot Viewer-Steuerelement 10.0 auswählen. Sollten Sie Access 2000 verwenden, dann lautet der Eintrag gegebenenfalls Snapshot Viewer-Steuerelement 9.0.

Eine höhere Version als 10.0 gibt es bisher allerdings nicht. Im Rahmen einer Office 2007-Installation sind der Snapshot Viewer und das Snapshot Viewer-OCX übrigens nicht enthalten (Stand 11/2006) – er kann dann unter [1] heruntergeladen und anschließend installiert werden.

Vorteile

Wozu sollte man einen Bericht in einer Datenbank als Snapshot statt in der Berichtsvorschau anzeigen Es gibt einige Gründe, die, je nach Gegebenheit, dafür sprechen:

  • Ist eine komplizierte Abfrage mit vielen Datensätzen die Grundlage für den Bericht, kann dessen Berechnung viel Zeit kosten. Gerade im Mehrbenutzerbetrieb und mit einem Backend auf einem Netzlaufwerk dauert das Umschalten zwischen den Seiten unter Umständen schon mal einige Sekunden – besonders beim Zurückblättern. Das Kontrollieren hunderter Rechnungen in der Berichtsvorschau macht dann recht wenig Spaß (macht es vermutlich auch sonst nicht). Wenn Sie einen Bericht aber lokal als Snapshot-Datei speichern, können Sie flott darin navigieren, und wenn dies komfortabel und flexibel innerhalb eines Formulars mit dem Snapshot Viewer-OCX geschieht, freut sich der Benutzer umso mehr.
  • Sie können Berichte nach änderungen der Daten als Snapshot speichern und schnell darauf zugreifen, weil keine Neuberechnung erforderlich ist. Sie könnten etwa täglich Ausgaben von Berichten in ein Verzeichnis speichern und mit einem Datumsstempel im Dateinamen versehen. Auch die binäre Speicherung von Snapshots im OLE-Feld einer Tabelle wäre eine Möglichkeit.
  • In der Berichtsvorschau können Sie nur mit der Navigationsleiste von einer Seite zur anderen springen, per VBA ist dies nicht direkt möglich. So können Sie beispielsweise, außer über einen passenden Filter, kaum direkt die Seite 10 eines Berichts anzeigen. Das Snapshot Viewer-OCX liefert Methoden, mit denen Sie obige Anforderung leicht per VBA programmieren können.
  • Sie können normalerweise keinen Bericht im Formular einbetten und beispielsweise die enthaltenen Daten nach dem Inhalt bestimmter Steuerelemente filtern. Mit dem Snapshot Viewer-OCX funktioniert dies, ohne dass Sie immer wieder den Bericht neu öffnen müssen.
  • Das Viewer-Steuerelement kennt eine Methode, mit der sich der Bericht zielgerichtet und ohne Umweg über den Drucken-Dialog auf einen beliebigen installierten Drucker ausgeben lässt. Ab Access 2002 ist das zwar mit dem Printer-Objekt eines Reports realisierbar, aber deutlich aufwändiger: Die entsprechende Routine müssen Sie dann in jeden Bericht einbauen.

Programmieren des
Snapshot Viewer-Steuerelements

Alle Menü- und Kontextmenü-Funktionen des Snapshot Viewers lassen sich auch über die Methoden und Eigenschaften des Steuerelements ansteuern.

Im Formular frmKunden der Beispieldatenbank (siehe Bild 1) steuern Schaltflächen und andere Steuerelemente das Snapshot Viewer-OCX. Außerdem reagiert das Formular auf die Ereignisse des Controls, wenn Sie einen entsprechenden Verweis darauf deklarieren und erzeugen. Wenn Sie Access 2002 oder höher verwenden, schauen Sie sich die Datenbank snapshots2003.mdb an, die sich durch Routinen zum Drucker-Handling von der anderen Demo unterscheidet.

frmKunden.tif

Bild 1: Demo-Formular frmKunden mit integriertem Snapshot Viewer-Steuerelement

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar