Rubrik: Datenbanken | VB-Versionen: VB5, VB6 | 10.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 Otter | Bewertung: | 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)
<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, ">", ">") sText = Replace(sText, "<", "<") sText = Replace(sText, Chr$(34), """) 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.