LazReport Tutorial/de

From Free Pascal wiki

Deutsch (de) English (en) español (es) português (pt)

Einleitung

Das LazReport Package beinhaltet Komponenten für die Erstellung und Ausgabe von Reports. Während es anfangs ein eigenständiges Projekt war und separat installiert werden musste, ist es seit geraumer Zeit ein fester Bestandteil von Lazarus geworden. Das Package mag auf den ersten Blick sehr primitiv wirken, aber es bietet zahlreiche Möglichkeiten, die es sich näher zu betrachten lohnt.

Dieses Tutorial soll die Verwendung des LazReport Packages anhand einiger Beispiele demonstrieren. Es richtet sich in erster Linie an Einsteiger. Für die Beispiele verwende ich die Einstellungen aus dem Tutorial zu SQLdb (SQLdb Komponenten und Firebird Datenbank). Grundsätzlich lässt sich aber jede von Lazarus unterstützte Datenbank verwenden.

Bedanken möchte ich mich bei Jesús Reyes Aguilar, ohne dessen hilfreiche Tipps ich dieses Tutorial wahrscheinlich nicht hätte schreiben können.

Beispiel 1

Öffnen sie zunächst das im SQLdb Tutorial erstellte Projekt. Alternativ erstellen sie ein neues Projekt mit einem Datenbankzugriff (Lesezugriff reicht aus). Von der Seite 'LazReport' in der Komponentenpalette legen sie eine TfrReport und eine TfrDBDataSet Komponente auf ihrem Formular ab. Die erste Komponente ist die eigentliche Reporting-Komponente. Die zweite Komponente wird für die Verbindung zur Datenbank benötigt. Grundsätzlich kann man die Verbindung auch ohne diese Komponente herstellen. Das Entwerfen des Reports wird damit aber erleichtert. Setzen sie die 'DataSet' Eigenschaft von frDBDataSet1 auf SQLQuery1 und die 'DataSet' Eigenschaft von frReport1 auf frDBDataSet1.

Einen Report entwerfen

Bevor man einen Report anzeigen oder ausdrucken kann, muss man zunächst festlegen, welche Daten der Report beeinhalten soll. Da wir für das Einbinden von Datenbankfeldern eine bestehende Verbindung zur Datenbank benötigen, geben sie eine einfache Abfrage in die 'SQL' Eigenschaft von SQLQuery1 ein, z.B. 'select * from CUSTOMER'. Setzen sie anschließend die 'Active' Eigenschaft im Objektinspektor auf True. Bei Erfolg werden jetzt im verbundenen DBGrid1 die gewünschten Daten angezeigt.

Zur Entwicklungszeit erreicht man den Designmodus von Laz Report am einfachsten über das Kontextmenü der Reportkomponente. Klicken sie mit der rechten Maustaste auf die frReport1 Komponente. In dem erscheinenden Kontextmenü wählen sie den obersten Eintrag - Report entwerfen. Daraufhin öffnet sich ein Fenster mit dem Designer von LazReport.

Die Startseite des LazReport Designers

Wenn man in einem Report mehrere Spalten nebeneinander darstellen möchte, dann ist eine Umstellung auf das Querformat zu empfehlen, da man so mehr Platz in der Breite zur Verfügung hat. Im Menü des Designers geht man dazu auf Datei -> Seitenoptionen. An dieser Stelle kann man auch das Papierformat ändern (in der Regel ist A4 voreingestellt). Nach einem Klick auf OK wird unser Arbeitsblatt jetzt im Querformat angezeigt.

LazReport basiert auf FreeReport (Version 2.32). Damit übernimmt LazReport auch Art und Weise der Reporterstellung mittels Bändern. Ein Band kann verschiedene Funktionen erfüllen. Die zur Verfügung stehenden Funktionen erhält man, wenn man ein neues Band einfügen will. Klicken sie dazu in der Symbolleiste am linken Rand auf das zweite Symbol von oben ('Band einfügen'). Wenn sie jetzt die Maus auf unser Arbeitsblatt bewegen erscheint ein Rechteck, welches von gestrichelten Linien begrenzt ist. Dieses stellt das einzufügende Band dar. Mit der Maus lässt sich die Position des Bandes ändern. Wenn die gewünschte Position erreicht ist, kann das Band mit einem Mausklick fixiert werden. Dabei ist nur die vertikale Ausrichtung von Bedeutung. Da sich ein Band immer über die gesamte Seitenbreite erstreckt, ist die horizontale Ausrichtung belanglos. Für unser Beispiel platzieren wir das Band am oberen Seitenrand. Jetzt erscheint ein Auswahldialog, in dem der Bandtyp gewählt werden kann.

Die zur Verfügung stehenden Bandtypen

Wir entscheiden uns für 'Report title'. Dieses Band wird einmal am Beginn des Reports gedruckt. Da es nur einmal pro Report zur Verfügung steht, kann es beim Hinzufügen eines weiteren Bandes nicht mehr als Bandtyp gewählt werden. Ohne Inhalte macht ein Band natürlich wenig Sinn. Also fügen wir ein Textfeld hinzu. Dazu wählen wir in der Symbolleiste am linken Rand das oberste Symbol ('Rechteckobjekt einfügen') und platzieren das Feld irgendwo in der Mitte des Bandes. Daraufhin öffnet sich ein Texteditor.

Der Texteditor im Designer

Im Editor tragen wir jetzt 'Kundenübersicht' ein und bestätigen mit OK. Wie man jetzt sieht, ist der Text etwas zu lang für das Feld. Kein Problem, denn die Größe des Feldes lässt sich einfach ändern. Bewegen sie die Maus an den rechten Rand des Feldes bis sich der Cursor verändert und ziehen sie dann den Rand nach rechts, bis der komplette Inhalt angezeigt wird. Ein Feld kann ruhig etwas größer sein als unbedingt erforderlich. Solange man für das Feld keine andere Hintergrundfarbe wählt, wird es im fertigen Report nicht weiter auffallen. Ist das Feld dagegen zu klein, wird der Inhalt abgeschnitten.

Den meisten Menschen fällt es schwer, mit dem Augenmaß ein Element genau nach Wunsch zu platzieren. LazReport enthält daher in der Symbolleiste am rechten Rand einige Befehle, um das gewählte Element genau auszurichten. Mit dem dritten Symbol von oben ('Waagerecht im Fenster zentrieren') erreicht man etwa eine waagerechte Zentrierung des Elements. Mit den Symbolleisten am oberen Rand lässt sich der Text noch formatieren (Schriftart, Schriftgöße, Schriftfarbe etc.) Wenn nach der Wahl einer größeren Schriftart (was für einen Reporttitel nicht ganz unüblich ist) ein Teil des Textes abgeschnitten wird, dann muss man das Textfeld entsprechend vergrößern. Eventuell muss man dann auch das Band etwas vergrößern.

In einem Textfeld kann man aber mehr als nur einfachen Text eingeben. Legen sie dazu ein weiteres Textfeld auf dem Band ab (z.B. am rechten Rand). Geben sie jetzt den Text 'Stand: ' ein. Klicken sie dann auf die Schaltfläche 'Variable'. Es erscheint ein Auswahldialog mit den zur Verfügung stehenden Variablen. Wählen sie hier 'Date'. Mit einem Doppelklick wird die Variable an der aktuellen Position im Texteditor eingefügt. Bei ihnen sollte jetzt 'Stand: [Date]' stehen. Klicken sie auf 'OK'. Im Designer wird jetzt die Variable angezeigt. Wird der Report ausgeführt, dann wird die Variable durch das aktuelle Datum ersetzt. Für die Gestaltung kann sich jetzt noch ein kleines Problem ergeben, wenn der Inhalt einer Variablen länger ist als der Name der Variablen. Wenn das Textfeld zu klein ist, wird ein Teil des Inhalts abgeschnitten. Um dies zu kontrollieren (und das Textfeld ggf. anzupassen) verwenden wir die Vorschau (Datei -> Vorschau).

Das Vorschau-Fenster mit dem bisher eingegebenden Inhalt

Da wir bislang nur ein Band mit dem Reporttitel eingegeben haben, ist in der Vorschau jetzt noch nicht allzu viel zu sehen. Die Vorschau lässt sich wie ein normales Fenster mit einem Mausklick rechts oben schließen.

Hauptzweck eines Reports ist natürlich die Anzeige von Informationen aus einer Datenbank. Wenn man möchte, kann man jetzt weitere Bänder in den Report einfügen und darin die entsprechenden Felder platzieren. LazReport bietet jedoch auch eine komfortablere Möglichkeit. Gehen sie im Menü des Designers auf Werkzeuge -> Werkzeuge -> Datenbankfelder einfügen.

Die zur Verfügung stehenden Datenbankfelder

Jetzt wird auch klar, warum wir vorhin zur Entwicklungszeit eine Verbindung mit der Datenbank hergestellt haben. Die von SQLQuery1 zurückgegebenen Felder stehen uns jetzt zum Auswählen zur Verfügung. Mit dem Aktivieren von 'Header einschließen' werden zusätzlich auch Felder mit den Feldbezeichnungen eingefügt (im fertigen Report sozusagen die Spaltenüberschriften). Mit 'Bänder einfügen' werden automatisch die benötigten Bänder erstellt, so dass man diese nicht manuell erzeugen muss. Für unser Beispiel aktivieren wir beide Einstellungen und wählen einige der Datenbankfelder aus (ggf. mit gedrückter STRG Taste). Mit einem Klick auf 'OK' werden die gewählten Felder in den Report eingefügt. Falls sich die Bänder jetzt etwas überlagern sollten, dann können sie diese einfach mit der Maus verschieben. Wie wir sehen wurden zwei neue Bänder eingefügt. 'Page header' wird einmal auf jeder Seite angezeigt und enthält die Feldbezeichnungen. Wenn man in der Datenbank mit Abkürzungen arbeitet (diese werden von LazReport als Vorgabe verwendet), dann kann man die Feldbezeichnungen noch verändern. Das Band 'Master data' enthält die Verlinkungen zu den Datenbankfeldern und wird einmal je Datensatz gedruckt. Mittels Vorschau kann man schon mal das Ergebnis betrachten. Jetzt kann man auch noch Anpassungen an der Optik vornehmen.

Prinzipiell könnte man den Report jetzt schon verwenden. Um das Thema noch ein wenig abzurunden, werden wir ein weiteres Band in den Report einfügen, um auch die Seitenzahlen anzeigen zu können. Platzieren sie ein neues Band im Report und wählen bei Bandtyp 'Page footer'. Das Band muss nicht am unteren Ende der Seite platziert werden. Die Anordnung im Report (am Ende einer jeden Seite) übernimmt der Reportgenerator. Auf dem Band wird jetzt ein neues Rechteckobjekt abgelegt. Im sich öffnenden Texteditor geben sie 'Seite ' ein. Dann klicken sie auf die Schaltfläche 'Variable' und wählen 'Page#'. Dann geht es weiter mit ' von ' gefolgt von einer weiteren Variablen 'TotalPages'. Zum Schluss fügen sie noch ' Seiten' hinzu und schließen den Texteditor. Wahrscheinlich muss das Textfeld noch etwas verbreitert werden, um den ganzen Inhalt anzeigen zu können. Ein Blick auf die Vorschau bringt ein etwas überraschendes Ergebnis. Am Ende der ersten Seite findet man 'Seite 1 von 0 Seiten'. Kann LazReport etwa nicht richtig rechnen? Keine Sorge, LazReport kann sehr wohl richtig rechnen. Damit die Gesamtzahl der Seiten richtig ermittelt werden kann, muss der Report ein zweites Mal durchlaufen werden (da die Seitenzahl von der Anzahl der Datensätze abhängt, die dem Report erst nach dem Einlesen des letzten Datensatzes bekannt ist). Dies lässt sich einstellen über Datei -> Reportoptionen... und Aktivieren der Option 'Report in zwei Durchläufen'. Die Vorschau sollte jetzt in etwa dieses Bild liefern:

Das Vorschau-Fenster mit unserem Report

Den Report verwenden

Nachdem wir den Report gestaltet haben wollen wir ihn nun auch aus unserem Programm heraus nutzen. Dazu empfiehlt es sich, den Report zu speichern. Gehen sie im Designer auf Datei -> Speichern unter und wählen sie einen Dateinamen und ein Verzeichnis. Wenn der Report im Projektverzeichnis gespeichert wird, dann können beim Aufrufen die Pfadangaben weggelassen werden. Als Dateinamen wählen wir einfach 'report1.lrf'. Anschließend kann der Designer beendet werden.

In unserem Projekt benötigen wir nun ein Ereignis, um den Report aufzurufen. Der Einfachheit halber wählen wir einen Button (Seite Standard in der Komponentenpalette) und dessen OnClick Ereignis. Als erstes muss der Report geladen werden. Dies erledigt die Zeile

 frReport1.LoadFromFile('report1.lrf');

Mit

 frReport1.ShowReport;

wird der Report am Bildschirm angezeigt. Kompilieren sie jetzt das Projekt und starten sie es. Je nach dem, welche Einschränkungen über das Eingabfeld vorgegeben werden (select xxx from CUSTOMER), fällt der Report unterschiedlich groß aus.

Im Vorschaufenster des Reports gibt es am oberen Rand eine Symbolleiste, die mehrere Funktionen zur Verfügung stellt. Man kann den Report darüber ausdrucken oder auch speichern. Diese Speicherfunktion dient im Grunde zum Exportieren des Reports. Damit man die volle Funktionalität nutzen kann, muss man auf dem Formular, wo sich die Reportkomponente befindet, weitere Komponenten aus der Seite 'LazReport' ablegen. Derzeit stehen TfrTextExport, TfrHTMExport, TfrCSVExport und TfrTNPDFExport zur Verfügung. Diese Komponenten erlauben das Abspeichern in einem bestimmten Format. Es reicht aus, wenn die Komponenten auf dem Formular abgelegt werden. Es ist kein zusätzlicher Code erforderlich.

Siehe auch

LazReport Documentation: die im Entstehen begriffene Dokumentation für LazReport

Tutorial de LazReport: eine ausführlichere Beschreibung des Packages (auf portugiesisch)

LazReport Tutorial: übersetzung des Tutorial de LazReport und aktualisierung auf Lazarus statt Delphi (auf englisch).