Inhaltsverzeichnis

25.1.13 Projekt 3 – Datenbank-Report

Das Zeichnen von Text sollte vorwiegend für Bezeichnungen von ausgewählten Details einer Zeichnung eingesetzt werden. Eine Ausnahme könnten Texte mit einer klaren Struktur in Form von Zeilen und Spalten bilden – so wie sie zum Beispiel für Tabellen typisch sind. Im Projekt 3 wird Ihnen deshalb ein einfacher Datenbank-Report vorgestellt, der mit Methoden der Klasse Cairo gezeichnet wurde.

Um das Projekt problemlos erproben können, wird Ihnen als Datenbasis eine SQLite3-Datenbank mit der Datenbank-Tabelle 'kontakte' im Projekt-Ordner mitgegeben.

B1

Abbildung 25.1.13.1: Daten-Browser für die DB-Daten

Um eigene Projekte zu realisieren, finden Sie im Projekt 3 'Datenbank-Report' auch eine Kurzanleitung, wie Sie eine SQLite3-Datenbasis erzeugen. In dieser finden Sie dafür auch die notwendigen SQL-Anweisungen.

25.1.13.1 Ergebnisse

Der DB-Report als PDF-Datei hat für die erste Seite – gegenüber allen folgenden Seiten – ein unterschiedliches Layout, jedoch für die Daten-Zeilen und die Fußzeile ein gleiches Design. Nur auf der ersten Seite existiert eine Kopfzeile, in der u.a. die Namen der Datenbank und der Datenbank-Tabelle sowie das Druck-Datum angegeben werden:

B2

Abbildung 25.1.13.1.1: DB-Report – 1. Seite

So sehen alle folgenden Seiten aus:

B3

Abbildung 25.1.13.1.2: DB-Report – Seite 2 bis k

Im vorliegenden DB-Report wird nur eine Teilmenge aller Daten angezeigt. Die getroffene Auswahl ist für eine Adress-Liste hinreichend. Wenn Sie jedoch alle Daten anzeigen wollen, dann müssen Sie die SQL-Anweisungen für die DB-Abfrage ändern und sicher auch das PDF-Layout vom Hoch- auf das Querformat umstellen.

In den Fußzeilen wird unter einer abschließenden Linie die Seitenzahl angezeigt:

B4

Abbildung 25.1.13.1.3: Fußzeile

Die in allen oberen Bildern zu sehenden punktierten Linien dienten in der Erprobung nur als Kontroll-Linien und können im fertigen Report entfallen.

Das Zeichnen des DB-Reports mit Methoden der Klasse Cairo basiert auf folgenden Überlegungen:

25.1.13.1 Quelltext-Ausschnitt

In der Prozedur ExportPDF() wird der DB-Report unter Verwendung weiterer Prozeduren und Funktionen gezeichnet:

Private Sub ExportPDF()
  Dim PDFSurface As CairoPdfSurface
  Dim sPfadPDFDatei, sMessage As String
  Dim iDataSet As Integer
 
' Initialisierung
  iCWidth = PDF_WIDTH - MARGIN_LEFT - MARGIN_RIGHT ' Content-Width (Millimeter)
  iCHeight = PDF_HEIGHT - MARGIN_TOP - MARGIN_BOTTOM ' Content-Height (Millimeter)
  iCurrentPage = 1 ' Seitenzahl der aktuellen Seite
  iCurrentTableRow = 1 ' Anzahl der Tabellenzeilen auf der aktuellen Seite
  fCurrentY = 0 ' y-Koordinate auf der aktuellen Seite
  sPfadPDFDatei = User.Home &/ "kontakte.pdf" 
  PDFSurface = New CairoPdfSurface(sPfadPDFDatei, PDF_WIDTH, PDF_HEIGHT) ' DIN A4 - Hochformat
 
  Cairo.Begin(PDFSurface)
  ' Shift of the coordinate origin - >> Left = MARGIN_LEFT, Top = MARGIN_TOP
    Cairo.Matrix = Cairo.Matrix.Translate(MMToPoints(MARGIN_LEFT), MMToPoints(MARGIN_TOP))
    Cairo.Matrix = Cairo.Matrix.Scale(1, 1) ' Zoom-Faktor = 1        
    Cairo.Font.Name = FONT_NAME    
 
    GetDBData() ' Bereitstellung der anzuzeigenden DB-Daten (DB-Result)
 
    If resDBData.Count = 0 Then
       sMessage = "<font color='red'><center>Die DB-Auswahl-Menge ist leer.</font>"
       sMessage &= "<hr>"
       sMessage &= "Ein DB-Report kann nicht erzeugt werden!</center>"
       Message.Warning(sMessage)
       Return
    Endif ' resDBData.Count = 0 ?
 
    DrawHeader() 
    DrawDatabaseInformation() 
    DrawTableHeader()
    resDBData.MoveTo(0) ' Datensatz-Zeiger auf den ersten Datensatz setzen
    DrawTableRow() ' Datensatz anzeigen
    DrawFooter()
    DrawBorder() ' Nur zu Kontrollzwecken in der Erprobung
    For iDataSet = 1 To resDBData.Max ' Alle Datensätze (Text) der Auswahlmenge zeichnen
      If iCurrentPage = 1 Then
         If iCurrentTableRow = iPage1RowMax Then
            iCurrentPage = 2
            iCurrentTableRow = 0
            fCurrentY = 0
            Cairo.ShowPage()
              DrawBorder() ' Nur zu Kontrollzwecken in der Erprobung
            DrawTableHeader()
            DrawFooter()
         Endif
         resDBData.MoveTo(iDataSet) 
         DrawTableRow()  
         Inc iCurrentTableRow 
      Else
         If iCurrentTableRow = iPage2RowMax Then             
            Inc iCurrentPage
            iCurrentTableRow = 0
            fCurrentY = 0
            Cairo.ShowPage()
              DrawBorder() ' Nur zu Kontrollzwecken in der Erprobung
            DrawTableHeader()
            DrawFooter()
         Endif
         resDBData.MoveTo(iDataSet) 
         DrawTableRow()  
         Inc iCurrentTableRow
      Endif
    Next ' iDataSet
  Cairo.End
 
  Desktop.Open(sPfadPDFDatei) ' Show DB-Report     
 
End ' ExportPDF()

Den vollständigen, umfangreichen Quelltext für das Projekt 3 finden Sie im Download-Bereich in einem Projekt-Archiv.

Download