vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Datenbanken   |   VB-Versionen: VB5, VB610.08.01
Datenbank-Inhalt als HTML-Report anzeigen

Im Zeitalter des Internets wächst der Wunsch vieler Anwender, bestimmte Daten im WWW auf der eigenen Homepage zu veröffentlichen. Dieser Workshop zeigt, wie sich die Daten als HTML-Report darstellen lassen. Hierzu werden ein- oder mehrere HTML-Dateien erzeugt, welche durch Navigations-Links entsprechend miteinander verknüpft sind.

Autor:  Dieter OtterBewertung:  Views:  15.474 

Im Zeitalter des Internets wächst der Wunsch vieler Anwender, bestimmte Daten im WWW auf der eigenen Homepage zu veröffentlichen. Dieser Workshop zeigt, wie sich die Daten als HTML-Report darstellen lassen. Hierzu werden ein- oder mehrere HTML-Dateien erzeugt, welche durch Navigations-Links entsprechend miteinander verknüpft sind.

Ein einführendes Beispiel

Nehmen wir an, Sie verwalten in Ihrer Anwendung Fachbücher zu einem bestimmten Themengebiet. Hierzu haben Sie eine Datenbank erstellt, in der alle Informationen, wie Titel, Erscheinungsjahr, Kurzbeschreibung usw. eingetragen werden können. Nun möchte Sie eine Liste aller Datenbank-Einträge auf Ihrer Homepage veröffentlichen - im HTML-Format. Da Sie die Datenbank regelmässig aktualisieren, sollen die HTML-Informationen natürlich ebenfalls immer aktuell sein.

Also liegt es doch nahe, eine entsprechende Funktion in die Anwendung einzubauen, welche das Erstellen der HTML-Datei vollautomatisch vornimmt. Und da die Datenbank mit der Zeit immer umfangreicher wird, möchten Sie, daß die Informationen nicht auf einer einzigen HTML-Seite, sondern aufgeteilt in mehrere Seiten angezeigt werden, welche dann durch entsprechende Navigationsbefehle miteinander verknüpft sein sollen.

Genau hier setzt unser Workshop an. Wir zeigen Ihnen, wie sich eine solche HTML-Report-Funktion realisieren lässt. Die benötigten Prozeduren und Funktionen sollen so universell als möglich gehalten werden, so dass sich diese auch für andere Anwendungsbeispiele einsetzen lassen.

Vorbereitung

Welche Funktionen soll der HTML-Report bieten. Zunächst muss festgelegt werden, in welchem Format die Daten der Funktion zur Verfügung gestellt werden sollen. Hierzu eignet sich am besten das Recordset-Objekt, da Sie dann sowohl eine gesamte Tabelle mit allen Feldinhalten berücksichtigen können, als auch eine gezielte SQL-Abfrage unter Berücksichtigung ausgewählter Tabellenfelder.

Weitere Anforderungen an den HTML-Report
Optional soll der Titel des Reports angegeben werden können. Wird kein Titel angegeben und handelt es sich bei dem Recordset um eine Tabelle, so soll der interne Datenbank-Tabellenname verwendet werden. Genauso soll mit der Report-Überschrift verfahren werden. Bereits eingangs erwähnt wurde die Anforderung, daß bei umfangreichen Listen automatisch mehrere HTML-Dateien erzeugt werden sollen. Also muss die Prozedur wissen, wieviele Einträge maximal pro Seite (HTML-Datei) ausgegeben werden sollen.

Belassen wir es einmal bei diesen eben gestellten Anforderungen. Sicherlich liessen sich hier noch weitere festlegen, wie z.B. Farbwahl, Schriftwahl u.a.

Aufbau einer HTML-Datei

Um die Informationen in einer HTML-Datei anzuzeigen, ist es notwendig, den elemtaren Aufbau einer HTML zu kennen. Eine HTML-Datei besteht im wesentlichen aus nur zwei Teilen:
  • Header: Enthält Informationen über den Inhalt der HTML-Datei, wie verwendeter Zeichensatz und Titel der Datei
  • Body: Enthält alle sichtbaren Informationen (Texte und Bilder)
Nachfolgend ein Beispiel, wie eine typische HTML-Datei aussieht:

<HTML>
<HEAD>
<TITLE>Titel der Datei</TITLE>
</HEAD>

<BODY TEXT=#000000 BGCOLOR=#FFFFFF>
...
...
...
</BODY>
</HTML>

Umsetzung

Die Umsetzung des HTML-Reports besteht aus mehreren Prozeduren: Einer Aufruf-Prozedur, welche alle erforderlichen und optionalen Paramater entgegennimmt und ein paar weitere Hilfsroutinen, die von der Haupt-Prozedur aufgerufen werden.

Zunächst die Haupt-Prozedur

' Auslesen einer Datenbank-Tabelle
' und Erstellen eines HTML-Berichts.
'
' Die Tabellen-Feldnamen dienen gleichzeitg
' der Benennung der Spalten in der HTML-Tabelle
'
' Optional:
' Titel      Titel der HTML-Seite (erscheint in der
'            Titelleiste des Browsers)
'            Vorgabe: Tabellen-Name der Datenbank
'
' tabTitel   Tabellen-Überschrift
'            Vorgabe: Tabellen-Name der Datenbank
'
' ItemsPerPage  Anzahl Datensätze (Zeilen) pro Seite
'               (Wird ItemsPerPage nicht angegeben,
'               wird nur eine einzige Datei erzeugt)
'
'======================================================
 
Public Sub dbTableToHTML(Tabelle As Recordset, _
  ByVal Filename As String, _
  Optional ByVal Titel As String = "", _
  Optional ByVal tabTitel As String = "", _
  Optional ByVal ItemsPerPage As Integer = 0)
 
  Dim F As Integer
  Dim I As Integer
  Dim nRows As Long
  Dim Row As Long
  Dim tCount As Long
  Dim nPages As Integer
  Dim Page As Integer
  Dim Ext As String
 
  ' Standardvorgaben
  If Titel = "" Then Titel = Tabelle.Name
  If tabTitel = "" Then tabTitel = Tabelle.Name
 
  ' HTML-Extension
  Ext = Mid$(Filename, InStrRev(Filename, "."))
  Filename = Left$(Filename, Len(Filename) - Len(Ext))
 
  ' Anzahl benötigter Seiten (Dateien)
  Page = 1: nRows = Tabelle.RecordCount
  If (ItemsPerPage > 0) Then
    nPages = Int(nRows / ItemsPerPage)
    If nRows Mod ItemsPerPage <> 0 Then
      nPages = nPages + 1
    End If
  End If
 
  ' HTML-Datei öffnen, Header und Überschrift schreiben
  F = HTMLOpenFile(Filename, Ext, Titel, tabTitel, _
    Page, nPages)
 
  ' Feldnamen dienen als Spaltenbezeichner für die Tabelle
  HTMLBegTableDef F, Tabelle
 
  ' Datensätze durchlaufen
  With Tabelle
    Do While Not .EOF
      ' aktuelle Anzahl Datensätze pro Datei mitzählen
      Row = Row + 1
      If Row > ItemsPerPage And ItemsPerPage > 0 Then
        ' Jetzt neue HTML-Seite
        HTMLEndTableDef F, Filename, Ext, tCount, _
          Page, Page + 1
        HTMLCloseFile F
        Page = Page + 1
        Row = 1
        F = HTMLOpenFile(Filename, Ext, Titel, tabTitel, _
          Page, nPages)
        HTMLBegTableDef F, Tabelle
      End If
 
      ' Tabellen-Spalten füllen
      tCount = tCount + 1
      Print #F, "<TR>";
      For I = 0 To .Fields.Count - 1
        Print #F, "  <TD>";
        Print #F, txt2html(.Fields(I).Value);
        Print #F, "</TD>"
      Next I
      Print #F, "</TR>";
 
      .MoveNext
    Loop
  End With
 
  ' Tabellendefintion abschliessen
  HTMLEndTableDef F, Filename, Ext, tCount, _
    Page, nPages
  HTMLCloseFile F
End Sub

Wie arbeitet die Prozedur jetzt genau?
Zunächst wird geprüft, ob ein Seiten- und Tabellen-Titel angegeben wurde. Ist dies nicht der Fall, wird der interne Datenbank-Tabellenname verwendet. Danach wird der übergebene HTML-Dateiname in seinen reinen Dateinamen und seiner Extension gesplittet. Dies ist erforderlich für den Fall, daß mehrere HTML-Dateien erstellt werden sollen, um die einzelnen Dateien fortlaufend numerieren zu können, z.B. BUCH.HTML, BUCH2.HTML, BUCH3.HTML usw.

Wurde für den Parameter ItemsPerPage ein Wert größer 0 angegeben, so wird die Anzahl der benötigten HTML-Seiten berechnet. Die Berechnung ergibt sich aus der durch das Recordset angegebenen Datenquelle (Anzahl Datensätze) geteilt durch die Anzahl der maximalen Einträge pro Seite. Wird ItemsPerPage nicht angegeben, so erfolgt die Ausgabe des Reports auf einer einzigen Seite (in einer einzigen Datei).

Nun wird die HTML-Datei inkl. HTML-Header erstellt (HTMLOpenFile). Die Ausgabe der Reports erfolgt natürlich in Tabellenform, wobei jede Tabellenzeile einen einzelnen Datensatz repräsentiert. Innerhalb der Tabellenzeile werden automatisch die im Recordset-Objekt vorhandenen Datenbankfelder als Tabellenspalten ausgegeben. Die Tabellenüberschrift wird ebenfalls automatisch ermittelt - und zwar anhand der in der Datenbanktabelle verwendeten Feldnamen. Diese Aufgabe übernimmt die Prozedur HTMLBegTableDef.

Jetzt kann mit der Ausgabe der Datensätze begonnen werden. Hierzu wird das Recordset von Anfang bis Ende durchlaufen und der jeweilige Datensatz als Tabellenzeile ausgegeben. Bei jedem Durchlauf werden zwei interne Zählervariable (Row und tCount) jeweils um den Wert 1 erhöht. Row zählt immer die aktuell auf der Seite (in der Datei) ausgegebenen Datensätze. Erreicht Row den durch den Parameter ItemsPerPage angegeben Wert, so muss eine neue Seite begonnen werden. Hierzu wird die Tabelle abgeschlossen und unterhalb der Tabelle eine Navigationsleiste zum "Vor-" und "Zurückblättern" erstellt (HTMLEndTableDef). Die geöffnete HTML-Datei wird geschlossen (HTMLCloseFile), der Seitenzähler Page um den Wert 1 erhöht und die nächste HTML-Datei erstellt (HTMLOpenFile).

Sind alle Datensätze durchlaufen, wird die Do While...Loop-Schleife beendet, die Tabelle abgeschlossen und die HTML-Datei geschlossen.

Die benötigten Hilfsroutinen
Wie Sie der Beschreibung zur Vorgehensweise entnehmen konnten, werden innerhalb der Haupt-Prozedur einige Hilfsroutinen aufgerufen.

Diese sollen nachfolgendend kurz vorgestellt werden:

' API-Aufruf zum Anzeigen des HTML-Reports
' im Standard-Browser
Private Declare Function ShellExecute Lib "shell32.dll" _
  Alias "ShellExecuteA" ( _
  ByVal hWnd As Long, _
  ByVal lpOperation As String, _
  ByVal lpFile As String, _
  ByVal lpParameters As String, _
  ByVal lpDirectory As String, _
  ByVal nShowCmd As Long) As Long
' Öffnet eine HTML-Datei und schreibt die
' HTML-Header-Informationen
Private Function HTMLOpenFile(ByVal Filename As String, _
  ByVal Ext As String, ByVal Titel As String, _
  ByVal tabTitel As String, ByVal Page As Integer, _
  ByVal nPages As Integer) As Integer
 
  Dim F As Integer
 
  F = FreeFile
  Open Filename & IIf(Page > 1, "-" + Format$(Page), _
    "") & Ext For Output As #F
 
  ' Header-Informationen
  Print #F, "<HTML>"
  Print #F, "<HEAD>"
  Print #F, "<TITLE>" & Titel & "</TITLE>"
  Print #F, "</HEAD>"
 
  Print #F, "<BODY TEXT=#000000 BGCOLOR=#FFFFFF>"
  Print #F, "<FONT NAME=""ARIAL"">"
  Print #F, "<H1>" & tabTitel & "</H1>"
 
  ' Ggf. Seite x von y ausgeben
  If nPages > 1 Then
    Print #F, "<P><B>Seite " & Format$(Page, "0") & _
      " von " & Format$(nPages, "0") & "</B></P>"
  End If
 
  HTMLOpenFile = F
End Function
' Tabellen-Definition in HTML-Datei schreiben
' Feldnamen der Tabelle dienen gleichzeitig der
' Bezeichnung der HTML-Tabellenspalten
Private Sub HTMLBegTableDef(F As Integer, _
  Tabelle As Recordset)
 
  Dim I As Integer
 
  Print #F, "<TABLE WIDTH=100% CELLPADDING=0 " & _
    "CELLSPACING=2 BORDER=0>"
  With Tabelle
    Print #F, "<TR BGCOLOR=#D7D7D7>"
    For I = 0 To .Fields.Count - 1
      Print #F, "  <TH>";
      Print #F, .Fields(I).Name;
      Print #F, "</TH>"
    Next I
    Print #F, "</TR>"
  End With
End Sub
' Tabellen abschließen
' GGf. autom. Links zum Blättern einfügen
Private Sub HTMLEndTableDef(F As Integer, _
  Filename As String, Ext As String, _
  ByVal tCount As Long, ByVal Page As Integer, _
  Optional ByVal PageNext As Integer = 0)
 
  Print #F, "</TABLE>"
  Print #F, "<P><B>Anzahl Datensätze: " & _
    Format$(tCount) & "</B></P>"
 
  ' Navigationsleiste unterhalb der Tabelle
  If Page > 1 Or PageNext <> 0 Then
    Print #F, "<HR SIZE=1>"
    Print #F, "<P>";
 
    ' Link zum Zurückblättern
    If Page > 1 Then
      Print #F, "<A HREF=""" & Filename & _
        IIf(Page - 1 <> 1, "-" & Format$(Page - 1), "") & _
        Ext & """>Zurück</A>";
      Print #F, "  |  ";
    End If
 
    ' Link zum Vorblättern
    If PageNext <> 0 Then
      Print #F, "<A HREF=""" & Filename & "-" & _
      Format$(PageNext) & Ext & """>Weiter</A>";
    End If
    Print #F, "</P>"
  End If
End Sub
' HTML-Datei abschließen
Private Sub HTMLCloseFile(F As Integer)
  Print #F, "</BODY>"
  Print #F, "</HTML>"
  Close #F
End Sub
' HTML-Report im Standard-Browser anzeigen
Public Sub HTMLShowReport(ByVal hWnd As Long, _
  ByVal Filename As String)
 
  ShellExecute hWnd, "open", Filename, vbNullString, _
    vbNullString, vbNormalFocus
End Sub
' Text in HTML-Text umwandeln
Private Function txt2html(sText As String) As String
 
  ' Text-Datei zeilenweise einlesen
  ' und Sonderzeichen, wie Umlaute und spitze
  ' Klammern durch HTML-Steuercodes ersetzen
 
  sText = Replace(sText, "ä", "ä")
  sText = Replace(sText, "Ä", "A")
  sText = Replace(sText, "ö", "ö")
  sText = Replace(sText, "Ö", "Ö")
  sText = Replace(sText, "ü", "ü")
  sText = Replace(sText, "Ü", "Ü")
  sText = Replace(sText, "ß", "ß")
  sText = Replace(sText, ">", "&gt;")
  sText = Replace(sText, "<", "&lt;")
  sText = Replace(sText, Chr$(34), "&quot;")
 
  txt2html = sText
End Function

Aufruf der HTML-Report Funktion

Um nun die HTML-Report Funktion in Ihrer eigenen Anwendung nutzen zu können, fügen Sie den gesamten oben abgedruckten Quellcode am besten in ein Modul ein und nennen dieses basHTMLReport.bas. In Ihrer Anwendung selbst wird die HTML-Report Funktion dann folgendermassen aufgerufen:

' Beispielsaufruf für das Erstellen eines
' mehrseitigen HTML-Reports
Private Sub MakeHTMLReport()
  Dim Db As Database
  Dim rs As Recordset
  Dim SQL As String
  Dim HTMLFile As String
 
  ' Datenbank öffnen
  Set Db = Workspaces(0).OpenDatabase("LITERATUR.MDB")
 
  ' SQL-Abfragestring
  SQL = "SELECT Titel, Jahr, ISBN, Preis, Beschreibung " & _
    " FROM Buecher WHERE Kat = "VB" ORDER BY Titel"
  Set rs = Db.OpenRecordset(SQL)
 
  ' HTML-Dateiname festlegen
  HTMLFile = App.Path & "\BUCHINFOS.HTML"
 
  ' Report erstellen (max. 15 Einträge pro Seite)
  dbTableToHTML rs, HTMLFile, "Fachbücher", _
    "Fachbücher zu Visual-Basic", 15
 
  rs.Close
  Db.Close
 
  ' Report im Standard-Browser anzeigen
  HTMLShowReport Me.hWnd, HTMLFile
End Sub

Wie Sie am Beispiel sehen können, wird nun mit nur einer einzigen Anweisung (dbTableToHTML) ein kompletter mehrseitiger HTML-Report über eine zuvor festgelegte Datenbankabfrage erstellt. Über eine weitere einzelne Anweisung (HTMLShowReport) wird der HTML-Report dann in den Standard-Browser geladen und angezeigt.



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Workshops finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.