Home > Artikel > Ausgabe 5/2015 > Daten ins Web exportieren

Daten ins Web exportieren

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

Nicht selten tritt der Fall ein, dass die Inhalte Ihrer Datenbank auch anderen Personen zur Verfügung gestellt werden sollen, die eben kein Access installiert haben. Abseits anderer Austauschformate ist der Browser die wahrscheinlich einfachste Methode, um Daten zur Anzeige zu bringen – und das auch auf mobilen Geräten! Sehen wir nach, welche Mittel Access mitbringt, um Daten tabellarisch in HTML-Dateien für das Internet zu speichern.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1505_Webexport.accdb

Access-Daten im Internet

Um es vorneweg klarzustellen: Hier geht es nicht um die Veröffentlichung von Datenbanken über die seit Access 2007 mögliche Interaktion mit den Sharepoint-Servern von Microsoft Office 365. Zwar ist dieses eingebaute Feature die sicher komfortabelste Lösung, um Daten interaktiv ins Web zu bringen, erfordert aber einen Server-Platz und einen Account bei Microsoft mit zahlreichen Beschränkungen.

Die performanteste Lösung ist es überdies auch nicht. Und warum sollten Sie, so Sie bereits im Besitz eines Providers und Web-Space sind, noch zusätzliche Kosten auf sich nehmen, die mit aktuell mindestens 69 Euro pro Jahr gar nicht so gering ausfallen?

Für den nur lesenden Zugriff auf Tabellendaten ist Office 365 wie mit Kanonen auf Spatzen geschossen. Es geht auch einfacher, wie wir sehen werden. Die einzige Voraussetzung, die erfüllt sein muss: Sie haben einen Web-Space mit FTP-Zugang, über den Sie HTML-Dateien veröffentlichen können.

HTML-Export mit dem Export-Assistenten

Access verfügt von Haus aus über die Exportmöglichkeit in das HTML-Format. Dazu markieren Sie eine Tabelle oder Abfrage im Navigationsbereich und öffnen das Kontextmenü über Rechtsklick. Wählen Sie dann Exportieren | HTML-Dokument. Alternativ kann dies auch über den Ribbon und Externe Daten | Exportieren | Weitere | HTML-Dokument erfolgen. Das ruft den Exportieren-Dialog von Access auf den Plan, welcher Sie nach dem Speicherort für die anzulegende HTML-Datei fragt. Hier ist selbstverständlich die Speicherung im Dateisystem gemeint und nicht bereits etwa eine Schnittstelle über FTP ins Internet.

Neben der Zieldatei lassen sich im Dialog noch drei weitere Optionen aktivieren. Exportieren von Daten mit Layout und Formatierung führt dazu, dass Access die Darstellung der Tabelle in der Datenblattansicht in das HTML-Dokument zu übertragen versucht. Öffnen der Zieldatei nach Abschluss des Exportvorgangs bewirkt das Öffnen des Standardbrowsers mit der angelegten HTML-Datei. Exportieren der ausgewählten Datensätze ist nur dann aktivierbar, wenn Sie bereits eine Tabelle oder Abfrage geöffnet und in dieser Datensätze markiert haben. Der Assistent berücksichtigt solche offenen Datenblätter automatisch, jedoch nur dann, wenn sie bei seinem Start schon geöffnet sind. Nachträglich lässt sich das nicht machen, da der Dialog modal ist und keine weiteren Aktionen der Access-Oberfläche zulässt.

Formulare lassen sich übrigens auf die gleiche Weise exportieren. Erwarten Sie aber nicht, dass Access auch hier das Layout nachzubilden versucht. Es nimmt schlicht die Datenherkunft des Formulars, so, als wäre sie in eine Datenblattansicht geladen, und exportiert diese.

In Bild 1 ist die Abfrage Wettkampfergebnisse der Beispieldatenbank zum Export in das HTML-Format ausgewählt, ein Block von Datensätzen markiert und schließlich der Assistent aufgerufen worden. Alle drei Optionen des Dialogs sind aktiviert. Nach Klick auf OK startet der Export sofort, aber auch nur dann, wenn die Option zu Layout und Formatierung nicht eingeschaltet war. Andernfalls nämlich fragt der Assistent in einem Zwischenschritt noch nach einer etwaigen Vorlage und nach der Textkodierung, wie in Bild 2. Während die Angabe der Codierung, welche standardmäßig ANSI vorsieht, im Zweifelfall bei internationalen Inhalten oder Sonderzeichen in der Datenherkunft Sinn macht und ohne Weiteres auf Unicode gesetzt werden darf, wobei UTF-8 wegen der kleineren resultierenden Dateigröße zu bevorzugen wäre, stellt einen die Option zur HTML-Vorlage vor Rätsel. Denn in den aktuellen Hilfedateien von Access werden Sie vergeblich nach dem Aufbau einer solchen Vorlage forschen. Auch im Internet sind nur rudimentäre Angaben zu finden. Machen wir es kurz: Diese Option ist ein Überbleibsel aus Office 2000-Zeiten und die Möglichkeiten zur Gestaltung des HTML-Dokuments über die Vorlage sind stark beschränkt und nicht mehr zeitgemäß. Ignorieren Sie diese Option besser. Sie werden mit der Vorlage mehr Arbeit haben, als mit einem Formatieren der HTML-Datei über VBA.

HTML-Exportdialog über den Access-eigenen Assistenten auf die Abfrage Wettkampfergebnisse

Bild 1: HTML-Exportdialog über den Access-eigenen Assistenten auf die Abfrage Wettkampfergebnisse

Der Export-Assistent fragt nach Vorlage und Textkodierung

Bild 2: Der Export-Assistent fragt nach Vorlage und Textkodierung

Sehen wir uns nun das Ergebnis des Exports im Browser an. Die Anzeige entspricht weitgehend der Datenblattansicht der Abfrage, kommt jedoch etwas altbacken daher (siehe Bild 3). Das Layout der HTML-Tabelle lässt sich leider in keiner Weise beeinflussen. Zwar können Schriftarten, -größen und -farben über die Datenblattansicht der Abfrage vordefiniert werden, was sich dann auch im Export niederschlägt, aber über den Tabellenkopf oder die Zellbegrenzungen und -ränder lässt Access nicht mit sich reden.

Ausgabe der HTML-exportierten Tabelle im Browser

Bild 3: Ausgabe der HTML-exportierten Tabelle im Browser

Werfen wir noch einen Blick in den Quellcode der HTML-Datei. Dieser wird jedem Web-Designer die Haare zu Berge stehen lassen. Hier ist jede einzelne Zelle (TD) mit Style-Informationen versehen, die ihren Ursprung in der Datenblattformatierung hat, wie in Listing 1. Von CSS-Formatierungen oder Ähnlichem keine Spur. Das treibt die Dateigröße bei umfangreicheren Tabellen gewaltig in die Höhe und macht dem Browser zudem einige Arbeit. Die Wettkampf-Abfrage der Beispieldatenbank mit ihren 3.300 Datensätzen etwa kommt so auf eine HTML-Datei von 3 MB, obwohl der reine Textinhalt nur mit 200 KB zu veranschlagen ist.

1

34663

Standard

m

Schulz, Katharina

04.12.1990

01:22:32

39,981

Listing 1: HTML-Tags einer Tabellenzeile der aus Access exportierten Abfrage

Damit eignet sich diese Methode eher für kleinere Datenmengen, bei denen auf die Gestalt der Browserdarstellung kein Wert gelegt wird.

Export über VBA

Zum gleichen Ergebnis kommen Sie, wenn Sie eine Tabelle oder Abfrage nicht manuell, sondern über VBA in eine HTML-Datei exportieren. Dafür reicht bereits eine einzige Codezeile aus, welche die generelle Export-Anweisung DoCmd.OutputTo enthält:

DoCmd.OutputTo acOutputQuery, _

     "Wettkampfergebnisse", _

     acFormatHTML, _

"d:\XYZ\export.html", True, , _

"UTF-8"

Ihre Parameter im Einzelnen: acOutputQuery sagt Access, dass eine Abfrage zum Export ansteht. (acOutputTable wäre das Pendant für eine Tabelle.) Der Name der Abfrage oder Tabelle folgt als nächster Parameter – hier Wettkampfergebnisse. Dass es beim Export um das HTML-Format gehen soll, wird über die Konstante acFormatHTML angegeben. Darauf folgt der volle Pfad zur Zieldatei. Das anschließende True weist Access an, nach dem Export den Browser mit der Datei zu öffnen. Den Parameter für eine mögliche Vorlage überspringen wir. Die Codierung des HTML-Codes wird als letzter Parameter hier mit dem String UTF-8 definiert. Die letzten Parameter sind optional, obligatorisch nur die ersten vier.

Das Ergebnis dieses VBA-Exports stimmt mit dem des Assistenten exakt überein, wobei hier automatisch die Option Mit Formatierung und Layout angenommen wird, denn das lässt sich per VBA leider nicht einstellen.

Export über Programmierung

Nach dem bisher Dargestellten wird deutlich, dass der HTML-Export über Access-Bordmittel keinen höheren Ansprüchen genügt. Zum Glück handelt es sich aber bei HTML um ein reines Textformat, dessen Code somit auch mit VBA-String-Funktionen zusammengesetzt werden kann. Natürlich kommt man in diesem Fall nicht ohne grundlegende HTML-Kenntnisse aus, aber die hat man sich schnell angeeignet.

Eine ganz rudimentäre HTML-Datei ergibt sich etwa über eine Prozedur, wie die folgende:

Sub ExportHTML()

   Dim sHTML As String

   sHTML = "" & _

    "Hallo!"

   Open "d:\xyz.html" For Binary As #1

   Put #1, , sHTML

   Close #1

End Sub

In der String-Variablen sHTML wird der HTML-Code der Datei abgelegt. Der zugewiesene Code besteht lediglich aus den grundlegendsten Tags mit einem Hallo! im Body. Die String-Variable wird binär in eine per Open-Anweisung erzeugte Datei gespeichert, wobei die Put-Methode zum Einsatz kommt. Das ist die Grundstruktur, die sich dann erweitern lässt. In sHTML lassen sich durch String-Verkettung beliebige Inhalte unterbringen, die etwa auch aus den Daten einer über ein Recordset geöffneten Tabelle oder Abfrage stammen können.

Neben den reinen Daten können außer Style-Auszeichnungen ebenso JavaScript-Funktionen eingebaut werden. Wie die Lösung aussehen könnte, wird am Beispiel der Demo-Datenbank erläutert.

Wettkampfergebnisse

Als Beispiel haben wir eine Datenbank erstellt, die fiktive Radrennen verwaltet. Die Zeitnahmen der Teilnehmer kämen etwa über ein Interface mit einem Zeitnehmersystem in die Tabelle tblResultate, wo sie den Teilnehmern der Tabelle tblTeilnehmer zugeordnet sind. Als Hilfstabellen finden sie die tblAltersklassen, welche zu den jeweiligen Altersgruppen die Bezeichnungen enthält, sowie die tblWettkampfe, die alle ausgetragenen Rennen verzeichnet. Das Datenmodell stellt Bild 4 dar. Es ist an einigen Stellen redundant. So ist die Spalte kmh der Resultate-Tabelle etwa ein berechnetes Feld, dessen Inhalt sich aus der Strecke und der genommenen Zeit ergibt, also über eine Abfrage ausgegeben werden könnte. Für den leichteren Export wurde hier aber der Wert diskret eingerechnet. Ähnlich verhält es sich mit der Altersklasse AK der Teilnehmertabelle. Da sich diese über das Alter der Personen ergibt, welches durch das angegebene Geburtsdatum definiert ist, wäre die Angabe an sich überflüssig. Auch hier dient das berechnete Feld dem vereinfachten Export.

Datenmodell der Beispieldatenbank zur Verwaltung von Radrennen

Bild 4: Datenmodell der Beispieldatenbank zur Verwaltung von Radrennen

Das ganze Vorhaben ist durchaus realistisch. Bei solchen Rad- oder Laufwettbewerben stehen die Ergebnisse meist unmittelbar nach Zieleinlauf im Internet. Wir simulieren hier die Veranstaltung.

Dazu dient ein einziges Formular, welches in Bild 5 gezeigt ist. Die Datenquelle basiert auf der Tabelle tblResultate, dies jedoch über eine Abfrage ähnlich zu Bild 6. Es handelt sich um ein Endlosformular, welches im Formularkopf zwei Kombinationsfelder integriert hat, die zur Auswahl und Filterung der Daten dienen.

Abfrage als Datenherkunft für den einfachen Webexport

Bild 5: Abfrage als Datenherkunft für den einfachen Webexport

Das Formular frmErgebnisse der Beispieldatenbank in Aktion

Bild 6: Das Formular frmErgebnisse der Beispieldatenbank in Aktion

Im Formularfuß sind zwei Schaltflächen untergebracht, wovon die rechte nur zur Ausgabe der Ergebnisse in eine HTML-Datei über die besprochene einfache Methode DoCmd.OutputTo dient, die linke aber für das Anlegen einer Datei über String-Verkettung aus den Abfragedaten.

Klicken Sie auf eine der Schaltflächen, so werden Sie zunächst mit einem Bestätigungsdialog für den Export konfrontiert. Ein weiterer Dialog fragt danach, ob die Ergebnisse sogleich im Browser begutachtet werden wollen.

Und schließlich können Sie beim Webexport-Button noch der Frage zustimmen, ob die Ergebnisdatei per FTP an den Webserver übertragen werden soll. Betrachten wir anhand einiger Listings in den folgenden Abschnitten, wie die Sache umgesetzt ist.

Filtern der statischen Abfrage

Für den Export über die Methode DoCmd.OutputTo kann auf die Ergebnismenge nicht direkt Einfluss genommen werden. Der Anweisung muss ja ein fester Abfragename als Parameter mitgegeben werden, doch der Export soll genauso gefiltert sein, wie es die Auswahl im Formular anzeigt. Hier ist ein Trick in die Abfrage Wettkampfergebnisse in Bild 6 eingebaut. Die Art des Rennens ist über das Feld IDWettkampf der Tabelle tblResultate definiert.

Auf dieses Feld wird eine Bedingung gesetzt, die sich indirekt aus dem Kombinationsfeld links oben im Formular speist, und zwar über die Hilfsfunktion GetRennen im Modul mdlWinSCP des VBA-Projekts:

Public gRennen As Long

Function GetRennen() As Long

     GetRennen = gRennen

End Function

Sie gibt lediglich den Wertz der globalen Variablen gRennen zurück. Und dieser Wert wird beim Umschalten der Combobox gesetzt und beim Export abgefragt:

Private Sub cmdHTML_Click()

gRennen = Me!cbWettkampf.Value

Somit hängt die eigentlich statische Abfrage im Ergebnis von dem in der Combobox gewählten Rennen ab.

Export per String-Verkettung

Deutlich aufwändiger fällt die Lösung aus, die HTML-Datei komplett per Code zusammenzusetzen. Wobei das für die Beispieldatenbank nicht ganz stimmt.

Denn hier kommt eine Vorlage ins Spiel, die über VBA modifiziert und mit weiteren Inhalten versehen wird. Die Datei nennt sich template_wettkampf.html und befindet sich im Verzeichnis der Datenbank. In der Vorlage sind alle Design-Elemente enthalten und außerdem etliche JavaScript-Abschnitte, denn die Ansprüche an die zu erstellende Website sind nun höher. Einige Teile des Vorlagen-Codes finden sich in Listing 2.

   

   paramTitle

--------------------------------------------------------------------------

--------------------------------------------------------------------------

--------------------------------------------------------------------------

...

Listing 2: Javascript-Teile der Vorlagendatei template_wettkampf.html

Ganz oben stehen die üblichen Auszeichnungen für den Kopf einer HTML-Datei. Für den im Browser anzuzeigenden Titel der Seite steht der Ausdruck paramTitle. Diesen aber möchten wir nicht wirklich als Titel benutzen – es ist nur ein Platzhalter für einen Ausdruck, den wir an dieser Stelle später über VBA einsetzen.

Im folgenden JavaScript-Abschnitt wird der globalen Variablen tndata der Ausdruck paramData als Array (rechteckige Klammern!) zugewiesen. Auch hier handelt es sich um einen Platzhalter, der dann über VBA durch die Daten aus einem Recordset gefüllt wird. Diese Variable dient schließlich zum Anlegen der Tabellenzellen über die Funktion createresults. Die Zellen sind also, bis auf den Tabellenkopf, nicht statisch in der Ausgabedatei hinterlegt, so, wie Access das etwa mit seinem Export-Assistenten macht, sondern werden dynamisch beim Laden der Seite per JavaScript berechnet. Der Abschnitt mit tndata sähe nach dem Ersetzen von paramData etwa so aus:

var tndata = ["38687","Sen I", "Hecht, Siegfried", "w", "03.11.1976","03:22:00", "44.553", "19277", "Standard", "Ahrens, Thimo", "w", "16.04.1992", "03:24:37"," 43.984"]

Die Daten der Abfrage sind also schlicht kommagetrennt sequenziell aneinandergehängt. Das Array wird damit eindimensional, und ein Datensatz wird durch einen Index angesprochen, der der Zahl der Spalten, hier 7, multipliziert mit der Nummer des Datensatzes, entspricht. Die ID des Teilnehmers Thimo Ahrens wird in eine Zelle geschrieben, die sich für den zweiten Datensatz über diese Formel errechnet:

td.innerHTML = tndata[(2-1)*7 + 0]

Natürlich werden nicht hartcodierte Werte eingesetzt, sondern das Array über eine Schleife abgearbeitet.

Ganz unten im Listing beginnt der eigentliche HTML-Code der Datei. Das body-Tag ist mit einem JavaScript-Event beim Laden der Seite (onload) versehen, der die Funktion createresults aufruft und damit die Tabellenzellen aus dem Inhalt der Array-Variablen tndata erzeugt.

Kommen wir auf die Bedeutung des etwas komplexer eingesetzten clickhandler in der Routine createresults zu sprechen. Hier wird per Code eine Ereignisprozedur pro Ausgabezeile der Tabelle erzeugt, die beim Anklicken der Zeile (tr.onclick) ausgelöst wird. Ein Klick auf eine Ergebniszeile führt damit zum Aufruf der Funktion getteilnehmer(), wobei als Parameter der Zeilenindex rw übergeben wird. Anhand dieses Index kann die Funktion getteilnehmer wiederum aus dem Array tndata die Daten der Zeile ermitteln, um sie weiterzuverwenden. Die Funktion ist in Listing 3 wiedergegeben. Über die Teilnehmer-ID tid findet sie die einzelnen Datenzellen und speichert sie in einer Tabelle, die in der HTML-Vorlage weiter unten definiert ist und die Element-Id mylightbox tragt. Auch die Zeilen dieser Tabelle sind mit Element-Ids versehen, so dass sie über die DOM-Funktion getElementById identifiziert werden können.