Access-Daten mit HTML darstellen

Access-Formulare offenbaren immer wieder mal kleine Mankos: Mal lassen sich keine hierarchisch strukturierten Daten darstellen, mal möchten Sie die Daten vielleicht mit ein paar farbigen Elementen aufhübschen. Mit HTML hingegen ist dies alles möglich – Sie bauen sich einfach mit Elementen wie table, tr und td die gewünschte Struktur auf und füllen diese mit den entsprechenden Daten. Fehlt nur noch ein wenig Interaktivität, oder Nein: Auch das gelingt mit DHTML.

Warum Webbrowser und DHTML

Anlass für das Aufgreifen des Webbrowser-Steuerelements und der Möglichkeiten von DHTML war ein Projekt für einen Kunden, der sich sowohl eine Fehlzeitenübersicht als auch eine Outlook-ähnliche Darstellung von über den Tag verteilten Aufgaben wünschte.

Kein Problem: Die benötigten Elemente lassen sich nämlich prima per HTML darstellen und auch ein Anklicken eines Tabellenelements oder das Anzeigen eines Kontextmenüs lässt sich realisieren.

Die Verwaltung der Fehlzeiten sieht im angesprochenen Projekt übrigens wie in Bild 2 dar.

pic002.png

Bild 1: Fehlzeitenverwaltung auf HTML-Basis

pic001.png

Bild 2: Wochenübersicht

Die Fehlzeitenübersicht erlaubt das Anlegen von Fehlzeiten per Kontextmenü, während die Wochenübersicht die durchgeführten Tätigkeiten beim Überfahren mit der Maus als Tool-TipText anzeigt.

Vorbereitungen

Für eine Darstellung wie in den beiden Abbildungen benötigen Sie zunächst ein Formular mit einem Webbrowser-Steuerelement. Dieses fügen Sie dem Formular in der Entwurfsansicht über den Eintrag ActiveX-Steuerelemente der Toolbox mit den Steuerelementen hinzu (s. Bild 3). Um einen einfachen Text im Webbrowser-Steuerelement anzuzeigen, sind nur wenige Zeilen Code nötig. Als Erstes deklarieren Sie eine Objektvariable mit dem Schlüsselwort WithEvents, damit Sie per Code auf die Ereignisse des Webbrowser-Steuerelements reagieren können:

pic003.png

Bild 3: Formular mit Webbrowser-Steuerelement

Dim WithEvents objWebbrowser As WebBrowser

Dann legen Sie eine Ereignisprozedur an, die durch das Ereignis Beim Laden ausgelöst wird. Diese Prozedur fügt der Variablen objWebbrowser einen Verweis auf das Steuerelement hinzu und ruft eine leere Seite auf (about:blank).

Die folgende Schleife ist eine Warteschleife, die erst verlassen wird, wenn about:blank geladen ist. Erst dann wird mit <p>Hallo!</p> ein Text im aktuellen Dokument im Webbrowser-Steuerelement angezeigt (s. Bild 4).

pic004.png

Bild 4: Eine erste Ausgabe im Webbrowser-Steuerelement

Private Sub Form_Load()
    Set objWebbrowser = Me!ctlWebbrowser.Object
    objWebbrowser.Navigate "about:blank"
    Do While Not objWebbrowser.ReadyState = READYSTATE_COMPLETE
         DoEvents
        Debug.Print objWebbrowser.ReadyState
    Loop
    objWebbrowser.Document.Write "<p>Hallo!</p>"
End Sub

Statt des simplen Textes können Sie im Webbrowser-Steuerelement alles abbilden, was Sie auch in herkömmlichen Webanwendungen vorfinden. Wir interessieren uns jedoch zunächst einmal für die Darstellung von Daten, in den meisten Fällen in tabellarischer oder ähnlicher Form.

Tabellen aufbauen

Eine Tabelle besteht aus table-, tr– und td-Elementen. Wir könnten diese nun im Rahmen einer Do While-Schleife über die darzustellenden Datensätze Zeile für Zeile per Textverkettung zusammensetzen, aber es gibt bessere Methoden.

Und die bieten überdies die Möglichkeit, etwa einzelne Tabellenzellen als Objekt zu referenzieren, diesem weitere Eigenschaften zuzuweisen oder auch Ereignisse für dieses Objekt festzulegen.

Tabelle per DOM anlegen

Wir sprechen dabei von der MSHTML-Bibliothek, die uns die Methoden des Document Object Model zur Verfügung stellt. Um diese zu nutzen, fügen Sie dem VBA-Projekt der Datenbank einen Verweis auf die Bibliothek Microsoft HTML Object Library hinzu (s. Bild 5). Für die folgenden Beispiele lagern wir die Zeilen zum Leeren des Dokuments in eine eigene Prozedur aus, die wie folgt aussieht:

pic005.png

Bild 5: Verweis auf die MSHTML-Bibliothek

Private Sub WebbrowserLeeren()
    objWebbrowser.Navigate "about:blank"
    Do While Not objWebbrowser.ReadyState = READYSTATE_COMPLETE
        DoEvents
    Loop
End Sub

Anschließend legen Sie eine neue Schaltfläche namens cmdEinfacheTabelle im Formular an und hinterlegen die folgende Ereignisprozedur für die Ereigniseigenschaft Beim Klicken:

Private Sub cmdEinfacheTabelle_Click()
      Dim objDocument As MSHTML.HTMLDocument
    Dim objTable As MSHTML.HTMLTable
    Dim objRow As MSHTML.HTMLTableRow
    Dim objCell As MSHTML.HTMLTableCell
    Dim i As Integer
    Dim j As Integer
    WebbrowserLeeren
    Set objDocument = objWebbrowser.Document
    Set objTable = objDocument.createElement("Table")
    objDocument.Body.appendChild objTable
    For i = 1 To 3
        Set objRow = objTable.insertRow
        For j = 1 To 3
            Set objCell = objRow.insertCell
            objCell.innerText = "Zeile " & i & ", Spalte " & j
        Next j
    Next i
End Sub

Die Prozedur deklariert zunächst einige Variablen zum Speichern von Verweisen auf das Dokument sowie auf ein Table-, ein TableRow– und ein TableCell-Element. Sie sehen schon: Die Benennung der Objekte stimmt nicht mit den unter HTML verwendeten Bezeichnungen überein, wo man mit table, tr und td arbeitet. Die hier verwendeten Objektnamen sind jedoch intuitiver.

Die Prozedur leert zunächst das Webbrowser-Steuerelement und speichert dann einen Verweis auf das aktuell enthaltene Document-Objekt in der Variablen objDocument. Dies ist der Ausgangspunkt für weitere Aktionen. Danach erstellt sie mit der CreateElement-Methode ein neues Objekt des Typs HTMLTable. Der CreateElement-Methode übergeben Sie den Typ allerdings ohne vorangestelltes HTML Table reicht also aus.

Damit dieses Element nicht im luftleeren Raum hängt, fügen Sie es als Child-Element an das Element objDocument an. Da Rahmen, Hintergrund et cetera noch nicht festgelegt sind, bleiben diese weiß und die Tabelle ist nicht zu sehen. Dies behalten wir zunächst auch für die Zeilen und Zellen bei. Eine Zeile, also ein HTMLTableRow, wird dem HTMLTable-Objekt mit der Methode insertRow angehängt. Das Ergebnis dieser Methode speichern wir in der Variablen objRow. Diese wiederum bietet die Methode insertCell an, mit der wir die einzelnen Zellen hinzufügen können. Den Verweis auf diese Zellen speichern wir temporär in einer Variablen des Typs HTMLTableCell.

Das Anlegen von Zeilen und Zellen bauen wir in zwei For…Next-Schleifen ein, die jeweils die Zahlen von 1 bis 3 durchlaufen. Damit wird eine Matrix von drei Zeilen mit je drei Zellen erstellt. Schließlich tun wir noch etwas dafür, dass Sie das Ergebnis auch im Formular betrachten können: Wir fügen den Tabellenzellen einen Text hinzu, der die aktuelle Zeile und Zelle markiert. Das Ergebnis zeigt Bild 6.

pic006.png

Bild 6: Per Code erzeugte Tabelle

Rahmen, Abstände und Co.

Wenn Sie eine optisch ansprechende Tabelle anlegen möchten, benötigen Sie Rahmen, Hintergründe, Abstände zum Text und vieles mehr. Die folgenden Abschnitte beschreiben, wie Sie diese Eigenschaften sinnvoll einstellen können. Zunächst einmal: Die MSHTML-Bibliothkek erleichtert die Arbeit schon sehr, weil sie sämtliche Eigenschaften per IntelliSense anbietet. Allerdings gibt es doch noch einiges zu beachten.

Rahmen hinzufügen

Wenn Sie jeder Zelle der Tabelle einen Rahmen hinzufügen möchten, erledigen Sie dies gleich beim Anlegen der Zellen beispielsweise mit den folgenden drei Anweisungen:

objCell.Style.BorderColor = "#000000"
objCell.Style.BorderStyle = "dotted"
objCell.Style.BorderWidth = "1px"

Damit setzen Sie sogenannte CSS-Formatierungen ein, die mehr Möglichkeiten als die HTML-Eigenschaften der Elemente bieten. In diesem Fall weisen Sie die Rahmenfarbe, die Art (dotted entspricht gestrichelt) und die Breite zu. Statt dotted können Sie auch einen durchgezogenen Rand (solid) oder andere Varianten verwenden. Das Ergebnis sehen Sie in Bild 7.

pic007.png

Bild 7: Per Code erzeugte Tabelle mit Linien

Vom Rahmen zur Trennlinie

Nun soll nicht jede Zelle ein eigenes Kästchen erhalten, sondern es soll jeweils eine Linie zwischen den Zellen dargestellt werden. Hierfür sieht CSS ein eigenes Attribut namens border-collapse vor. Diese Eigenschaft ist jedoch nicht per IntelliSense als Element von style verfügbar. Sie können es jedoch von Hand eingeben. Zu beachten ist, dass Sie dieses Attribut ohne Bindestrich eingeben und dieses nur für die übergeordnete Tabelle festlegen können:

objTable.Style.borderCollapse = "collapse"

Das Ergebnis finden Sie in Bild 8, diesmal mit durchgehendem Rand in grauer Farbe.

pic008.png

Bild 8: Durchgehende, zusammengeführte Ränder

Abstand der Schrift

Aus optischen Gründen möchten Sie vielleicht ein wenig mehr Platz zwischen Text und Rahmen lassen. Dies erledigen Sie mit dem padding-Attribut (es werden tatsächlich einige Attribute groß, andere kleingeschrieben). Damit stellen Sie den Abstand des Textes zum rechten, linken, oberen und unteren Rahmen ein:

objCell.Style.padding = "10px"

Wenn Sie dies je nach Seite individuell gestalten möchten, verwenden Sie entsprechend paddingTop, paddingLeft, paddingBottom und paddingRight.

Hintergrundfarbe einstellen

In unserer kleinen Beispieltabelle sollen die Felder wie auf einem Schachbrett abwechselnd einen weißen und einen alternativen Hintergrund aufweisen. Den Hintergrund stellen Sie mit der Eigenschaft backgroundColor ein, der Farbcode #eeeeee entspricht einem hellen Grau. Mit der If…Then-Bedingung färben Sie nur jedes zweite Feld ein:

If (i + j) Mod 2 = 0 Then
    objCell.Style.backgroundColor = "#eeeeee"
End If

Das Ergebnis sieht schließlich wie in Bild 9 aus.

pic009.png

Bild 9: Schachbrettmuster

Schriftart einstellen

Für die Schriftart bietet CSS unter MSHTML folgende Eigenschaften an:

  • fontFamily: Schriftart, zum Beispiel Calibri
  • fontSize: Größe, in den zulässigen Einheiten angegeben, also beispielsweise 10pt
  • fontWeight: Zahlen in Hunderterschritten von 100 bis 900 oder Werte wie normal, bold, bolder, lighter. Bei den meisten Schriftarten funktionieren jedoch nur bold und normal.
  • fontStyle: normal oder italic (für kursive Schrift)

Im Beispiel aus Bild 10 haben wir mit kursiven und fetten Schrifteinstellungen gespielt:

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