Designer

 Top Next

Die Komponente beinhaltet einen integrierten Designer, welcher in Design-time mit einem Doppelklick der linken Maustaste über die Komponente TfrxReport aufgerufen wird. Der Designer erlaubt dem Nutzer die bequeme Bearbeitung des äußeren Erscheinungsbildes des Reports und eine sofortige Vorschau. Das Interface des Designers ist den aktuellen Standards angepasst, unter Nutzung der Symbolleisten. Deren Anordnung kann den Bedürfnissen des Nutzers angepasst werden. Die Informationen der Anordnungen werden gespeichert und bei jedem Neustart wiederhergestellt. Auch alle anderen Veränderungen des Designers werden gespeichert.

Der Designer ist über Delphi in Design-time erreichbar. Zur Nutzung des Designers im kompillierten Projekt ist es notwendig, die Komponente TfrxDesigner aus der Palette der Komponenten von FastReport zu nutzen, oder das Modul frxDesign in die Liste zu übernehmen. Die Benutzung des Designers in run-time gibt dem Nutzer die Möglichkeit das äußere Erscheinungsbild des Reportes zu bearbeiten, sowie den fertigen Report zu editieren.

Die Zahlen bedeuten:

1 – Arbeitsfläche des Designers;

2 – Menüleiste;

3 – Symbolleiste;

4 - Objektleiste;

5 – Tabs des Codeeditors und Data;

6 – Fenster „Reporttree“

7 – Fenster „Objektinspektor“

8 – Fenster „Datenbaum“. Aus diesem Fenster können Elemente auf das Blatt gezogen werden.

9 – Lineal. Beim Rüberziehen des Lineals auf das Blatt, entsteht eine Linie an der Objekte befestigt werden können.

10 - Statusleiste.


Tastatursteuerung

 Top Previous Next
Tasten | Beschreibung
Ctrl+O | Befehl "Datei|Öffnen..."
Ctrl+S | Befehl " Datei|Speichern"
Ctrl+P | Befehl " Datei|Vorschau"
Ctrl+Z | Befehl "Bearbeiten|Rückgängig"
Ctrl+C | Befehl "Bearbeiten|Kopieren"
Ctrl+V | Befehl "Bearbeiten|Einfügen"
Ctrl+X | Befehl "Bearbeiten|Ausschneiden"
Ctrl+A | Befehl "Bearbeiten|Alles auswählen"
Arrow, Tab | Bewegung zwischen den Objekten
Del | Löschen der markierten Objekte
Enter | Ruft den Editor des markierten Objekts auf
Shift+Pfeile | Größenänderung des markierten Objekts
Ctrl+Pfeile | Verschiebung des markierten Objekts
Alt+Pfeile | Markiertes Objekt haftet sich an das nächste Objekt in ausgesuchter Richtung


Maussteuerung

Tasten | Beschreibung
Linke Maustaste | Objektauswahl; Einfügen eines neuen Objektes; Verschieben und Größenänderung des Objektes (Objekte). Der Maßstab der hervorgehobenen Objekte wird durch das Ziehen des roten Quadrates in der rechten, unteren Ecke der Gruppe verändert.
Rechte Maustaste | Das Kontextmenü des Objekts (Objekte), über welchem sich der Mauszeiger befindet.
Doppelklick linke Maustaste | Aufruf des Objekteditors. Der Doppelklick auf eine leere Stelle der Seite ruft das Dialogfenster „Seiteneinstellungen“ auf.
Mausrad | Scrollen der Seite.
Shift + Linke Maustaste | Ist das Objekt bereits ausgewählt, so wird die Auswahl aufgehoben. Die Auswahl der anderen Objekte ist dadurch nicht betroffen.
Ctrl + linke Maustaste | Beim Drücken und Verschieben der Maus wird ein Rahmen gezogen; beim Loslassen werden alle Objekte hervorgehoben die in dem Rahmen liegen.
Alt + linke Maustaste | Ist das Objekt „Text“ hervorgehoben, so wird der Inhalt bearbeitet.


Symbolleisten


Designersymbolleiste

Die Designerleiste ist mit der Objektleiste verbunden und besitzt folgende Buttons

Icon | Bezeichnung | Beschreibung
 | Auswahlwerkzeug | Standardansicht, in dem man mit dem Mauszeiger Objekte anwählen, deren Größen verändern kann usw.
 | Hand | Das Berichtsblatt kann bei gedrückter Maustaste verschoben werden.
 | Zoom | Das einmalige Drücken der linken Maustaste vergrößert den Maßstab um 100%, die rechte Maustaste verkleinert um 100%. Durch Drücken + Halten der linken Maustaste wird beim Ziehen der ausgewählte Bereich vergrößert.
 | Texteditor | Das Klicken auf das Objekt „Text“, erlaubt den Inhalt direkt auf der Seite zu bearbeiten. Beim Drücken + Halten der linken Maustaste wird beim Ziehen in dem ausgewählten Bereich das Objekt „Text“ gebildet und dessen Editor gestartet.
 | Format kopieren | Die Taste wird aktiv, wenn das Objekt „Text“ ausgewählt ist. Das Klicken mit der linken Maustaste auf das Objekt „Text“, kopiert das Format des vorhergehenden Objektes „Text“ rein.


Symbolleiste "Standard"

Icon | Bezeichnung | Beschreibung
 | Neuer Report | Erstellt einen neuen Report.
 | Report öffnen | Öffnet einen gespeicherten Report . Tastaturbefehl - Ctrl+O.
 | Report speichern | Speichert einen Report. Tastaturbefehl - Ctrl+S.
 | Vorschau | Erstellt den Bericht und zeigt die Vorschau. Tastaturbefehl - Ctrl+P.
 | Neue Seite | Fügt eine neue Seite in den Bericht ein.
 | Neue Dialogseite | Fügt eine neue Dialogseite in den Report ein.
 | Seite löschen | Entfernt die bestehende Seite.
 | Seiteneinstellungen | Ruft das Fenster Seiteneinstellungen auf.
 | Variablen | Ruft den Editor der Variablen auf.
 | Ausschneiden | Ausschneiden der markierten Objekte in den Zwischenspeicher. Tastaturbefehl - Ctrl+X.
 | Kopieren | Kopiert die markierten Objekte in den Zwischenspeicher. Tastaturbefehl - Ctrl+C.
 | Einfügen | Fügt Objekte aus dem Zwischenspeicher ein. Tastaturbefehl - Ctrl+V.
 | Rückgängig | Macht den letzten Befehl rückgängig. Tastaturbefehl - Ctrl+Z.
 | Wiederherstellen | Macht die Aktion des Befehls „Rückgängig“ rückgängig. Tastaturbefehl - Ctrl+Y.
 | Gitter anzeigen | Zeigt die Gitterlinien auf der Seite an. Die Abstände können bei den Optionen des Designers verändert werden.
 | Am Gitter ausrichten | Beim Verschieben und Ändern der Größen der Objekte, werden die Koordinaten/Maßstäbe sprungweise an die Abstände des Gitters angepasst.
 | An Gitter anpassen | Verändert die Maßstäbe/Standorte der markierten Objekte so, dass sie sich an das Gitter anpassen.
 | Zoom | Bestimmt den Maßstab der Seite.
3.15 | Gruppieren | Gruppiert die markierten Objekte.
3.16 | Gruppierung aufheben | Die Gruppierung der markierten Objekte aufheben.


Symbolleiste "Text"

Icon | Bezeichnung | Beschreibung
Kein Stil | Stil | Erlaubt die Auswahl des Stils. Um diese zu bestimmen rufen Sie den Menüpunkt „Report|Stile...“ auf.
Arial | Schrift | Erlaubt die Wahl der Schrift. Merkt sich die 5 zuletzt aufgerufenen.
10 | Schriftgröße | Verändert die Größe der Schrift. Kann auch eingegeben werden.
 | Fett | Formatiert markierten Text/Zahlen „fett“ (hebt die Formatierung auf, wenn diese bereits „fett“ formatiert ist).
 | Kursiv | Formatiert markierten Text/Zahlen kursiv (hebt die Formatierung auf, wenn diese bereits „kursiv“ formatiert ist).
 | Unterstrichen | Unterstreicht markierten Text/Zahlen (hebt die Formatierung auf, wenn diese bereits „unterstrichen“ formatiert ist).
 | Schrift-einstellungen | Schrifteinstellungen können hier verändert werden.
 | Schriftfarbe | Auswahl der Farben der Schrift.
 | Hervorheben | Zeigt einen Dialog mit den Attributen der Hervorhebung des ausgewählten Objektes „Text“ auf.
 | Textdrehung | Erlaubt die Textdrehung.
 | Ausrichtung links | Richtet den Text links aus.
 | Ausrichtung zentriert | Zentriert den Text.
 | Ausrichtung rechts | Richtet den Text rechts aus.
 | Blocksatz | Richtet den Text gleichmäßig am linken und rechten Rand aus.
 | Ausrichtung oben | Richtet den Text am oberen Rand aus.
 | Ausrichtung mitte | Richtet den Text gleichmäßig am oberen und unteren Rand aus.
 | Ausrichtung unten | Richtet den Text am unteren Rand aus.


Symbolleiste "Rahmen"

Icon | Bezeichnung | Beschreibung
 | Linie oben | Fügt hinzu/entfernt die Linie oben.
 | Linie unten | Fügt hinzu/entfernt die Linie unten.
 | Linie links | Fügt hinzu/entfernt die Linie links.
 | Linie rechts | Fügt hinzu/entfernt die Linie rechts.
 | Alle Rahmenlinien | Fügt alle Rahmenlinien hinzu.
 | Kein Rahmen | Entfernt alle Rahmenlinien.
 | Schatten | Aktiviert/entfernt Schatten.
 | Hintergrundfarbe | Erlaubt die Auswahl der Hintergrundfarbe.
 | Rahmenfarbe | Erlaubt die Auswahl der Rahmenfarbe.
 | Rahmenstil | Erlaubt die Wahl des Rahmenstils.
1 | Rahmenbreite | Erlaubt die Wahl der Rahmenbreite.


Symbolleiste "Ausrichtungspalette"

Icon | Beschreibung
 | Ausrichtung links.
 | Ausrichtung zentriert.
 | Ausrichtung rechts.
 | Ausrichtung oben.
 | Ausrichtung mitte.
 | Ausrichtung unten.
 | Abstand horizontal.
 | Abstand vertikal.
 | Horizontal im Band zentrieren.
 | Vertikal im Band zentrieren.
 | Gleiche Breite.
 | Gleiche Höhe.


Designer-Optionen

Um die Designeroptionen verändern zu können, nutzen Sie "Ansicht|Optionen..."..

Hier können die gewünschten Maße eingestellt (Zentimeter, Zoll, Pixel) und die Abstände des Gitters angepasst werden. Die Maße können ebenfalls im Designer selbst eingestellt werden. Ein Doppelklick in die linke Ecke der Statusleiste, in dem die aktuellen Maße angezeigt werden,verändert diese.

Es kann auch eingestellt werden, ob das Gitter angezeigt werden soll und ob die Objekte an diesem ausgerichtet werden sollen. Dies kann auch über die Symbolleiste „Standard“ im Designer geschehen.

Sie können die Schriftart für den Code-Editor und für den Text-Editor einstellen. Ist die Option „Schrift des Objekts verwenden“ aktiviert, so wird die Schriftart im Fenster des Editors, der Schrift im Objekt entsprechen.

Wenn Ihnen die weiße Arbeitsfläche des Designers und der anderen Fenster nicht gefällt, so kann diese über die Buttons „Arbeitsbereich“ und „Werkzeugfenster“ geändert werden. Die Option „LCD Gitterfarbe“ erhöht leicht den Kontrast der Gitterlinien. Dies verbessert ihr erkennen auf Flüssigkristallmonitoren.

Option „Editor nach dem Einfügen anzeigen" steuert den Prozess beim Einfügen neuer Objekte. Ist die Option aktiviert, so wird jedesmal beim Einfügen eines Objekts der Editor gestartet. Möchten Sie viele neue Objekte einfügen, so ist es besser diese Option abzuschalten.

Durch das Deaktivieren der Option „Bandbezeichnungen anzeigen“ werden diese ausgeblendet. Dadurch wird auf der Seite Platz gespart. Die Bandbezeichnung wird in diesem Fall im Band geschrieben.

Das Deaktivieren der Option „Drop-Down Feldliste anzeigen“ stoppt das Anzeigen der Drop-Down Liste wenn der Mauszeiger auf das Objekt „Text“ gezogen wird, welches mit Daten verbunden ist. Dies wird notwendig, wenn im Bericht viele kleine Objekte enthalten sind.

Die Option „Freie Bandpositionierung" löst die Verbindung der Bänder zum Blatt. Diese Option ist abgeschaltet und die Bänder ordnen sich gem. ihrer Bestimmung. Der Abstand zwischen den Bändern wird im Feld „Abstand zwischen Bändern" festgelegt.


Reporteinstellungen

Das Fenster mit den Berichtsoptionen ist über das Menü “Report|Optionen...“ zu erreichen. Der Dialog enthält 3 Seiten.

Erste Seite - Allgemein:

Screenshot - 18.05.2009 , 14_56_06

Sie können den Bericht an einem angeschlossenen Drucker koppeln d.h. der Bericht wird, sollte nichts anderes eingestellt werden, über den ausgewählten Drucker laufen. Dies ist hilfreich, wenn es mehrere Drucker zur Auswahl gibt. Textdokumente können z.B. an einen Schwarz-Weiss-Drucker gekoppelt werden und Dokumente mit Grafiken an einen Farbdrucker. Im Verzeichnis der Drucker ist der Drucker „Vorgabe" enthalten. Wird dieser ausgewählt, so erfolgt das Drucken auf dem aktuell genutzten Drucker.

Ebenfalls kann die Anzahl der Kopien eingestellt werden und ob eine Sortierung erfolgen soll.

Die Einstellungen dazu werden im Fenster „Drucken“ angezeigt.

Wenn "Zweipass" aktiviert ist, wird der Bericht im 2 Schritten erstellt. Beim ersten Schritt wird der Report erstellt und auf Seiten verteilt, dies jedoch ohne das Speichern des Ergebnisses. Beim zweiten Schritt erfolgt die übliche Erstellung des Berichtes durchgeführt mit dem anschließenden Speichern.

Wozu die 2 Schritte? Oft wird diese Option in dem Fall verwendet, dass in dem Report die gesamte Seitenanzahl erwähnt wird, z.B. „Seiten 1 bis 15“. Dann wird im ersten Schritt die tatsächliche Anzahl festgestellt und ist über die Systemvariable TOTALPAGES zu erreichen. Der häufigste Fehler ist der Versuch der Anwendung dieser Variablen bei einem Einweg-Report, hier wird diese dann auf 0 gesetzt.

Eine andere Anwendungsmöglichkeit ist das Ausführen von Berechnungen im ersten Durchgang und das Anzeigen der Resultate im zweiten. Zum Beispiel wenn man in der Kopfzeile einer Gruppe eine Summe anzeigen lassen möchte, die normalerweise erst am Ende der Gruppe berechnet und angezeigt wird. Diese Arten der Berechnung sind mit der Nutzung der eingebauten Sprache FR verbunden.

Das Häkchen bei „Drucken wenn leer“ erlaubt es, einen Report zu erstellen der keine Datenzeilen enthält. Wird diese Option deaktiviert, so werden leere Reporte nicht erstellt.

Das Feld „Passwort“ erlaubt die Eingabe des Passwortes, welches beim Öffnen des Reports abgefragt wird.

Die Steuerungselemente der zweiten Seite erlauben den Zugriff auf die Optionen der Vererbung.

Screenshot - 18.05.2009 , 14_57_31

Ausführlicher über die Vererbung werden wir uns in im Kapitel „Vererbung der Reporte“ beschäftigen. Hier sieht man von welchem Report der Aktuelle ererbt ist, der Basis-Report kann abgetrennt werden (dadurch wird der Report selbstständig, nicht vererbt) und auch kann ein Ausgewählter beerbt werden.

Die Elemente der dritten Seite des Dialoges erlauben die Reportbeschreibung.

Screenshot - 18.05.2009 , 14_57_16

Hier können z.B. der Name der Reports (wird im Vorschaufenster angezeigt), Autor, Beschreibung, Grafik, Version, usw. eingegeben werden. All dies ist jedoch nicht notwendig und dient nur informativen Zwecken.


Seiteneinstellungen

Seiteneinstellungen sind über das Menü "Datei|Seiteneinstellungen..." oder über den Doppelklick auf eine freie Fläche des Blattes zu erreichen.

Screenshot - 18.05.2009 , 15_09_58

Auf der ersten Seite des Dialoges können die Ränder, Größe und Ausrichtung der Seite ausgewählt werden. In „Papierzufuhr“ kann man den Drucker für die erste und alle anderen Seiten aussuchen.

Auf der zweiten Seite kann die Spaltenanzahl, bei mehrspaltigen Reporten, angegeben werden. Die aktuellen Einstellungen werden im Designer angezeigt.

Screenshot - 18.05.2009 , 15_10_11

Die Option „Auf vorige Seite drucken“ startet den Druck der Seite auf freiem Platz der vorherigen. Dies wird angewendet, wenn die Reportschablone aus mehreren Seiten besteht oder beim Druck von Batch-Reporten.

Die Option „Ränder spiegeln“ vertauscht den rechten und linken Rand der Seite, um diese besser anzeigen und drucken zu können.

Die "Endlose Seitenbreite“ und „Endlose Seitenhöhe" Optionen passen die Seitengröße der Anzahl der Datensätze auf der Seite an. In diesem Fall sehen Sie eine große Seite in dem Vorschau-Fenster, statt mehrerer Seiten.

Die Option „Seitenhöhe im Entwurfsmodus vergrößern“ erhöht die Seitenhöhe. Dies ist hilfreich, wenn es auf der Seite mehrere Bänder gibt. Die tatsächliche Höhe wird jedoch nicht verändert.


Reporterstellung


Reportobjekte

Eine leere Reportseite in FastReport sieht aus, wie eine leeres Blatt Papier. Auf der gesamten Seite können Objekte eingefügt werden, welche verschiedene Informationen anzeigen können (Text/Grafiken usw.). Auch kann das äußere Erscheinungsbild angepasst werden. Hier eine kurze Beschreibung der standardmäßig zur Verfügung stehenden Objekte:

Objekt | Icon | Beschreibung
Band einfügen | 10.1 | Fügt ein Band ein.
Text | 10.2 | Zeigt eine oder mehrere Textzeilen in der markierten Fläche.
Grafik | 10.3 | Zeigt eine Grafik in den Formaten BMP, JPEG, ICO, WMF, EMF.
Systemtext | 10.4 | Zeigt Systeminformationen an (Datum, Uhrzeit, Seitenzahl), sowie die Aggregatwerte.
Unterreport | 10.5 | Erlaubt es einen Unterreport innerhalb des aktuellen einzufügen.
Zeichnen | 10.6 | Objekte der Kategorie „Zeichnen“ stellen verschiedene geometrische Figuren zur Verfügung – Linien, Rechteck, abgerundetes Rechteck, Ellipse, Dreieck, Raute.
Diagramm | 10.7 | Zeigt die Daten in Form verschiedener Diagramme an (Kreis-Diagramm, Histogramm usw.).
RichText | 10.8 | Zeigt den formatierten Text im Format „RichText“ (RTF).
Cross-tab Objekt | 10.9 | Erstellung einer Tabelle.
CheckBox | 10.10 | Erstellt eine Checkbox – Häkchen oder Kreuz.
Barcode | 10.11 | Zeigt die Daten in Form eines Barcodes an (es stehen verschiedene Arten zur Verfügung).
OLE - Objekt | 10.12 | Erlaubt es diverse Objekte anzuzeigen, unter Verwendung von OLE.
Verlauf | 10.13 | Zeigt eine steigende Schattierung an.

Die wichtigsten Objekte mit denen Sie am meisten arbeiten werden, sind „Band“ und “Text“. Im folgendem Verlauf dieses Kapitels werden wir Sie näher kennen lernen.


Report "Hello, World!"

Erstellen wir den einfachsten Report, der eine einzige Überschrift “Hello, World!” enthält. Öffnen Sie den Designer FastReport. Auf der Objektleiste des Designers suchen wir den Button “Text” und klicken diesen an. Danach bewegen wir den Mauszeiger auf die gewünschte Stelle des Blattes und klicken erneut mit der Maustaste. Das Objekt ist erstellt.

Auf den Bildschirm erscheint der Texteditor, falls nicht (dies kann in den Optionen des Designers eingestellt werden), so klicken Sie doppelt auf das Objekt.

Fügen Sie den Text "Hello World!" ein und drücken auf OK.

Der Report ist fertig. Um diesen einzusehen wählen Sie den Punkt "Datei|Vorschau" oder klicken Sie auf den Button in der Standardsymbolleiste. Sie werden eine einzelne Seite des Reports sehen auf der «Hello World!“ steht. Den erhaltenen Report kann man ausdrucken, speichern oder in ein unterstütztes Format exportieren.


Das Objekt "Text"

Das Objekt “Text” besitzt umfangreiche Möglichkeiten. Es kann Text, Rahmen und Schattierungen anzeigen. Der Text kann verschiede Schriftarten haben und in verschiedenen Größen, Farben und Stilen dargestellt weren. Alle Einstellungen werden manuell mit Hilfe der Symbolleisten gemacht:

Hier einige Beispiele der Darstellung des Textes:

Lassen Sie uns nun weitere Möglichkeiten dieses Hauptobjektes kennenlernen. Erstellen wir ein neues Objekt „Text“ und fügen dort 2 Zeilen ein:

Dies ist eine sehr, sehr, sehr lange Textzeile.

Diese zweite Zeile ist kürzer.

Aktivieren Sie den Rahmen des Objekts und ziehen diesen mit der Maus auf eine Größe von 9 cm x 3 cm. Sie sehen das Objekt ist in der Lage auch mehrzeilige Texte darzustellen und nicht nur einzeilige. Jetzt verkleinern Sie das Objekt auf eine Breite von 5 cm. Die lange Zeile passt jetzt nicht mehr in das Objekt, deshalb wird der Text der Breite automatisch angepasst. Hier arbeitet die Objekteigenschaft „WordWrap“ oder auch „Zeilenumbruch“. Sollte diese ausgeschaltet werden (im Inspektor oder im Objektkontextmenü) so werden die Wörter einfach abgeschnitten.

Jetzt testen wir das Ausrichten des Textes innerhalb des Objekts. Die Buttons dazu befinden sich in der Symbolleiste „Text“ und erlauben eine unabhängige Ausrichtung des Textes, sowohl horizontal als auch vertikal. Achten Sie auf den Button „Blocksatz“, dies erlaubt eine Ausrichtung des Textes am rechten und linken Rand des Objekts. Dazu muss die Option „Zeilenumbruch“ aktiviert sein.

Der gesamte Text kann von 0 bis 360 Grad gedreht werden. Der Button [image] auf der Symbolleiste „Text“ erlaubt das schnelle drehen des Textes um 45, 90, 180 und 270 Grad. Falls eine andere Gradzahl benötigt wird, benutzen Sie Objektinspektor. In der Eigenschaft Rotation kann der nötige Wert eingegeben werden. Sollte sich die Gradzahl von den vorgegebenen 45, 90, 180, 270 unterscheiden, kann es sein, dass ein Teil des Textes nicht mehr innerhalb der Grenzen des Objekts liegt (s.h. Bild). Vergrößern Sie die Höhe des Objekts, um diese anzupassen.

Sehen wir uns kurz einige Eigenschaften des Objekts “Text“ an, die sein Äußeres beeinflussen. Die meisten dieser Eigenschaften sind nur über den Inspektor erreichbar:

- BrushStyle – Art der Füllung im Objekt;

- CharSpacing – Pixelabstand zwischen den Symbolen;

- GapX, GapY – Pixelabstand des Textes von der linken und oberen Grenze des Objekts;

- LineSpacing – Zeilenabstand in Pixel;

- ParagraphGap – Abstand der ersten Zeile des Paragraphen in Pixel.


HTML-Tags im Objekt "Text"

Ja dieses Objekt „versteht“ einige einfache HTML-tags. Tags können innerhalb des Textes im Objekt angelegt werden. Diese sind von vornherein abgestellt und müssen erst aktiviert werden, dazu klicken Sie im Kontextmenü des Objekts auf „HTML Tags erlauben“ oder aktivieren die Eigenschaft "AllowHTMLTags" im Objektinspektor. Hier eine Liste der unterstützten Tags:

<b> - fetter Text

<i> - kursiver Text

<u> - unterstrichener Text

<strike> - durchgestrichener Text

<sub> - unterzeiliger Text

<sup> - Text oberhalb der Zeile

<font color> - Schriftfarbe

<nowrap> - der Text wird nicht wie bei „WordWrap“ getrennt, sondern komplett übertragen

Demonstrieren wir die Anwendungen der Tags an Beispielen.

text <b>fetter Text</b> <i>kursiver Text</i> <b><i>fett und kursiv</b></i>

E = mc<sup>2</sup>

A<sub>1</sub> = B<sup>2</sup>

ein gewöhnlicher Text, <font color=red>und dieser ist rot</font>

ein gewöhnlicher Text, <font color="#FF8030">und dieser orange</font>

ein Beispiel des Tags <nowrap>.

Reportgenerator - Fast Report.

Reportgenerator - <nowrap>Fast Report.</nowrap>


Darstellung von Ausdrücken mithilfe des Objektes "Text"

Darstellung von Ausdrucken mithilfe des Objektes "Text"

Eine der wichtigsten Besonderheiten dieses universellen Objektes, ist die Möglichkeit nicht nur statische Text anzuzeigen, sondern auch Ausdrücke. Diese können im Objekt mit dem Text vermischt werden. Schauen wir uns ein einfaches Beispiel an, in dem wir folgende Textzeile in das Objekt “Text” einfügen:

Hello, World! Today is [DATE].

Wenn wir den Report jetzt erstellen, sehen wir folgendes:

Hello, World! Today is 01.01.2004.

Was ist passiert? Während der Reporterstellung hat FastReport im Text einen Ausdruck entdeckt (in den eckigen Klammern) und hat dessen Bedeutung in den Text eingebaut. Selbstverständlich ohne die eckigen Klammern. Das Objekt “Text” kann eine beliebige Anzahl von Ausdrücken enthalten, vermischt mit dem gewöhnlichen Text. Die Klammern können sowohl Ausdrücke als auch einzelne Variablen enthalten z.B. [1+2*(3+4)]. Die Ausdrücke können ebenso Konstanten, Variablen, Funktionen und DB Felder enthalten.. Diese Möglichkeiten werden wir im späteren Verlauf näher betrachten.

Also erkennt FastReport automatisch Ausdrücke, wenn diese in eckigen Klammern stehen. Was jedoch ist, wenn unser Text eckige Klammern enthält, wir aber nicht wollen, das diese als Ausdruck erkannt werden? z. B. wollen wir diesen Text einfügen:

a[1] := 10

FastReport versteht die [1] als Ausdruck und macht folgendes:

a1 := 10

was uns selbstverständlich nicht zufrieden stellt. Eine der Möglichkeiten das zu vermeiden ist, die Ausdruckerkennung zu deaktivieren. Einfach die Eigenschaft AllowExpressions im Inspektor oder „Ausdrücke erlauben“ im Kontextmenü ausschalten. Dadurch werden Ausdrücke im Text ignoriert.

Manchmal braucht man jedoch Ausdrücke und Text in eckigen Klammern z.B.:

a[1] := [myVar]

Das Deaktivieren der Ausdrücke erlaubt das Einfügen der eckigen Klammern, verhindert jedoch die Bearbeitung der Ausdrücke. In diesem Fall erlaubt FastReport andere Symbole um Ausdrücke zu kennzeichnen. Diese Eigenschaft besitzt das Objekt ExpressionDelimiters, welches als Standardeinstellung "[,]" hat. In unseren Fall ersetzen wir nun die Klammer durch:

a[1] := <myVar>

Die Eigenschaft ExpressionDelimiters muss dazu auf "<,>" umgestellt werden. Das Komma trennt in dabei das öffnende Symbol von dem schließenden. Es gibt jedoch eine Beschränkung. Man darf nicht für das Öffnen und das Schließen der Klammern dasselbe Symbol verwenden. z.B. „%,%“ . Man kann mehrere Symbole einfügen z.B. "<%,%>". Dies würde wie folgt aussehen:

a[1] := <%myVar%>


Verwendung der Bänder

Verwendung der Bander

Bänder werden für die logische Ordnung der Objekte verwendet. Indem wir das Band „PageHeader“ verwenden, teilen wir FastReport mit, dass dieses Objekt auf jedem Blatt des Reports erscheinen soll. Analog dazu führt des Verwenden des Bandes „Fuß“ dazu, dass dieser auf jeder Seite des Reports unten erscheint mit allen Objekten die darauf liegen. Machen wir ein einfaches Beispiel, indem wir einen Report erstellen, der die Überschrift „Hello!“ oben, Daten oben rechts und Seitenzahl unten rechts enthält.

Öffnen Sie den Designer und klicken auf „Neuer Report“ in der Symbolleiste. Es erscheint ein Report der schon 3 Bänder enthält: „ReportTitle“, „MasterData“ und „PageFooter“. Entfernen wir erstmal das Band „MasterData“ indem wir es anklicken und die Taste Delete verwenden oder über das Kontextmenü. Jetzt fügen wir ein neues Band „PageHeader“ hinzu. Dazu drücken wir in der Objektsymbolleiste den Button „Band einfügen“ und wählen aus der Liste „Seitenkopf“ aus. Es wird ein neues Band eingefügt. Die vorhandenen Bänder werden nach unten verschoben, denn der FastReport Designer verteilt die Bänder automatisch so, dass sich oben die Bänder mit den Überschriften, danach die Datenbänder und darunter die „Fußbänder“ befinden.

Jetzt verteilen wir Objekte. In das Band „Header“ fügen wir das Objekt „Systemtext“ ein und in dessen Editor wählen wir die Systemvariable "[DATE]" aus (zur Erinnerung, man kann das Datum auch mithilfe von gewöhnlichem Text einfügen, wenn man in dessen Editor den Text "[DATE]" einfügt). In das Band „ReportTitle“ fügen wir das Objekt „Text“ ein, der „Hello!“ enthält. Das Band „PageFooter“ enthält bereits jetzt schon das von uns gewünschte Objekt mit der Seitenzahl.

Wenn wir den Report nun starten, sehen wir, dass die Objekte die gewünschte Anordnung haben.

Also für die richtige Anordnung der Objekte sind Bänder verantwortlich. Abhängig von der Bandart kann sich das Objekt oben oder unten auf der Seite, auf der ersten oder letzten Seite befinden. Die Bänder, welche am meisten verwendet werden, arbeiten auf folgende Weise:

- Band „Seitenkopf“ erscheint oben auf jeder Seite;

- Band „Seitenfuß“ erscheint unten auf jeder Seite;

- Band „ReportTitle“ erscheint auf der ersten Seite oben, vor dem Band „Seitenkopf“ (dies kann mit der Eigenschaft TitleBeforeHeader umgestellt werden);

- Band „Reportzusammenfassung“ erscheint auf der letzten Seite des Reports;


Datenbänder

Datenbander

Jetzt kommen wir zum interessantesten Teil, der Möglichkeit die Daten aus DB Tabellen und Anfragen einzufügen. Was ist eine Tabelle in diesem Fall? Es ist eine von vornherein unbekannte Anzahl von Zeilen und jede enthält eine bestimmte Anzahl von Spalten (Feldern). Für das Drucken dieser Art von Informationen nutzt FastReport besondere Datenbänder. Diese Bänder haben den Namen "Daten xxx Ebene". Um die komplette Tabelle oder nur bestimmte Felder darzustellen müssen Sie:

- Einfügen der Datenbänder in den Report;

- Verknüpfung dieser mit einer Tabelle;

- die Objekte „Text“ einfügen mit den Feldern, die wir verwenden möchten;

Bei der Reporterstellung wird FastReport das Band so oft verwenden, wie es Einträge in unserer Tabelle gibt. Sollte der Platz auf der Seite nicht ausreichen, so werden neue Seiten erzeugt.


Komponente TfrxDBDataSet

Um Tabellen (oder andere Datenquellen) mit einem Band zu verbinden, wird der Connector TfrxDBDataSet [image] aus der Palette der Komponenten von FastReport verwendet. Diese Komponente hat die Rolle des Vermittlers zwischen der Datenquelle und dem Kern von FastReport. Es ist verantwortlich für das Navigieren in den Daten und die Behandlung der Felder. Dadurch musste man den Kern von FastReport nicht an irgendwelchen Bibliotheken binden, um auf Datenbank zugreifen zu können. FastReport ist in der Lage sowohl mit BDE, IB_Objects (welches nicht mit TdataSet genutzt werden kann) zu arbeiten, als auch mit jeder anderen Bibliothek. Daten können aber auch gleich aus der, nicht mit der DB verbundenen, Quelle bezogen werden. z.B. aus der Datei. Die Komponente TfrxDBDataSet ist für die Arbeit mit Datenquellen vorgesehen, welche mit TDataSet (BDE, ADO, IBX und die meisten anderen Bibliotheken) kompatibel sind. Für das Arbeiten mit IB_Objects ist die Komponente TfrxIBODataSet vorgesehen und für die restlichen Quellen (wie z.B. Dateien) die Komponente TfrxUserDataSet [image].

Die Nutzung der Komponente TfrxDBDataSet ist sehr einfach. Um diese mit der Datenquelle zu verbinden, stellen Sie die Eigenschaft DataSet ein (wird unmittelbar an die Tabelle oder Anfrage verknüpft) oder DataSource (wird mit der Komponente TDataSource verbunden). Beide Möglichkeiten sind gleich, die erste erlaubt jedoch die Umgehung der Komponente TDataSource.

Um die Komponente und die damit verbundenen Daten im Report erreichen zu können, muss man angeben, welche Quellen im Report verwendet werden sollen. Deshalb wählen Sie im Designer von FastReport den Punkt "Report|Daten..." aus und kennzeichnen die gewünschten Datensets.

Screenshot - 18.05.2009 , 15_30_20


Report "Kundenliste"

Unser zweiter Report wird wesentlich komplexer als der erste, denn er wird Daten aus der Tabelle DB enthalten und zwar die Kundenliste einer Firma. Hierfür nutzen wir die Demonstrationsdatenbank, welche in Delphi enthalten ist – DBDEMOS. Erstellen wir ein neues Projekt in Delphi. Auf die Seite legen wir TTable und stellen die Eigenschaften ein:

DatabaseName = 'DBDEMOS'

TableName = 'Customer.db'

Um mit die Tabelle aus FastReport arbeiten zu können, fügen wir die Komponente TfrxDBDataSet hinzu und stellen die Eigenschaft ein:

DataSet = Table1

Jetzt legen wir auf die Form die Basiskomponente von FastReport – TfrxReport auf. Gehen wir in den Designer und klicken den Button „Neuer Report“. FastReport erstellt nun automatisch eine leere Schablone mit den Bändern – „ReportTitle“, „MasterData“ und „PageFooter“. Um die Tabelle in FastReport sehen zu können, muss man deren Nutzung erlauben. Wir wählen den Menüpunkt "Report|Daten..." aus und markieren unsere Tabelle (diese hat nun als einzige in der Liste ein Häkchen) Danach schließen wir das Dialogfenster, die Tabelle und deren Felder werden nun im Fenster „Daten“ angezeigt.

Beginnen wir mit dem Erstellen des Reports. In das Band „ReportTitle“ legen wir das Objekt „Text“ mit dem Text „Kundenliste“ ein. Das Band „MasterData“ verknüpfen wir mit unserer Datenquelle. Dies kann man auf drei Arten machen:

- Doppelklick auf das Band;

- den Punkt „Bearbeiten...“ im Kontextmenü auswählen;

- auf die Eigenschaft DataSet im Inspektor klicken.

Nun fügen wir vier Objekte in das Band ein. Dies sind die Kundennummer, Kundenname, Telefon und Fax. Wir machen das auf verschiedene Arten, um die umfangreichen Möglichkeiten des Designers zu demonstrieren. Das erste Objekt „Text“ legen wir auf das Band und geben dort den Text "[frxDBDataSet1."CustNo"]" ein. Das ist die umständlichste Eingabeweise, da man alles per Hand eingeben muss und deshalb schnell Fehler unterlaufen können. Um die Eingabe zu erleichtern, nutzen wir den Ausdruckseditor, dieser befindet sich in der Symbolleiste des Texteditors. Um das Feld einzufügen, klicken wir auf den Ausdruckseditor-Button und führen einen Doppelklick auf das gewünschte Element im sich öffnenden Dialog aus. Wir schließen den Dialog mit der Taste OK und sehen, dass das Feld in den Text eingefügt worden ist.

Die zweite Möglichkeit ein DB-Feld einzufügen ist dem ähnlich, welches in der Umgebung Delphi verwendet wird und zwar durch Nutzung des Objektinspektors. Legen wir auf das Band das zweite Objekt, im Editor schreiben wir nichts. Im Inspektor stellen wir die Eigenschaften ein:

DataSet = frxDBDataSet1

DataField = 'Company'

Da beide Eigenschaften die Liste darstellen, suchen wir uns einfach das gewünschte Feld mit der Maus aus.

Die dritte Eigenschaft: Drag&Drop des gewünschten Feldes aus dem Fenster „Daten“ in den Report. Dies ist die einfachste Vorgehensweise. Halten Sie das Feld „Phone“ fest und ziehen es auf das Band. Das einzige worauf man hier achten sollte, wäre es die Option „Header erstellen“ im unteren Teil des Fensters „Daten“ zu deaktivieren. Sonst wird zusätzlich auch noch ein Feld, in diesem Fall mit der Bezeichnung, eingefügt.

Jetzt zur vierten Möglichkeit. Fügen Sie ein leeres Objekt „Text“ in das Band ein und bewegen die Maus zum Objekt. Auf der rechten Seite erkennen Sie nun einen Button mit einem Pfeil nach unten. Dieser öffnet eine Drop-Down-Liste mit den Feldern der Datenbank. Hier wählen wir das Feld „Fax“ aus. Diese Möglichkeit steht zur Verfügung, wenn das Band mit den Daten verknüpft ist. Dies wird in den Optionen des Designers über das Menü "Ansicht|Optionen...", „Drop-Down Feldliste anzeigen“ gesteuert.

Der Report ist nun fertig:

Schauen wir uns die Vorschau mal an:


Anzeigen der DB-Felder mithilfe des Objektes "Text"

Wie wir gesehen haben, ist das Objekt „Text“ in der Lage statischen Text und Ausdrücke anzuzeigen, aber auch Daten einer Datenbank. Wobei dies auf zwei Arten geschehen kann, ob durch eine Verknüpfung zur DB im Text oder durch Verknüpfung des Objekts zum gewünschtem Feld mithilfe der Eigenschaften DataSet und DataField. Die erste Möglichkeit ist praktisch, weil diese es erlaubt im selben Objekt sowohl den Ausdruck als auch eine Erklärung dazu einzufügen z.B.

Kontaktperson: [frxDBDataSet1."Contact_Person"]

Wie man sieht, wird für Verknüpfungen zur DB eine spezielle Syntax verwendet: Datensetname."Feldname". Im Namen des Datensets können, wie auch im Feldnamen, Leerzeichen enthalten sein. Ein Leerzeichen zwischen einem Punkt und der Klammer ist nicht erlaubt.

In den Text des Objektes kann man nicht nur eine Verknüpfung zum Feld machen. Man kann auch Berechnungen mit diesem Feld erstellen.

Länge in cm: [<frxDBDataSet1."Length_in"> * 2.54]

Beachten Sie die Verwendung der eckigen und spitzen Klammern. Erinnern wir uns, dass die eckigen Klammern für Ausdrücke verwendet werden, falls nichts anderes bestimmt worden ist. Anstatt dieser Klammern kann auch ein beliebiges Paar anderer Symbole verwendet werden (s.h. Anzeige von Ausdrücken mithilfe des Objektes "Text"). Spitze Klammern werden innerhalb der Ausdrücke benutzt, um Variablen bei FastReport und DB-Felder darzustellen. Logischerweise sollten wir schreiben

Kontaktperson: [<frxDBDataSet1."Contact_Person">]

anstatt

Kontaktperson: [frxDBDataSet1."Contact_Person"]

Es stimmen jedoch beide Formen, weil FastReport das Weglassen der spitzen Klammern zulässt, wenn der Ausdruck nur eine Variable oder ein DB-Feld enthält. Sollten im Ausdruck jedoch mehrere Glieder enthalten sein, sind die Klammern Pflicht:

Länge in cm: [<frxDBDataSet1."Length_in"> * 2.54]


Pseudonyme

Im vorhergehenden Report nutzten wir die Datenquelle mit dem Namen frxDBDataSet1 und den Feldern CustNo, Company, Phone, FAX. Demzufolge mussten wir in den Report z.B. "[frxDBDataSet1."CustNo"]" einfügen. Leicht verständlich? Nicht sehr. Einfacher wäre es, die Datenquelle in „Unsere Kunden“ und das Feld in „Nummer“ umzubennen. Dies kann man leicht durch Pseudonyme bewerkstelligen. Sowohl die Datenquelle als auch das Feld besitzen einen zweiten Namen - Pseudonyme die man leicht ändern kann (die Originalnamen bleiben selbstverständlich erhalten). Hat ein Name ein Pseudonym, so wird bei FastReport dieser verwendet. Im schlimmsten Fall wird der Originalname benutzt.

Das Umbenennen selber ist in FastReport sehr einfach. Man macht das in der Umgebung Delphi. Klicken Sie doppelt auf die Komponente frxDBDataSet1, Sie werden der Editor der Pseudonyme sehen. Hier wird der Name der Datenquelle und der der Felder geändert. Auch werden hier die, für den Report benötigten Felder, ausgewählt. Nun nennen wir die Datenquelle und die Felder um:

Beachten Sie, dass das Pseudonym der Quelle auch ohne den Editor geändert werden kann. Hierfür ändert man die Eigenschaft UserName der Komponente frxDBDataSet1.

Jetzt muss auch der Report selbst berichtigt werden, da sich die Namen der Felder geändert haben. Um die Bezeichnung der Felder im Objekt zu ändern, nutzt man am besten die vierte Möglichkeit s.h. Kapitel „Report „Kundenliste“: Bewegen Se die Maus auf das Objekt „Text“ bis der Button der Drop-Down-Liste auf der rechten Seite erscheint. Klicken Sie diesen an und wählen das benötigte Feld aus der Liste. Die Bedeutung der Bezeichnungen der Datenquelle und der Felder müsste jetzt klar sein.

Man muss hinzufügen, das die Pseudonyme am Anfang der Arbeit mit den Reporten gemacht werden sollten, um nachfolgende Korrekturen der Bezeichnungen zu vermeiden.


Variablen

Außer der Verwendung von Pseudonymen gibt es eine weitere Möglichkeit die Bezeichnungen der DB-Felder zu ändern. Indem man die im Report enthaltenen Variablen benutzt, kann man die Bezeichnungen der Felder verändern, aber auch andere Ausdrücke. Um mit Variablen arbeiten zu können, wählen Sie in der Menüleiste „Report|Variablen…“ oder klicken auf den Button „Variablen“ auf der Symbolleiste.

Die Liste der Variablen besitzt in FastReport eine zweiebenen Struktur . Die erste Ebene sind Kategorien, die zweite die Variablen selbst. Die Einteilung in Kategorien wurde für den Fall vorgenommen, dass die Liste der Variablen sehr groß ist. In der Liste muss mindestens eine Kategorie enthalten sein, sprich die Variablen können nicht auf der obersten Ebene sein. Außerdem werden Kategorien nur zur logischen Ordnung der Variablen verwendet und kommen nicht in den Report. Deshalb achten Sie bei der Vergabe der Namen darauf, das diese einzigartig sind. Zwei gleiche Variablen in verschiedenen Kategorien sind nicht möglich.

Demonstrieren wir die Verwendung der Variablen am Beispiel. Gehen wir davon aus, das es zwei Datenquellen gibt. Die Erste: Kunden mit den Feldern "CustNo" č "Name" und zweite Aufträge mit "OrderNo" und "Date". Wir können mit den Feldern folgende Liste der Variablen erstellen.

Kunden

Kundennummer

Kundenname

Aufträge

Auftragsnummer

Auftragsdatum

„Kunden“ und „Aufträge“ sind zwei Kategorien. Öffnen wir nun den Variablen-Editor und erstellen mithilfe der Buttons „Kategorie“, „Variable“ und „Bearbeiten“ die benötigte Struktur. Um den DB-Feldern die Variablen zuzuordnen, wählen Sie eine Variable auf der rechten Seite aus und klicken doppelt darauf. Der Ausdruck erscheint nun unten im Fenster, hier kann der Ausdruck auch manuell bearbeitet werden. Die Kategorien müssen nicht verbunden werden.

Screenshot - 18.05.2009 , 15_41_29

Wenn die Liste der Variablen fertig ist, schließen wir das Fenster. Jetzt müssen die Variablen in den Report. Im Gegensatz zu dem Einfügen der DB-Felder, gibt es hier wesentlich weniger Varianten. Entweder wir fügen die Variablen manuell ein, indem wir den Text [Kundennummer] eingeben, oder wir ziehen die Variable aus dem Fenster „Daten“ auf den gewünschten Platz im Report. Im zweiten Fall muss man auf das Tab „Variablen“ umschalten.


Objekt "Grafik"

Das nächste Objekt welches wir betrachten möchten, ist das Objekt „Grafik“. Es wird ebenfalls oft in Reporten verwendet. Damit können Sie z.B. das Firmenlogo, ein Mitarbeiterfoto usw. in den Report einfügen. Das Objekt ist in der Lage die Formate BMP, JPEG, ICO, WMF, EMF darzustellen.

Lassen Sie uns die Möglichkeiten des Objekts betrachten. Erstellen Sie einen leeren Report und fügen auf eine freie Fläche das Objekt „Grafik“ ein. Im Editor des Objekts (öffnet automatisch, falls nicht führen Sie einen Doppelklick auf das Objekt aus) kann man nun eine Grafik einfügen oder entfernen. Laden Sie eine beliebige Grafik hoch und drücken auf OK.

Im Kontextmenü des Objekts sehen wir folgende Optionen (in Klammern die Bezeichnungen des Objektinspektors):

- Größe automatisch (AutoSize)

- Dehnen (Stretched) – standardmäßig aktiviert

- Zentrieren (Center)

- Seitenverhältnis behalten (KeepAspectRatio) - standardmäßig aktiviert

Wenn wir die Option „Größe automatisch“ aktivieren, nimmt das Objekt die Größe der Grafik an. Diese Möglichkeit ist sinnvoll, wenn man Grafiken verschiedener Größen darstellen möchte. Standardmäßig ist diese Option abgeschaltet.

Die Option „Dehnen“ ist standardmäßig aktiviert und dehnt die enthaltene Grafik im Objekt. Wenn Sie die Maße des Objekts mit der Maus verändern, wird sich die Größe der Grafik der des Objekts anpassen. Die Deaktivierung dieser Option führt dazu, dass die Grafik ihre ursprünglichen Maße behält. Der Unterschied zu „Größe automatisch“ ist der, dass die Größe des Objektes sich nicht an die der Grafik anpasst, sprich das Objekt kann kleiner oder größer als die Grafik sein.

Die Option „Zentrieren“ zentriert die Grafik im Objekt.

Die Option „Seitenverhältnis behalten“ ist standardmäßig aktiviert und hat eine sehr nützliche Funktion: sie verhindert, dass sich die Grafik beim Ändern der Größe des Objekts, verzerrt. Diese Option arbeitet nur in Verbindung mit der Option „Dehnen“. Bei jedem ändern der Größe bleibt deshalb der Kreis rund und wird nicht oval. Hinzu kommt, dass die gedehnte Grafik nicht das gesamte Objekt einnimmt, sondern nur den Teil, der benötigt wird, um die Grafik in den richtigen Proportionen darzustellen. Deaktiviert man diese Option wird die Grafik auf die gesamte Objektgröße gedehnt und falls die Maße des Objekts nicht denen der Grafik entsprechen, wird diese verzerrt dargestellt.

Eine weitere nützliche Eigenschaft ist FileLink, welche über den Inspektor zu erreichen ist. Hier kann man den Dateinamen angeben z.B. c:\picture.bmp, die Grafik wird dann bei Starten des Reports hochgeladen. Ebenso kann man dort eine Variable einsetzen z.B. [picture_file]. Beim Starten des Reports erkennt FastReport diese Variable (es muss der Dateiname sein) und lädt die Grafik hoch.


Report mit Grafiken

Das Objekt „Grafik“ kann, wie viele andere Objekte in FastReport auch, Daten aus Datenbanken darstellen. Die Verknüpfung des Objektes zum benötigten DB-Feld erfolgt mithilfe der Eigenschaften DataSet und DataField im Objektinspektor. Im Gegensatz zum Objekt „Text“ ist dies die einzige Möglichkeit Verknüpfungen herzustellen.

Demonstrieren wir das oben erwähnte anhand eines Beispiels. Wir erstellen einen Report, der Fische und deren Bezeichnungen enthalten soll. Auch hier benötigen wir die Demonstrationsdatenbank DBDEMOS, aus dem Delphi-Set.

Erstellen wir ein leeres Projekt in Delphi, legen die Komponente TTable auf die Seite und stellen die Eigenschaften ein:

DatabaseName = 'DBDEMOS'

TableName = 'Biolife.db'

Um mit der Tabelle in FastReport zu arbeiten, fügen wir die Komponente TfrxDBDataSet hinzu und stellen die Eigenschaften ein:

DataSet = Table1

UserName = 'Bio'

Jetzt legen wir auf die Form die Komponente TfrxReport und starten den Designer. Her starten wir einen neuen Report und verknüpfen die Tabelle mit dem Report im Fenster „Report|Daten...“

Starten wir mit der Erstellung der Form des Reports. Auf das Band „Reporttitel“ legen wir das Objekt „Text“ mit dem Text „Fische“ an. Das Band „Masterdata“ verknüpfen wir mit der Datenquelle (Doppelklick auf das Band und wählen „Bio“ aus der Liste). Damit die Grafik reinpasst, vergrößern wir die Höhe des Bandes auf 3 cm. Auf das Band legen wir das Objekt Text und verknüpfen es mit dem Feld "CommonName" mit einer der oben erwähnten Möglichkeiten. Daneben legen wir das Objekt „Grafik“ und verknüpfen dieses mit dem Feld „Grafik“. Hierfür stellen wir im Objektinspektor die Eigenschaften ein:

DataSet = Bio

DataField = 'Graphic'

Zur Erinnerung, beide Eigenschaften sind vom Typ „Liste“, deswegen kann man die Werte mit der Maus aussuchen. Damit die Grafik reinpasst, verändern wir die Maßstäbe auf 4 ő 2.5 cm.

Der Report ist nun fertig (s.h. unten):


Multi-Text Anzeige

Kehren wir nun zu unserem Beispiel mit den Fischen zurück. In der Tabelle Biolife ist ein Feld „Notes“, welches eine detaillierte Beschreibung für jeden Fisch enthält. Fügen wir dieses Feld nun in unseren Report ein.

Auf den ersten Blick ist alles recht einfach. Wir fügen dem Band mit den Daten das Objekt „Text“ hinzu, verknüpfen dieses mit dem Feld und stellen die Maße des Objektes auf - 8 ő 2.5ńě. Wir starten den Report und sehen, dass das Ergebnis nicht dem entspricht, was wir erwartet haben:

FastReport hat jedoch nur die ihm gegebenen Anweisungen befolgt. Das Feld „Notes“ beinhaltet Text, dessen Größe variabel ist. Unser Objekt „Text“, der die Informationen des Feldes anzeigt, besitzt jedoch eine feste Größe. Deswegen passen nicht alle Zeilen in das Objekt und werden nicht vollständig angezeigt. Was könnte man jetzt machen?

Man kann selbstverständlich die Größe des Objektes oder die der Schrift verändern. Dies jedoch würde zur Platzverschwendung auf dem Blatt führen, weil manche Fische eine lange Beschreibung haben und manche nur eine kurze. FastReport besitzt für diesen Fall Möglichkeiten dieses Problem zu lösen.

Die Rede geht über die Eigenschaften des Bandes, die eigene Größe den enthaltenen Objekten anzupassen. Hierfür muss die Eigenschaft „Dehnen“ aktiviert werden. Dies ist jedoch nicht alles. Ein Objekt mit viel Text sollte ebenfalls in der Lage sein sich zu dehnen, das Objekt „Text“ kann das.

Das Objekt kann automatisch seine Höhe und Breite anpassen, um den gesamten enthaltenen Text aufnehmen zu können. Hierfür sind die Eigenschaften „Breite automatisch“ (AutoWidth) und „Dehnen“ (StretchMode) da. Die Eigenschaft „Breite automatisch“ wählt die Breite des Objektes so aus, dass alle Zeilen reinpassen, ohne das einzelne Wörter übertragen werden müssen. Dies ist hilfreich wenn das Objekt nur einen einzelne Texteil enthält. Die Eigenschaft „Dehnen“ passt die Höhe des Objektes an den gesamten Text an. Die Breite wird nicht verändert. Diese Eigenschaft besitzt mehrere Modi, welche im Objektinspektor ausgewählt werden:

smDontStretch – Objekt nicht dehnen, Standardeinstellung

smActualHeight – Objekt dehnen, um den gesamten Text aufnehmen zu können

smMaxHeight – Objekt dehnen, sodass seine unterste Grenze mit der des Bandes übereinstimmt. Dies werden wir später eingehender behandeln.

Jetzt interessiert uns die Eigenschaft „Dehnen“ des Objektes „Text“. Aktivieren Sie es im Kontextmenü oder stellen Sie die Eigenschaft StretchMode = smActualHeight im Inspektor ein. Ebenfalls aktivieren Sie „Dehnen“ beim Band. Wenn der Report nun gestartet wird, arbeitet alles korrekt.

Wie wir sehen, füllt FastReport beim Erstellen des Reports die Objekte mit Daten, dehnt die Objekte mit der Option „Dehnen“ und wählt auch die Höhe so aus, dass alle Objekte reinpassen. Ist die Option „Dehnen“ des Bandes deaktiviert, wird die Höhe des Bandes nicht angepasst und das Band behält die im Designer gewählte Höhe. Wenn wir versuchen diese Option zu deaktivieren, sehen wir das Objekte mit einem langen Text trotzdem gedehnt werden, die Bänder jedoch nicht. Dies führt zu zu Textüberlagerung, da die Bänder hintereinander liegen.


Daten trennen

Betrachten wir eine Besonderheit des Reports mit den Fischen. Manche Seiten haben am Ende viel freien Platz. Wieso? Wenn der Report erstellt wird, füllt der Kern von FastReport die leere Seite mit Bändern. Nach jedem Band verlagert sich die aktuelle Position nach unten. Stellt FastReport nun fest, dass der Platz für das nächste Band nicht ausreicht (dessen Höhe ist größer, als die Höhe des restlichen Platzes auf der Seite), dann wird eine neue Seite gestartet. Die Bänder werden auf dieser fortgeführt und zwar so lange wie es Einträge in den Daten gibt.

Unser Report enthält in diesem Fall ein Objekt mit viel Text, deswegen ist die Anzahl der Bänder hoch. Falls nun das Band groß ist und nicht mehr auf diese Seite passt, wird es auf die nächste Seite übertragen. Es bleibt nun ungenutzter Platz auf der Seite s.h. folgende Grafik:

Um Platz zu sparren, nutzen wir die Möglichkeit den Inhalt der Bänder aufzuteilen. Dazu aktivieren wir die Option „Aufteilung erlauben“ (AllowSplit) im Band „MasterData“. Man sieht das der freie Platz weniger geworden ist.

Wie arbeitet die Aufteilung des Bandes? In FastReport gibt es mehrere Objekte, die diese Möglichkeit unterstützen und zwar „Text“, „Rahmen“ und RichEdit“. Diese können „getrennt“ werden, andere Objekte nicht. Wenn FastReport Objekte aufteilen will, geht es wie folgt vor:

- zeigt die Objekte an die nicht aufteilbar sind und ganz auf den freien Platz passen

- zeigt teilweise zerlegbare Objekte an (Text wird so angezeigt, das alle Zeilen in das Objekt passen);

- erstellt eine neue Seite und zeigt weiter Objekte an;

- wenn ein Objekt nicht zerlegt werden kann, wird es auf die folgende Seite übertragen, wobei die enthaltenen Objekte verlagert werden;

- der Prozess wird solange fortgeführt bis alle Objekte des Bandes angezeigt werden.

Der Algorithmus des Zerlegens wird deutlich, wenn man die folgende Grafik betrachtet:

Man muss anmerken, dass der Algorithmus nicht 100-prozentige Qualität des erhaltenen Reports garantiert. Deshalb sollten Sie diese Option vorsichtig verwenden. Sollten die Objekte auf dem Band auf eine komplizierte Weise angeordnet sein und hätten dazu noch verschiedene Schriftgrößen, könnte folgendes passieren:


Textumfluss bei Objekten

In manchen Fällen ist es bei der Reporterstellung notwendig, den Text um Objekte (oft Grafiken) fließen zu lassen. Hier eine Demonstration anhand dem Beispiel mit den Fischen.

Fügen wir in den Report ein Objekt „Text“ ein (rot umrandet auf der Grafik) und verteilen die Objekte auf folgende Weise:

Beim Objekt Bio. „Notes“ deaktivieren wir die Option „Dehnen, bei unteren Objekt aktivieren wir diese. Damit der Text aus dem Objekt Bio.“Notes“ in das untere Objekt rüberfliest, muss man beim Objekt Bio.“Notes“ die Eigenschaft FlowTo einstellen. Diese Eigenschaft ist Objektinspektor enthalten und ist eine Drop-Down-Liste. Aus dieser Liste wählt man nun den Namen des unteren Objekts. Das Ergebnis sieht wie folgt aus:

Bei der Erstellung des Reports wird, wenn der Text nicht komplett ins obere Objekt passt, der Rest des Textes ins untere übertragen. Da die Objekte um die Grafik angeordnet sind, wird der Text um die Grafik fließen.

Achtung: um korrekt funktionieren zu können, muss das Hauptobjekt vor dem verlinkten eingefügt werden! Wenn Ihr Report nicht richtig funktioniert, markieren Sie das verlinkte Objekt und übertragen es nach vorne mit dem Befehl „Bearbeiten|Nach vorne setzen“.


Datendruck in Form einer Tabelle

Oft ist es notwendig den Report in Form einer Tabelle mit Umrandung darzustellen. Ein Beispiel hierfür ist die Preisliste. Um einen solchen Report in FastReport zu erstellen, muss man lediglich die Umrandung der Objekte auf dem Band „MasterData“ einschalten. Betrachten wir ein paar Beispiele am einen Report mit Text.

Erstellen wir einen Report mit folgendem Aussehen:

Legen Sie die Objekte auf dem Band Seite an Seite und verkleineren die Höhe des Bandes auf ein Minimum.

Die erste und einfachste Tabellenart ist die, mit einem vollständigen Rahmen. Dazu müssen bei jedem Objekt alle Rahmenlinien aktiviert werden.

Die nächste Art der Umrandung, sind nur horizontale oder vertikale Linien. Man aktiviert dazu die benötigten Linien.

Um die äußere Umrandung der Tabelle zu machen, muss man leicht das Erscheinungsbild des Reports ändern:

Wie man sieht, haben wir zwei Objekte Text“ hinzugefügt und haben die äußeren Rahmenlinien aktiviert. Im Endeffekt wird unser Report wie folgt aussehen:

Alle oben erwähnten Beispiele enthielten Bänder mit fixen Größen. Wie soll man jedoch eine Tabelle darstellen, in der die Bänder gedehnt werden können? Hier ein Beispiel dazu. Fügen wir ein neues Feld in unseren Report ein und zwar den langen Text aus Bio.Notes. Wie wir bereits wissen, muss man die Eigenschaft „Dehnen“ bei dem Objekt und dem Band aktivieren. In diesem Fall wird die Höhe des Bandes abhängig sein von der Menge des Textes im Objekt „Text“. Wir erhalten folgenden Report:

Es ist nicht genau das was wir wollten. Besser wäre es, wenn die Rahmenlinien der benachbarten Objekte sich ebenfalls strecken würden. FastReport kann auch dieses Problem lösen. Um solche Reporte erstellen zu können, muss bei den Objekten, die gedehnt werden sollen, die Eigenschaft „Auf Maximalhöhe dehnen“ (oder StretchMode = smMaxHeight im Objektinspektor) aktiviert werden. Dabei berechnet der Kern von FastReport die Maximalhöhe des Bandes und zieht dann die Objekte, mit der aktivierten Eigenschaft, bis zum unteren Rand des Bandes. Da auch der Rahmen des Objektes gezogen wird, sieht der Report danach wie folgt aus:


Etikettendruck

Im Gegensatz zu Tabellenreporten, liegen die Daten im Reporten des Typs „Etiketten“ untereinander. Betrachten wir ein Beispiel solch eines Reports. Dieser enthält die Daten der Fische (s.h. Beispiel oben) in Form von Etiketten. Der Report hat folgende Struktur:

Wenn wir den Report starten, erhalten wir folgendes:

Wie wir sehen, gibt es auf der rechten Seite noch eine Menge ungenutzten Platzes. Um das Blatt komplett zu füllen, kann man bei den Seiteneinstellungen die Spaltenanzahl angeben, die die Daten anzeigen sollen. Hierfür machen Sie einen Doppelklick auf eine leere Stelle im Blatt oder öffnen Sie den Menüpunkt „Datei|Seiteneinstellungen...“

Hier geben Sie die Spaltenanzahl, die Breite und die Position jeder Spalte an. In unserem Fall reichen 2 Spalten aus, die restlichen Einstellungen wird FastReport automatisch einstellen. Die Begrenzungen der Spalten werden durch eine dünne, vertikale Linie angezeigt:

Das Erstellen des Reports wird auf folgende Weise durchgeführt. FastReport wird das Band „Masterdata“ solange ausführen, solange es freien Platz auf der Seite gibt. Dann wird nicht wie sonst eine neue Seite erstellt, sondern eine neue Spalte auf dieser Seite und das Band wird dort oben fortgeführt. Jetzt werden alle Objekte an die Spaltebreite angepasst. Dies geschieht solange, bis die angegeben Anzahl der Spalten erreicht ist, dann wird eine neue Seite erstellt und FastReport beginnt wieder mit der Anzeige der Daten ab der ersten Spalte.

Unser Report mit den zwei Spalten sieht dann so aus:

Es gibt eine weitere Möglichkeit die Spaltenanzahl anzugeben, dies ist die Eigenschaft Columns bei alle Datenbändern. Hier kann man die Spaltenanzahl des einzelnen Bandes eingeben und nicht für die ganze Seite, wie im folgenden Beispiel. Die Daten hier werden nicht „von oben nach unten und dann von links nach rechts“ angezeigt, sondern von „von links nach rechts und dann von oben nach unten“

In unserem Beispiel deaktivieren wir die Spalten der Seite (die Anzahl auf 1) und stellen 2 bei der Eigenschaft Columns des Bandes ein. FastReport zeigt mit einer gestrichelten Linie die Spaltengrenzen an. Durch ändern der Eigenschaft ColumnWidth (Breite der Spalte) erhalten wir die benötigten Maße:

Ein auf diese Weise erstellter Bericht unterscheidet sich von dem vorherigen dadurch, dass die Daten „von links nach rechts und dann erst von oben nach unten“ angezeigt werden.


Child-Bänder

Child-Bander

Betrachten wir den Fall, dass eine Zeile im Report des Types „Etikette“ eine variable Größe besitzt. Um diese Situation in unserem Beispiel zu simulieren, verkleinern wir die Größe des Objektes Bio."Common Name" auf 2,5 cm und aktivieren wir die Option „Dehnen“. Ebenfalls aktivieren wir diese Option bei dem Band „MasterData“. Um das Prinzip des Dehnens besser darstellen zu können, aktivieren wir alle Rahmenlinien. Wir erhalten folgenden Report:

Wir sehen, dass im ersten Fall das Objekt einen langen Text enthält und deshalb auf zwei Zeilen verteilt wurde. Das darunter liegende Objekt, welches an das Feld Bio."Length (cm)" gebunden ist, wurde nach unten verlagert. Das geschah, weil alle Objekte standardmäßig die Eigenschaft „Verschieben“ (ShiftMode = smAlways im Objektdesigner) aktiviert haben. Solche Objekte verschieben sich nach unten, wenn über ihnen ein dehnbares Objekt ist (Objekt „Text“ mit der aktivierten Eigenschaft „Dehnen“). Die Höhe, um welche das Objekt verschoben wird, ist abhängig von der Stärke der Dehnung des oberen Objektes.

In unserem Fall ist dies jedoch nicht annehmbar, da das Objekt Bio."Length (cm)" ebenfalls verschoben werden muss. In FastReport gibt es ein spezielles Band hierfür, das „Child-Band“. Dieses wird an das Hauptband angefügt und immer nach diesem ausgeführt. Machen wir das in unserem Report:

Um das Band „MasterData“ mit dem „Child-Band“ zu verbinden, stellen wir im Objektinspektor die Eigenschaft Child = Child1 ein. Jetzt wird beim Drucken immer ein „Child-Band“ an das Hauptband angefügt:

Wie man jetzt sieht, wird die Überschrift dort angezeigt, wo sie hingehört. Um den Übertrag des „Child-Bandes“ auf die folgende Seite zu verhindern (sprich die Trennung vom Hauptband), stellen Sie die Eigenschaft „Child zusammenhalten“ (KeepChild im Objektinspektor) ein.


Verschieben von Objekten

Wir haben schon gesehen wie die Eigenschaft „Verschieben“ funktioniert. Betrachten wir einen anderen Modus des Verschiebens: „Verschieben wenn Überlappung“ (entspricht ShiftMode = smWhenOverlapped im Objektinspektor). Dieser führt dazu, dass das Objekt nur verschoben wird, wenn das obere Objekt beim Dehnen das darunter liegende überlappt. In der unteren Grafik werden drei Beispiele vorgestellt. Wie man sieht, wird das untere Objekt (mit aktivierter Option „Verschieben wenn Überlappung“) nur im letzten Fall verschoben, wenn das obere Objekt viel Text enthält und dieser das untere Objekt überlagert.

Wenn man jedoch die Option „Verschieben“ aktiviert, wird das untere Objekt auf jeden Fall verschoben:

In manchen Fällen erlaubt es eine komplizierte Logik der Darstellung der Objekte, insbesondere wenn ein Objekt über mehreren anderen liegt. Im nächsten Beispiel enthalten die beiden oberen Objekte einen dehnbaren Text und das untere Objekt hat die Eigenschaft „Verschieben wenn Überlappung“ aktiviert. Unabhängig von der Menge des Textes in den oberen Objekten, wird das untere Objekt immer direkt an das Objekt angehängt, das den meisten Text enthält:

Wird „Verschieben“ in dem unteren Objekt aktiviert, so wird dieses doppelt verschoben, da es sich unter zwei Objekten befindet und eine unnötige Lücke entsteht.


Report mit zwei Datenebenen (master-detail)

Bisher haben wir nur Reporte betrachtet, die nur ein Band „MasterData“ (Daten 1. Ebene) enthielten. Dies erlaubte die Daten einer DB-Tabelle darzustellen. FastReport erlaubt jedoch die Darstellung von bis zu 6. Ebenen der Daten (es geht auch mehr indem man das Objekt "Unterreport", dazu jedoch später mehr). In der Regel sind Reporte auf 1-3 Ebenen beschränkt, selten mehr.

Betrachten wir die Erstellung eines 2. Ebenen Reports. Dieser soll die Daten der Tabellen Kunden und Aufträge enthalten. Die erste Tabelle enthält die Kundenliste, die zweite die Bestellungen der Kunden. Die Tabellen sehen wie folgt aus:

Kunden:

Kund.-Nr. Company

1221 Kauai Dive Shoppe

1231 Unisco

1351 Sight Diver

….

Bestellungen:

Bestellnr. Kund.-Nr. Verkaufsdatum

1003 1351 12.04.1988

1023 1221 01.07.1988

1052 1351 06.01.1989

1055 1351 04.02.1989

1060 1231 28.02.1989

1123 1221 24.08.1993

….

Wie man sieht, enthält die zweite Tabelle die gesamte Liste aller Bestellungen, von allen Unternehmen. Um eine Liste mit Bestellungen zu erhalten, die nur ein Unternehmen gemacht hat, muss man aus der ersten Tabelle die gewünschte Kund.-Nr. auswählen. Der Report sieht nun wie folgt aus:

1221 Kauai Dive Shoppe

1023 01.07.1988

1123 24.08.1993

1231 Unisco

1060 28.02.1989

1351 Sight Diver

1003 12.04.1988

1052 06.01.1989

1055 04.02.1989

Starten wir die Reporterstellung. Erstellen wir ein neues Projekt in Delphi. Auf die Seite legen wir zwei Komponenten TTable, die Komponente TDataSource, zwei Komponenten TfrxDBDataSet und eine TfrxReport. Die Komponenten stellen wir wie folgt ein:

Table1:

DatabaseName = 'DBDEMOS'

TableName = 'Customer.db'

Table2:

DatabaseName = 'DBDEMOS'

TableName = 'Orders.db'

DataSource1:

DataSet = Table1

frxDBDataSet1:

DataSet = Table1

UserName = 'Customers'

frxDBDataSet2:

DataSet = Table2

UserName = 'Orders'

Im Designer des Reports verknüpfen wir die Datenquellen im Fenster „Report|Daten...“ und legen zwei Bänder auf die Seite „MasteData“ („Daten 1. Ebenen“) und „DetailData“ „Daten 2. Ebene“:

Beachten Sie das Band „MasterData“ dieser muss oben liegen! Wenn man ihn unter das Band „Daten 2. Ebene“ setzt, wird FastReport dies beim Start des Reports melden.

Wenn wir den Report nun starten, sehen wir das die Bestellliste für jeden Kunden gleich ist und alle Einträge der Liste Bestellungen enthalten. Dies geschieht, weil wir den Listenfilter in der Tabelle Bestellungen eingestellt haben. Bei der Komponente Table2 stellen wir die Eigenschaft MasterSource = DataSource1 ein, dadurch stellen wir die Verbindung “master-detail” her. Jetzt muss man die Bedingung des Filters festlegen. Hierfür rufen Sie den Editor der Eigenschaft MasterFields der Komponente Table2 auf:

Wir müssen die beiden Felder CustNo der beiden Quellen verknüpfen. Wählen Sie die beiden(?) in der Liste oben aus und klicken Sie auf "Add". Die verknüpften Felder erscheinen im unteren Fenster. Sie können das Fenster jetzt schließen indem Sie auf OK klicken.

Beim Start des Reports macht FastReport folgendes. Nach Auswahl eines Datensatzes aus der Master-Tabelle (Kunde), filtert es die Detail-Tabelle (Orders). Danach werden nur Datensätze angezeigt, die die Bedingung Orders.CustNo = Customer.CustNo erfüllen (sprich für jeden Kunden werden nur seine Bestellungen angezeigt):

Auf diese Weise kann man Reporte mit bis zu 6. Datenebenen anlegen.


Kopf- und Fußzeilen der Datenbänder

Kopf- und Fu?zeilen der Datenbander

Datenbänder können eine Kopf- und Fußzeile besitzen. Die Kopfzeile wird vor dem Datenband ausgeführt, die Fußzeile nach dem letzten Datenband. Hier ein Beispiel der Funktionsweise bei einem einfachen Report:

Betrachten wir die Anordnung der Kopf- und Fußzeilen bei einem „Master-Detail“ Report:

Wie man sieht, wird die Kopfzeile vor jedem Datenband ausgeführt. Für das Band „Daten 1. Ebene“ wird das einmal am Anfang des Reports gemacht. Für das Band „Daten 2. Ebene“ jedesmal beim Erstellen der fogenden Bandgruppe, die mit dem Band „Daten 1. Ebene“ verknüpft ist. Die Fußzeile wird nach dem letzten Band ausgeführt.

Durch Nutzung der Eigenschaft FooterAfterEach (im Kontextmenü „Fuß nach jeder Zeile“) kann man die Fußzeile nach jeder Datenzeile ausführen. Dies ist nützlich bei Reporten des Typs „Master-Detail“. Das folgende Beispiel mit der aktivierten Eigenschaft FooterAfterEach beim Band „Daten 1. Ebene“ wird wie folgt aussehen:


Mehrseitige Reporte

FastReport ist in der Lage Reporte mit mehreren Seiten zu erstellen. Jede Seite kann eigene Maße, Ausrichtung, verschiedene Objekte und Bänder enthalten. Bei der Berichterstellung werden erst alle Bänder der ersten Seite ausgeführt, dann die der zweiten Seite usw.

Wenn wir einen neuen Report im Designer erstellen, enthält er standardmäßig eine Seite. Sie können eine neue Seite durch klicken auf den Button [image] auf der Symbolleiste „Standard“ öffnen oder indem Sie auf "Datei|Neue Seite" gehen. Jetzt zieht man im Designer einen neuen Tab:

Das Auswählen ist einfach, man klickt auf den Tab der benötigten Seite. Man kann auch die Tabs per „Drag & Drop“ verschieben und so die Anordnung der Seiten ändern. Will man eine Seite entfernen geht das über den Button [image] auf der Symbolleiste „Standard“ oder über „Bearbeiten|Seite löschen“. Ebenfalls kann man das Kontextmenü des Tabs, durch den Klick der rechten Maustaste, aufrufen:

Die Seitenanzahl im Report ist unbegrenzt. In der Regel werden zusätzliche Seiten für die Titelseite verwendet oder in komplexeren Reporten, die Daten vieler Quellen enthalten.

Betrachten wir ein einfaches Beispiel und erstellen eine Titelseite. Wir wählen einen Report mit nur einer Datenebene, wie wir sie am Anfang gemacht haben. Wir fügen eine neue Seite hinzu, die jetzt als zweite angezeigt wird. Um sie vor die erste Seite zu setzen, verschieben wir die zweite Seite per „Drag & Drop“ vor die erste. Die Anordnung hat sich nun verändert. Jtzt gehen wir auf die erste Seite und fügen in die Mitte einen neues Objekt „Text“ der „Unser Report“ enthält. Der Report mit der Titelseite ist nun fertig:

Man muss eine Besonderheit der Mehrseitigen Reporte erwähnen. Aktiviert man auf der zweiten Seite die Option „Auf vorige Seite drucken“ (die Eigenschaft PrintToPreviousPage im Objektinspektor), so werden die Objekte der zweiten Seite nicht auf eine neue Seite übertragen, sondern auf die vorhergehende.


Reporte ohne Nutzung von Datenbanken

Manchmal ist es notwendig statische Daten mehrmals auszuführen. Betrachten wir als Beispiel den Druck von Visitenkarten oder Postkarten. Dazu haben die Bänder die Eigenschaft RowCount und die Seite PageCount. Durch diese Eigenschaften kann man die Anzahl der Bänder/Seiten festlegen, die nicht mit Daten verknüpft sind.

Anhand der Grafiken kann man dies gut erkennen. Die Eigenschaft Rowcount des Bandes ist auf 14 gesetzt, dies führt dazu,dass das Band 14 mal ausgeführt wird.


Report mit Gruppen

Im vorherigen Beispiel haben wir einen zwei-ebenen Report erstellt, mit Daten aus zwei Tabellen. FastReport erlaubt die Erstellung eines analogen Reports auf Basis nur eines Datensatzes.

Hierfür ist es notwendig eine Anfrage mit SQL zu starten. Diese gibt uns die Daten beider Tabellen wieder, sortiert nach bestimmten Bedingungen. In unserem Fall die Übereinstimmungen der Felder CustNo in beiden Tabellen. Die SQL Abfrage kann folgenderweise aussehen:

select * from customer, orders

where orders.CustNo = customer.CustNo

order by customer.CustNo

Die Zeile "order by" benötigt man zur Sortierung anhand von CustNo. Die Anfrage zeigt die Daten so an:

CustNo Company … OrderNo SaleDate

1221 Kauai Dive Shoppe 1023 01.07.1988

1221 Kauai Dive Shoppe 1123 24.08.1993

1231 Unisco 1060 28.02.1989

1351 Sight Diver 1003 12.04.1988

1351 Sight Diver 1052 06.01.1989

1351 Sight Diver 1055 04.02.1989

Wie kann man mithilfe dieser Daten einen Mehrebenen Report erstellen? In FastReport gibt es dafür ein spezielles Band „Gruppenkopf“. Beim Band wird eine Bedingung eingegeben (die Bedeutung des DB-Feldes oder ein Ausdruck) bei dessen Änderung das Band ausgeführt wird. Hier ein Beispiel.

Erstellen wir ein neues Projekt in Delphi. Auf die Seite legen wir die Komponenten TQuery, TfrxReport, TfrxDBDataSet und stellen diese auf folgende Weise ein:

Query1:

DatabaseName = 'DBDEMOS'

SQL =

select * from customer, orders

where orders.CustNo = customer.CustNo

order by customer.CustNo

frxDBDataSet1:

DataSet = Query1

UserName = 'Group'

Jetzt gehen wir in den Designer und verknüpfen unsere Datenquelle mit dem Report. Fügen wir nun zwei neue Bänder in den Report ein: „Gruppenkopf“ und „Daten 1. Ebene“. Im Editor des Bandes „Gruppenkopf“ geben wir folgende Bedingung ein: ins Datenfeld Group.CustNo:

Screenshot - 18.05.2009 , 16_06_50

Das Datenband veknüpfen wir mit der Datenquelle Group und ordnen die Objekte auf folgende weise an (beachten Sie das der „Gruppenkopf“ über den Datenband sein muss):

Beim Starten erhalten wir folgenden Report:

Wie man sieht wird das Band „Gruppenkopf“ nur in dem Fall ausgeführt, wenn das Feld, mit dem es verknüpft ist, den Wert ändert. Sonst wird das mit der Gruppe verknüpfte Datenband ausgeführt. Wenn man diesen Report mit dem Report „Master-Detail“, den wir weiter oben erstellt haben, vergleicht, so sieht man, dass die Bestellnummern nicht aufsteigend sortiert sind. Dies kann man ändern, indem man die Anfrage in SQL ändert:

select * from customer, orders

where orders.CustNo = customer.CustNo

order by customer.CustNo, orders.OrderNo

Auf die gleiche Weise kann man Reporte mit verschachtelten Gruppen konstruieren, wobei deren Anzahl nicht beschränkt ist. Auf diese Weise haben Reporte mit Gruppen gewisse Vorteile gegenüber den Reporten “Master-Detail”:

- man benötigt nur eine Tabelle (Anfrage) für den Report;

- die Anzahl der Ebenen bei den Gruppierungen der Daten ist unbegrenzt;

- zusätzliche Möglichkeiten der Sortierung;

- optimalere Nutzung der Ressourcen der Datenbank (die Anfrage zeigt nur die Daten an, die man benötigt, ohne diese zu filtern).

Das einzig Negative ist, dass die Anfragen in SQL sein müssen. Wobei Grundkenntnisse in SQL in der Regel jeder besitzt, der auch mit Datenbanken arbeitet.


Weitere Besonderheiten der Gruppen

Sehen wir uns mal an, wie Gruppen auf die folgende Seite übertragen werden:

Beim blättern eines solchen Reports, ist es nicht immer klar, zu welchem Kunden die Bestellungen oben auf der zweiten Seite gehören. FastReport erlaubt die Anzeige des „Gruppenkopfs“ (dieser enthält die Informationen des Kunden) auch auf dieser Seite. Dazu muss beim Band „Gruppenkopf“ die Eigenschaft „Auf neuer Seite wiederholen“ (ReprintOnNewPage im Objektinspektor) aktiviert sein. Der Report sieht nun so aus:

Es gibt eine weitere Möglichkeit das Trennen der Gruppe zu verhindern. Aktivieren Sie dafür die Eigenschaft des Gruppenkopfs „Zusammenhalten“ (KeepTogether im Objektinspektor). Falls die Gruppe nun nicht ganz auf die Seite passt, so wird sie auf die nächste Seite übertragen. Siehe Beispiel:

Manche Seiten haben zwar dadurch noch freien Platz, so wird jedoch die Gruppe zusammengehalten.

Jetzt zu der Eigenschaft „Neue Seite“ (StartNewPage). Diese erlaubt es dem Gruppenkopf, jede Gruppe auf einer separaten Seite darzustellen.. Dies verbraucht zwar viel Platz, ist aber manchmal notwendig.


Seitennummer zurücksetzen

Die Gruppe hat die Eigenschaft „Seitennummern zurücksetzen“ (ResetPageNumbers im Kontextmenü), diese setzt die Seitenzahl nach dem Drucken zurück. Wozu braucht man das?

Gehen wir davon aus, dass wir einen Report erstellt haben der Gruppen enthält. Der Gruppenkopf enthält den Kundennamen, die Gruppe und die Bestellungen des Kunden. Der gedruckte Report soll nun dem Kunden übergeben werden, jeder erhält seine Seiten. Nun bekommt einer z. B. die Seiten 50, 51, 52 und möchte wissen, wo die restlichen Seiten geblieben sind? Um solche Situationen zu vermeiden, müssen die Seiten jedes Kunden einzeln nummeriert werden, d.h. innerhalb eines Reports wird jede Gruppe durchnummeriert.

Beachten Sie beim Einstellen der Eigenschaft ResetPageNumbers, dass man ebenfalls die Eigenschaft StartNewPage („Neue Seite“) aktivieren muss. Dadurch wird jede Gruppe auf einer separaten Seite gedruckt. Die Seitenzahl kann man mit den Variablen [Page], [TotalPages] des Objektes „Text“ darstellen.


Drill-Down Gruppen

Der Gruppenkopf besitzt die Eigenschaft Drill-Down. Das Aktivieren dieser Eigenschaft macht die Gruppe interaktiv, d.h. dass die Gruppe im Vorschaufenster auf das Klicken mit der Maus reagiert. Dadurch kann man durch den Klick auf den Gruppenkopf die Gruppe öffnen (zeigt alle Einträge an), schließen und damit nur den Kopf anzeigen oder den Fuß anzeigen (wird über die Eigenschaft ShowFooterIfDrillDown eingestellt).

So sieht eine Gruppe mit geöffnetem Kopf aus:

Sie können angeben ob die Gruppen beim Starten des Reports geöffnet oder geschlossen sind. Standardmäßig sind sie geschlossen und werden über die Eigenschaft ExpandDrillDown gesteuert. Falls die Gruppen geöffnet sein sollen, so stellen Sie die Eigenschaft auf True. Genauso können alle Gruppen geöffnet und geschlossen werden. Man muss dazu die Punkte „Alle öffnen“ oder „Alle schließen“ aus dem Kontextmenü der Vorschau auswählen.


Zeilennummerierung

Betrachten wir nun in unserem Beispiel wie man die einzelnen Zeilen durchnummeriert. Wir fügen das Objekt „Text“ ein mit der Systemvariablen [Line] auf beide Bänder (einfacher ist es, dies durch die „Drag & Drop“ – Methode aus dem Tab „Variablen“ des Fenster „Datenbaum“ zumachen)

Beim Starten sehen wir, dass beide Datenebenen durchnummeriert sind:

In manchen Reporten benötigen wir eine durchgehende Nummerierung. In unserem Beispiel nutzen wir deshalb die Variable Line#, anstatt Line auf dem Band und erhalten folgendes Ergebnis:


Aggregatfunktionen

In den meisten Fällen will man bei Gruppenreporten am Ende irgendeine zusammenfassende Information sehen z.B. die Summe, die Anzahl der Elemente usw. FastReport enthält für diesen Fall so genannte Aggregatfunktionen. Mit deren Hilfe kann man die Funktion zur Diagnose der Daten wählen. Die unten aufgeführte Liste enthält die enthaltenen Aggregatfunktionen:

Funktion | Beschreibung
SUM | Berechnet die Summe des Ausdrucks für die Datenmenge
MIN | Berechnet das Minimum des Ausdrucks für die Datenmenge
MAX | Berechnet das Maximum des Ausdrucks für die Datenmenge
AVG | Berechnet den Durchschnitt des Ausdrucks für die Datenmenge
COUNT | Zählt die Anzahl der Datensätze

Die Syntax aller Aggregatfunktionen (außer COUNT) sieht wie folgt aus (am Beispiel der Funktion SUM):

SUM(expression, band, flags)

SUM(expression, band)

SUM(expression)

Die Zuordnung der Parameter ist folgende:

expression – Ausdruck, dessen Bedeutung bearbeitet werden muss

band – der Name des Datenbandes, mit dem gearbeitet werden soll

flags – ein Feld, welches folgende Bedeutungen haben kann und die Kombinationen dieser:

1 – beachte unsichtbare Bänder

2 – kumuliert den Wert

Wie man sieht, ist expression der einzige obligatorische Parameter, die restlichen sind optional. Es empfiehlt sich trotzdem das Parameter band zu nutzen um Fehler zu vermeiden.

Die Funktion COUNT hat folgende Syntax:

COUNT(band, flags)

COUNT(band)

Die Zuordnung der Parameter ist analog:

Es existiert eine Regel, die für alle Aggregatfunktionen Gültigkeit hat: die Funktion wird nur für das Datenband berechnet und wird nur in dem Fuß angezeigt (hierzu zählen: Fuß, Seitenfuß, Gruppenfuß, Spaltenfuß)

Wie funktionieren Aggregatfunktionen? Sehen wir uns ein Beispiel unseres Reports mit Gruppen an. Fügen wir neue Elemente ein:

Das Feld:“ ItemsTotal“ auf dem Datenband wird die Summe der Bestellung anzeigen. In den Gruppenfuß setzen wir das Objekt „Text“ ein, dieses soll die Aggregatfunktion SUM enthalten. Es soll die Gesamtsumme aller Bestellungen des Kunden enthalten. Wenn wir den Report nun starten und mit einem Taschenrechner die Werte überprüfen, so werden wir sehen, das alles richtig funktioniert:

Also wie ist nun das Arbeitsprinzip der Aggregatfunktionen? Vor der Reporterstellung scannt FastReport den Inhalt der Objekte „Text“ nach Aggregatfunktionen. Gefundene Funktionen werden den entsprechenden Datenbändern zugeordnet (hier im Beispiel wird die Funktion SUM mit dem Band MasterData1 verknüpft). Bei der Erstellung des Reports werden nun, sobald das Datenband auf dem Bildschirm erscheint, die Aggregatfunktionen ausgewertet. Hier wird Summe des Feldes Group."ItemsTotal" gebildet. Nachdem der Gruppenfuß, welcher die Summe anzeigt, ausgeführt worden ist, wird nun die Funktion für die nächste Gruppe neu gestartet usw.

Hier kann man die Bedeutung des Parameters flags in Aggregatfunktionen aufzeigen. In manchen Reporten ist ein Teil der Bänder (oder auch alle) verborgen. Wir wollen jedoch, dass bei der Auswertung der Funktion alle Datenbänder berücksichtigt werden. In unserem Beispiel können wir die Eigenschaft Visible bei dem Datenband deaktivieren. Dieser wird nun nicht auf dem Bildschirm angezeigt. Soll die Summe auch die Werte der verborgenen Bänder enthalten, so müssen wir einen dritten Parameter in den Aufruf der Funktion einsetzen.

[SUM(<Group."ItemsTotal">,MasterData1,1)]

Wir erhalten folgenden Report:

Bei dem Parameter flags = 2 wird der kumulierte Wert nicht zurückgesetzt. Es wird eine Gesamtsumme gebildet. Modifizieren wir den Aufruf der Funktion:

[SUM(<Group."ItemsTotal">,MasterData1,3)]

Die 3 ist eine Kombination von 1 und 2, d.h. es werden auch die verborgenen Bänder bearbeitet und es wird eine Gesamtsumme gebildet: Im Endeffekt:


Ergebnisse der Seite und des Reportes

Einfugen der Aggregatfunktionen

Oft muss man im Report das Ergebnis der Seite oder des gesamten Reports darstellen. Dies wird ebenfalls mithilfe der Aggregatfunktionen gemacht. Sehen wir uns folgendes Beispiel an.

Wir haben das Band „Reportzusammenfassung“ und ein Objekt „Text“ eingefügt. Hier wird nun die Summe in den Bändern „Reportzusammenfassung“ und „Seitenfuß“ dargestellt.


Einfügen der Aggregatfunktionen

Einfugen der Aggregatfunktionen

Bis jetzt haben wir die Aggregatfunktionen per Hand in das Objekt „Text“ eingefügt. Betrachten wir nun ein paar weitere, bequemere Möglichkeiten eine Aggregatfunktion einzufügen.

Als Erstes kann man, um eine Aggregatfunktion auszuführen, das Objekt „Systemtext“ verwenden. Eigentlich ist es dasselbe Objekt „Text“, hat aber einen speziellen Editor um das Einfügen der Systemvariablen und Aggregatfunktionen einfacher zu machen.

Screenshot - 18.05.2009 , 16_16_05

Im Editor muss nun der Typ der Funktion, das Datenband, das Datenfeld und der Ausdruck angegeben werden. Ebenfalls kann man „Unsichtbare Bänder zählen“ und „Kumulative Summe“ markieren.

Die zweite Möglichkeit ist die Nutzung des Objektes „Text“ und der Button in dessen Editor. Es wird ein zusätzliches Fenster geöffnet (ist dem Fenster „Systemtext“ ähnlich). Klickt man nun auf OK, so wird in den Text die Funktion eingefügt.


Formatierung der Werte


Values formatting

Beachten wir ein Besonderheit der Aggregatfunktionen. Diese geben uns die Zahlen nicht formatiert wieder.

Die wird so gemacht, weil die Datenfelder in der Regel, die Informationen des Objektes „Text“ wiedergeben ohne diese vorher zu formatieren. Um das Resultat der Funktion SUM besser darzustellen, besitzt FastReport folgende Möglichkeiten der Formatierung.

Markieren wir das Objekt mit der Summe und rufen dessen Kontextmenü auf. Den Editor der Formatierung erreicht man über das Menü „Anzeigeformat...“ oder mit der Eigenschaft DisplayFormat im Objektinspektor.

Screenshot - 18.05.2009 , 16_18_05

Wie man sieht, befindet sich links die Kategorie der Formatierung und rechts die Liste der Formate in dieser Kategorie. Wählen wir die Kategorie „Zahl“ und das Format „$1,234.50“. Unten wird nun der Formatstring und der Dezimaltrenner dargestellt. Der Formatstring ist dem Argument der Delphi-Funktion Format ähnlich. FastReport formatiert mit Zahlen mit dessen Hilfe. Sie können den Formatstring und auch den Dezimaltrenner ändern. Wird der Dezimaltrenner nicht eingefügt, so wählt das Programm den üblichen verwendeten Trenner.

Wir klicken auf OK, der Report wird erstellt und wir sehen, dass die Summe nun folgendes Aussehnen angenommen hat:


Individuelle Formatierung

Das obere Beispiel der Formatierung wird für alle Ausdrücke verwendet, die ein Objekt enthält. Alles funktioniert einwandfrei, weil es nur einen Ausdruck im Objekt gibt. Was passiert jedoch wenn man zwei hat und dann auch noch verschiedener Typen?

Betrachten wir solch einen Fall. Es sollen die Summe und die Anzahl der Bestellungen angezeigt werden. Wir fügen in das Objekt folgenden Text ein:

Summe: [SUM(<Group."ItemsTotal">,MasterData1)]

Anzahl: [COUNT(MasterData1)]

Beim Start des Reports, sehen wir das beide Ausdrücke im Format Währung (oben eingegeben) angezeigt werden, was jedoch nicht richtig ist:

Um das ganze korrekt anzeigen zu können, muss jeder Ausdruck individuell formatiert werden. Hierfür gibt es so genannte Format-Tags. Diese werden vor der abschließenden eckigen Klammer eingefügt. In unserem Beispiel deaktivieren wir die Formatierung des Objektes (im Format-Editor wählen wir die Kategorie „Text (ohne Format)“. Jetzt ändern wir das Format der ersten Variablen, die zweite ist dann nicht formatiert und wird, wie gewünscht, als ganze Zahl angezeigt. Den Text des Objekts ändern wir auf folgende Weise:

Summe: [SUM(<Group."ItemsTotal">,MasterData1) #n%2,2m]

Anzahl: [COUNT(MasterData1)]

vergewissern wir uns, dass der Report nun richtig ausgeführt wird:

Jetzt zur Nutzung der Tags. Die Syntax ist die folgende:

[expression #tag]

Beachten Sie, dass die Leerstelle zwischen dem Ausdruck und dem Zeichen # ist zwingend! Der Tag selber kann folgendes Aussehen haben:

#nFormatZeile – Format Zahl

#dFormatZeile – Format Datum/Zeit

#bFalse,True – Format Wahrheitswert

Die FormatZeile ist in jedem Fall ein Argument für die Funktion, mit deren Hilfe man die Formatierung ausführt. Für das Format Zahl ist es die Delphi-Funktion Format und für das Format Datum/Zeit die Funktion FormatDateTime. Die möglichen Bedeutungen der Formatzeilen kann man in Hilfe von Delphi erfahren. Hier einige Bedeutungen, die in FastReport verwendet werden:

für das Format Zahl

%g – eine Zahl mit der minimalen Anzahl der Zeichen nach dem Komma

%2.2f – eine Zahl mit einer fixen Anzahl der Zeichen nach dem Komma

%2.2n – eine Zahl mit Trennzeichen

%2.2m – Format Währung, abhängig von lokalen Einstellungen im Kontrollpanell.

für das Format Datum/Zeit

dd.mm.yyyy – Datum 23.12.2003

dd mmm yyyy – Datum 23 nov 2003

dd mmmm yyyy – Datum 23 November 2003

hh:mm – Datum 23:12

hh:mm:ss – Datum 23:12:00

dd mmmm yyyy, hh:mm – Zeit und Datum 23 Íî˙áđü 2003, 23:12

Beim Format Zahl kann man anstatt des Punktes ein Komma oder ein Bindestrich verwenden. Dieses Symbol wird dann als Trennzeichen verwendet. Andere Ternnzeichen sind nicht zugelassen.

Die Formatierung des Typs #b stellt zwei Bedeutungen dar, die durch ein Komma getrennt sind. Die erste Bedeutung entspricht False, die zweite – True.

Um nicht alle Tags und deren Bedeutungen im Kopf behalten zu müssen, gibt es im Editor "Text" eine bequeme Möglichkeit um die Formatierung durchzuführen. Durch den Klick auf den Button [image] wird der Editor der Formatierung aufgerufen. Diesen haben wir uns schon angesehen. Nach der Formatwahl wird dieser in den Text eingefügt. Steht der Cursor dabei vor oder hinter der eckigen Klammer so wird das Format korrekt eingefügt.


Hervorheben

Diese Besonderheit des Objektes „Text“ erlaubt es ein Objekt farblich hervorzuheben und dies an eine bestimmte Bedingung zu knüpfen. Die Bedingung kann ein beliebiger Ausdruck sein. Betrachten wir die Hervorhebung am Beispiel. Es soll die Summe der Bestellungen grün hervorgehoben werden, wenn diese über 5000 liegt. Wir wählen das Feld Group."ItemsTotal" und klicken auf den Button "Hervorheben" [image] auf der Symbolleiste des Designers. Im Editor der Hervorhebung geben wir die Bedingung ein, bei welcher das Objekt hervorgehoben werden soll und geben die Parameter ein (Schrift, Fon).

Screenshot - 18.05.2009 , 16_22_15

Wir erhalten folgendes:

Beachten Sie die angegebene Bedingung: Value > 5000. Value ist die Bedeutung des DB-Feldes, mit welchem das Objekt verknüpft ist. Man könnte auch <Group."ItemsTotal"> > 5000 eingeben, es würde zum selben Ergebnis führen. Im Endeffekt kann man alle erlaubten Ausdrücke des FastReport verwenden.


Hervorhebung der Zeilen nacheinander

Mithilfe der Hervorhebung kann man relativ einfach dem Report ein moderneres Aussehen verpassen, indem man z.B. jede zweite Zeile hervorhebt. Machen wir das am Beispiel des Reports „Liste“, welchen wir in dem hervorgehendem Kapitel erstellt haben.

Am Anfang fügen wir die Bänder „ReportTitel“ und „Masterdata“ in das Blatt ein. Auf das Datenband legen wir ein Objekt „Text“ und dehnen es auf die komplette Breite des Bandes:

Dieses Objekt hat die Rolle einer Unterlage und wird die Farbe ändern, abhängig von der Nummer der Datenzeile. Heben wir das Objekt hervor und stellen im Editor folgende Bedingung ein:

<Line> mod 2 = 1

Achtung: falls Sie die Scriptsprache C++Script benutzen (s.h. Kapitel „Script“), müssen Sie auch die Bedingung in C++Script verfassen:

<Line> % 2 == 1

Wir wählen die Farbe Grau, diese jedoch heller. Jetzt können auch die anderen Objekte auf das Datenband gelegt werden:

Da die eingefügten Objekte auf der Unterlage liegen, kann man die nicht so einfach ändern. Wenn wir den Report nun starten sehen wir folgendes:


Unterreporte


Unterreporte

Manchmal muss man im eigentlichen Report zusätzliche Daten darstellen, welche an sich schon Reporte mit einer komplexen Struktur darstellen. Man kann solch einen Report mithilfe des Satzes der Bänder in FastReport erstellen, dies klappt jedoch nicht immer. In solch einem Fall kann man das Objekt „Unterreport“ [image] nutzen.

Fügen wir dieses Objekt ein, so wird automatisch eine zusätzliche Seite eingefügt, die mit dem Objekt verknüpft ist. Der Unterreport ist dem mehrseitigen Report sehr ähnlich. Der einzige Unterschied ist, das der Unterreport an der angewiesenen Stelle im Hauptreport ausgeführt wird und nicht danach. Bei der Bildung des Reports, wird, sobald man auf das Objekt „Unterreport“ trifft, der Report von der verknüpften Seite ausgeführt. Danach geht die Bildung des Hauptreports weiter.

Auf die Seite des Unterreports, kann man ebenfalls das Objekt „Unterreport“ legen. Dadurch erhöht man die Ebenen der Verschachtelungen. Ein Beispiel dafür kann man in dem Demonstrationsprogramm unter dem Report „Subreports“ finden.

Man muss bemerken, dass die Fähigkeit von FastReport Unterreport zu erstellen und damit die Ebenen der Verschachtelung zu erhöhen, unbegrenzt ist. Zur Erinnerung, ohne die Nutzung des Objekts „Unterreport“, sind die Ebenen auf sechs begrenzt.


Die Ausführung der Unterreporte nebeneinander

Die Ausfuhrung der Unterreporte nebeneinander

Sie haben die Möglichkeit zwei oder mehr Objekte „Unterreport“ nebeneinander auf dem selben Band anzulegen:

Dadurch kann man Reporte erstellen, die nicht auf eine andere Weise erstellt werden können. Wenn z.B. die Unterreporte die Listen verschiedener Längen enthalten:

Wie man sieht, bildet FastReport den Hauptreport weiter ann der Stelle, an der die längste Liste endet.


Beschränkungen bei der Nutzung der Unterreporte

Beschrankungen bei der Nutzung der Unterreporte

Da der Unterreport auf der Seite des Hauptreports liegt, kann er folgende Bänder nicht enthalten. "ReportTitle/ReportFooter", "Seitenkopf/Seitenfuß/Seitenhintergrund", "Spaltenkopf/-fuß". Genau genommen kann man diese Bänder auf die Seite des Unterreports legen, diese werden jedoch nicht bearbeitet (auf die Seite des Hauptreports kann man weiterhin alles legen). Deshalb hat es auch keinen Sinn die Seiteneinstellungen des Unterreports zu ändern, bei der Erstellung des Reports werden die Seiteneinstellungen des Hauptreports verwendet.

Man kann keine Objekte unter das Objekt „Unterreport“ legen:

Beim Darstellen des Unterreportes werden die darunter liegenden Objekte überlagert. Es würde z.B. wie folgt aussehen:

Um die Objekte unter dem Objekt „Unterreport“ darzustellen, nutzen Sie das Child-Band:

Dies gilt auch, wenn man mehrere Unterreporte untereinander liegen sollen.


Option (PrintOnParent)

Das Objekt „Unterreport“ hat eine sehr nützliche Eigenschaft und zwar PrintOnParent. Diese ist standardmäßig gleich False.

Normalerweise wird ein Unterreport in Form verschiedener Bänder auf den Hauptreport dargestellt. Das Band des Hauptreports welches das Objekt „Unterreport“ enthält, hat jedoch keine Beziehung zu den Bändern des Unterreports. Wird die Option PrintOnParent aktiviert, so werden die Bänder des Unterreports, in dem Band welches das Objekt „Unterreport“ enthält, eingefügt. Man kann solch ein Band dehnbar machen und es kann neben dem Unterreport ein, auf die gesamte Höhe des Bandes, gedehntes Objekt gelegen werden:


Script

Script ist ein, in einer Sprache des höheren Niveaus, geschriebenes Programm, das ein Teil eines Reports ist. Beim Start eines Reports wird ebenfalls auch Scripte gestartet. Scripte erlauben eine Bearbeitung der Daten, welche nicht mit den vorhandenen Möglichkeiten des Kerns von FastReport bearbeitet werden können. Zum Beispiel das Verbergen von Daten in Abhängigkeit von bestimmten Bedingungen. Scripte werden ebenfalls verwendet zur Steuerung von Dialogformen, die Komponenten des Reportes sind.

Scripte können in einer der Sprachen geschrieben werden, die die Scriptengine FastScript unterstützt. Bis zum heutigen Tag sind es folgende:

- PascalScript
- C++Script
- BasicScript
- JScript

Die Scriptengine FastScript besitzt folgende Eigenschaften:

- ein Standardsprachset: Variablen, Konstanten, Prozeduren, Funktionen (Verschachtelungen möglich), mit variablen/ständigen/standardmäßigen Parametern, alle Standardoperatoren (incl. case, try/finally/except, with), Typen (ganz, gebrochen, logisch, symbolisch, Zeilen, mehrdimensionale Reihen, Mehrzahl, Variante), Klassen (Methoden, Ereignisse, Eigenschaften, Indizes und Möglichkeiten der standardmäßigen Voreinstellung);

- die Erklärungen der Typen (records, classes) fehlen im Script, es gibt keine Aufzeichnungen (records), Anzeiger (pointers), Mengen (sets) (jedoch kann man den Operator 'IN' - "a in ['a'..'c','d']" verwenden), es gibt keinen Typ shortstring, Sprunganweisung (GOTO);

- Überprüfung der Typenvereinbarkeit;

- Zugang zu jedem Objekt des Reportes.

Sie können Scripte im FastReport Designer erstellen. Dieser beinhaltet einen Scripteditor mit dem Hervorheben der Syntax. Es gibt ebenfalls einen eingebetteten Debugger mit folgenden Funktionen: Step, Breakpoint, Run to cursor, Evaluate.


Erste Schritte

Die Tools um mit Scripten zu arbeiten befinden sich im Tab „Code“ des Designers von FastReport. So sieht der Bildschirm aus beim Umschalten auf den Tab:

Die Zahlen bedeuten:

1 – Tab „Code“

2 – Fenster des Scripteditors;

3 – Drop-Down-Liste der Scriptsprachen;

4 – Toolbar des Debuggers:

- Script ausführen (F9);

95 - Gehe zur Cursorposition (Run to cursor);

- Einzelne Anweisung (Step into);

- Script beenden;

- Auswerten (Evaluate);

94 - Haltepunkt umschalten.

5 – Fenster Watches zur Überwachung der Variablen;

6 – Lesezeichen (bookmark) und Unterbrechungspunkte (breakpoint) werden in diesem Feld angezeigt, ebenso werden Zeilen, die den ausführenden Code enthalten, hervorgehoben:

Unten die im Scripteditor genutzten Tastaturbefehle.

Tasten | Bedeutung
Pfeiltasten | Bewegen den Cursor
PageUp, PageDown | Blättern vorherige/nächste Seite
Strg+PageUp | Geht zum Anfang des Textes
Strg+PageDown | Geht zum Ende des Textes
Pos 1 | Geht zum Anfang der Zeile
Ende | Geht zum Ende der Zeile
Enter | Geht zur nächsten Zeile
Entf. | Entfernt das Symbol in der Position des Cursors, entfernt den hervorgehobenen Text.
Backspace | Entfernt das Symbol links vom Cursor
Strg+Y | Entfernt die aktuellen Zeile
Strg+Z | Macht die letzte Aktion rückgängig (bis zu 32 Stück)
Shift+Pfeiltasten | Hebt ein Textblock hervor
Strg+A | Markiert den gesamten Text
Strg+U | Verschiebt den hervorgehobenen Textblock zwei Symbole nach links
Strg+I | Verschiebt den hervorgehobenen Textblock zwei Symbole nach rechts
Strg+C, Strg+Einfg | Kopiert den markierten Textblock in den Zwischenspeicher
Strg+V, Shift+Einfg | Fügt den Text aus dem Zwischenspeicher ein
Strg+X, Shift+Entf | Schneidet den Text in den Zwischenspeicher aus
Strg+Shift+<Zahl> | Erstellt ein Lesezeichen mit der Zahl 0...9 in der aktuellen Zeile
Strg+<Zahl> | Geht zum gewählten Lesezeichen
Strg+F | Suche der Zeile
Strg+R | Ersetzen der Zeile
F3 | Neue Suche/Ersatz ab der Cursorposition
F4 | Start des Reports bis zu der Zeile in der sich der Cursor befindet (Run to cursor)
F5 | Einstellen des Unterbrechungspunktes (Toggle breakpoint)
Strg +F2 | Stoppt das Script (Program reset)
Strg +F7 | Betrachtung der Bedeutungen von Variablen (Evaluate)
F9 | Start des Scriptes (Run)
F7 čëč F8 | Ausführen der Codezeile (Step into)
Strg +Leertaste | Zeigt eine Drop-Down-Liste mit den Methoden und Eigenschaften des Objektes, dessen Name ausgewählt ist.
Strg +Shift+Entf | Entfernt das Wort vor dem Cursor komplett
Strg +Shift+Backspace | Entfernt das Wort nach dem Cursor komplett


Scriptstruktur

Die Scriptstruktur hängt von der verwendeten Sprache ab, diese kann aber gemeinsame Elemente darstellen. Diese sind die Kopfzeile des Scriptes, der Körper und die Hauptprozedur die beim Start des Reports ausgeführt werden. Unten sehen Sie die Beispiele der Scripte der vier unterstützenden Sprachen:

Struktur PascalScript:

#language PascalScript // optional

program MyProgram;     // optional

// der Teil uses – muss vor allen anderen Teilen stehen

uses 'unit1.pas', 'unit2.pas';

var                    // der Teil der Variablen – kann an einer beliebigen Stelle                stehen

i, j: Integer;

const                  // der Teil konstant

pi = 3.14159;

procedure p1;          // Prozeduren und Funktionen

var

i: Integer;

procedure p2;        // verschachtelte Prozedur

begin

end;

begin

end;

begin                  // Hauptprozedur.

end.

Struktur C++Script:

#language Ń++Script    // optional

// der Teil include - muss vor allen anderen Teilen stehen

#include "unit1.cpp", "unit2.cpp"

int i, j = 0;          // der Teil der Variablen – kann an einer beliebigen Stelle                stehen

#DEFINE pi = 3.14159   // der Teil konstant

void p1()              // Funktionen

{                      // keine verschachtelten Prozeduren

}

{                      // Hauptprozedur.

}

Struktur JScript:

#language JScript      // optional

// der Teil import - muss vor allen anderen Teilen stehen

import "unit1.js", "unit2.js"

var i, j = 0;          // der Teil der Variablen – kann an einer beliebigen Stelle                stehen

function p1()          // Funktionen

{                      //

}

                      // Hauptprozedur.

p1();

for (i = 0; i < 10; i++) j++;

Struktur BasicScript:

#language BasicScript  // optional

// der Teil imports - muss vor allen anderen Teilen stehen

imports "unit1.vb", "unit2.vb"

Dim i, j = 0           // der Teil der Variablen – kann an einer beliebigen Stelle                stehen

Function p1()          // Funktionen

{                      //

}

                      // Hauptprozedur.

For i = 0 To 10

p1()

Next

Eine genauere Beschreibung der Möglichkeiten Scriptengine FastScript können Sie in der Dokumentation dazu finden. Der Autor hat folgende Inhalte nicht doppelt in das Handbuch eingefügt:

- Syntax-Charts aller Sprachen;

- unterstütze Datentypen;

- die Arbeit mit Klassen, Eigenschaften, Methoden, Ereignissen;

- eingebaute Funktionen

- Aufzählungen und Sets.

Im weiterem Verlauf werden wir Beispiele der Scripte in PascalScript betrachten. Bei der Erstellung eines neuen Reportes wird diese Sprache standardmässig ausgewählt.


Script “Hello, World!”

Wir hatten das Beispiel des Reports "Hello, World!", lassen Sie uns jetzt mal ein einfachen Script erstellen. Dieser soll ein Fenster mit dem Text einer Begrüßung anzeigen.

Gehen wir in den Designer und klicken auf „Neuer Report“. FastReport erstellt nun eine leere Schablone. Wir gehen auf den Tab Code und geben folgendes Script ein:

PascalScript:

begin

ShowMessage('Hello, World!');

end.

C++ Script:

{

ShowMessage("Hello, World!");

}

Danach starten wir den Report. Wie erwartet, zeigt FastReport auf dem Bildschirm ein kleines Fester mit einer Begrüssung:

Klären wir ein paar Details. Wir haben ein Script erstellt der aus einem Block besteht begin..end. Auf diese Weise hat unser Script eine sehr einfache Struktur, es besteht nur aus der Hauptprozedur (s.h. vorheriges Kapitel „Scriptstruktur“). Die Hauptprozedur wird beim Start des Reports ausgeführt. In unserem Fall zeigt sie das Fenster an und wird nach dem Schließen beendet. Nach dem Beenden der Hauptprozedur beginnt die Erstellung des Reports.


Benutzung von Objekten im Script

Mit dem Script kann man sich an jedes Objekt im Report wenden. Wenn der Report z.B. die Seite Page1 und ein Objekt Memo1 enthält, so kann man diese im Script verwenden, indem man deren Namen benutzt:

PascalScript:

Memo1.Color := clRed

C++Script:

Memo1.Color = clRed

Die Liste der Objekte im Report, die aus dem Script erreichbar sind, wird im Fenster des „Reporttree“ angezeigt. Welche Eigenschaften der Objekte sind im Script zugänglich? Die Antwort ist einfach und zwar die, die im Objektinspektor sichtbar sind. Im unteren Teil des Fensters wird ein Hilfstext zu der gewählten Eigenschaft angezeigt. Beide Fenster (Reporttree und Inspektor) sind während der Arbeit mit dem Script zugänglich. Um eine ausführliche Auskunft über die Methoden und Eigenschaften der Objekte zu erhalten, verwenden Sie die FastReport Hilfe, die im Satz enthalten ist.

Demonstrieren wir das ganze an einem kleinen Beispiel. Fügen wir in die Reportseite das Objekt "Text" ein. Der Name soll MyTextObject lauten und als Text soll dort "Test" stehen. Wir schreiben das Script:

PascalScript:

begin

MyTextObject.Color := clRed

end.

C++Script:

{

MyTextObject.Color = clRed

}

Starten wir den Report und sehen, dass das Objekt rot geworden ist.


Zugriff auf Variablen aus der Liste der Reportvariablen

Im Script kann man auf jede Variable zugreifen, die in der Liste der Reportvariablen enthalten ist (Menüpunkt "Report|Variablen...". Der Name der Variablen muss dabei in spitze Klammern gesetzt werden:

PascalScript:

if <my variable> = 10 then ...

C++ Script:

if (<my variable> == 10) { ... }

Eine alternative Variante, ist die Verwendung der Funktion Get:

PascalScript:

if Get('my variable') = 10 then ...

C++ Script:

if (Get("my variable") == 10) { ... }

Die Änderung des Wertes dieser Variablen kann man nur mithilfe der Prozedur Set:

PascalScript:

Set('my variable', 10);

C++ Script:

Set("my variable", 10);

Man muss anmerken, dass das Hinzufügen der Zeilenbedeutung zusätzliche Klammern erfordert:

PascalScript:

Set('my variable', '''' + 'Zeile' + '''');

C++ Script:

Set("my variable", "\"Zeile\"");

Analog kann man auch auf Systemvariablen wie Page# zugreifen:

PascalScript:

if <Page#> = 1 then ...

C++ Script:

if (<Page#> == 1) { ... }


Zugriff auf DB-Felder

Wie auch im Fall die Variablen, müssen auch hier eckige Klammern verwendet werden:

PascalScript:

if <Table1."Field1"> = Null then...

C++ Script:

if (<Table1."Field1"> == Null) { ... }

Ganauso kann man die Funktion Get verwenden (eigentlich wird diese Funktion immer für die Berechnung der Ausdrücke verwendet, die in Klammern gesetzt sind).


Die Verwendung von Aggregatfunktionen im Script

Die Besonderheit der Aggregatfunktion ist, dass sie innerhalb des Objektes "Text" verwendet werden muss. Danach kann man auf diese im Script zugreifen. Wird die Aggregatfunktion nur im Script verwendet (ohne die Verwendung im Objekt "Text"), so wird eine Fehlermeldung angezeigt. Dies ist notwendig, damit die Aggregatfunktion korrekt funktioniert. Deshalb muss sie an ein Band gebunden sein.


Anzeigen des Wertes der Variablen im Report

Um den Inhalt einer Scriptvariablen im Report anzuzeigen, muss diese beschrieben und ein Wert muss ihr zugeordnet werden. Hier ein einfaches Beispiel des Scriptes:

PascalScript:

var

MyVariable: String;

begin

MyVariable := 'Hello!';

end.

C++ Script:

string MyVariable;

{

MyVariable = "Hello!";

}

Den Wert der Variablen kann man z.B. Im Objekt "Ňĺxň" darstellen, indem man die Zeile [MyVariable] einfügt.

Der Name der Variablen muss einzigartig sein, d.h. es darf nicht denselben Namen haben wie die Objekte des Reportes, der Standardfunktionen, Konstanten. Bei jedem Fehler im Script erscheint eine Fehlermeldung auf dem Bildschirm und der Report wird nicht erstellt.


Ereignisse

Bis jetzt haben wir Scripte mit nur einer Hauptprozedur betrachtet, die beim Start des Reports ausgeführt wird. In der Hauptprozedur kann man Starteinstellungen ausführen oder die Variablen initialisieren. Aber für die volle Kontrolle über den Prozess der Reportbildung ist es ungenügend. Um den Report flexibel steuern zu können, hat jedes Objekt mehrere Ereignisse, denen ein Bearbeiter zugewiesen werden kann – eine Pozedur im Script. Man kann zum Beispiel im Editor des Datenbandes Einträge filtern, d.h. verbergen und anzeigen des Bandes abhängig von bestimmten Bedingungen.

Betrachten wir den Prozess der Bildung des Reports und der Ereignisse, die dabei generiert werden am Beispiel eines einfachen Berichtes, der nur eine einzige Seite, ein Band „Daten 1. Ebene“ und zwei Objekte Text im Band enthält.

Am Anfang des Reports wird, wie gesagt die Hauptprozedur ausgeführt. Erst danach beginnt der eigentliche Prozess der Reporterstellung. Das Ereignis OnStartReport wird am Anfang des Objekts „Reports“ aufgerufen. Vor dem formieren der Seite wird das Ereignis OnBeforePrint. Dieses Ereignis wird einmal für jede Seite der Reportschablone aufgerufen (nicht zu verwechseln mit den Seiten des fertigen Reports!) In unserem Fall unabhängig der Seiten im fertigen Report, wird das Ereignis nur einmal aufgerufen, da die Reportschablone aus nur einer Seite besteht.

Als nächstes beginnt der Druck der Datenbänder. Das geschieht auf folgende Weise:

1. Ereignis OnBeforePrint des Bandes wird aufgerufen;

2. die Ereignisse OnBeforePrint der auf dem Band liegenden Objekte werden aufgerufen;

3. alle Objekte werden mit Daten gefüllt (in unserem Fall mit Bedeutungen der DB-Felder Company und Addr1);

4. die Objekte werden auf dem Band positioniert (falls dazwischen dehnbare sind), ebenfalls wird die Höhe des Bandes berechnet und es wird gedehnt (falls es dehnbar ist);

5. das Ereignis OnAfterCalcHeight des Bandes wird aufgerufen;

6. falls das Band nicht auf eine Seite passt, wird eine neue erstellt;

7. das Band und alle seine Objekte werden auf dem fertigen Report ausgeführt;

8. das Ereignis OnAfterPrint aller Objekte des Bandes wird aufgerufen;

9. das Ereignis OnAfterPrint des Bandes wird aufgerufen

Die Bänder werden ausgeführt, solange es Daten in der verknüpften Datenquelle gibt. Danach endet das Formieren des Reports in unserem Fall und das Ereignis OnAfterPrint der Reportseite wird aufgerufen. Als letztes wird das Ereignis OnStopReport des Objekts „Report“ aufgerufen.

Auf diese Weise wird durch Benutzung der Ereignisse verschiedener Objekte praktisch jeder Moment beim Erstellen des Reports kontrolliert. Der Schlüssel zum richtigen Verwenden der Ereignisse ist das Verstehen all dieser neuen Punkte des Prozesses der Reporterstellung. So können viele Handlungen nur ausgeführt werden indem man das Ereignis OnBeforePrint verwendet. Alle Änderungen die im Objekt vorgenommen werden, werden sofort angezeigt. Hier kann aber nicht analysiert werden, auf welcher Seite das Band angezeigt wird wenn dieses dehnbar ist. Die Berechnung dazu findet erst bei Punkt 4 statt. Dies kann mit dem Ereignis OnAfterCalcHeight oder OnAfterPrint im Punkt 8 gemacht werden, aber im letzten Fall wird das Band schon gedruckt sein und die Bearbeitung der Objekte wird keine Auswirkungen haben. Deswegen müssen Sie genau wissen, wann welches Ereignis aufgerufen wird und genau die benutzen, die benötigt werden.


Beispiel der Nutzung des Ereignisses OnBeforePrint

Demonstrieren wir das oben genannte an einem Beispiel. Erstellen wir einen Report und zwar eine Kundenliste, die nur Unternehmen enthalten soll deren Name mit „A“ beginnt.

Erstellen wir ein neues Projekt in Delphi und legen auf die Seite die Komponenten TTable, TfrxDBDataSet, TfrxReport und stellen diese wie folgt ein:

Table1:

DatabaseName = 'DBDEMOS'

TableName = 'customer.db'

frxDBDataSet1:

DataSet = Table1

UserName = 'Customers'

Gehen wir in den Reporteditor und erstellen einen Report mit folgendem Aussehen:

Markieren wir das Datenband und gehen auf den Tab „Ereignisse“ im Objektinspektor:

Um den Bearbeiter des Ereignisses OnBeforePrint (dieses passt hier am besten) zu starten, müssen wir einen Doppelklick mit der Maus auf eine leere Stelle gegenüber den Namen des Ereignisses durchführen:

Dadurch wird in den Scripttext ein leerer Bearbeiter hinzugefügt und der Designer schaltet auf den Tab „Code“:

Die Arbeitsweise ist der der Umgebung Delphi ähnlich. Wir müssen nur noch den folgenden Code in den Bearbeiter eingeben.

PascalScript:

if Copy(<Customers."Company">, 1, 1) = 'A' then

MasterData1.Visible := True else

MasterData1.Visible := False;

C++Script:

if (Copy(<Customers."Company">, 1, 1) == "A")

MasterData1.Visible = true;

else

MasterData1.Visible = false;

Starten wir den Report und überzeugen uns, dass das Script richtig funktioniert:

Sie können einen Bearbeiter für mehrere Ereignisse verschiedener Objekte bestimmen. In diesem Fall Parameter Sender bestimmt das Objekt, welches das Ereignis initialisiert hat (analog dem Parameter Sender in den Ereignissen Delphi). Um dem Ereignis den Namen eines schon bestehenden Bearbeiters zu geben, kann dieser manuell im Objektinspektor eingetragen werden oder man kann ihn in der Drop-Down-Liste auswählen (ebenfalls analog der Umgebung Delphi):

Der Link zum Bearbeiter kann leicht entfernt werden. Wählen Sie die Eigenschaft aus und klicken auf Entf.


Drucken der Endsumme der Gruppe im Gruppenkopf

Dieser oft durchgeführte Schritt benötigt die Verwendung eines Scriptes. In einem Standardreport ist die Summe erst zugänglich nachdem alle Einträge der Gruppe bearbeitet wurden. Um diese im Gruppenkopf darzustellen (bevor die Gruppe bearbeitet wird) verwendet man folgenden Algorithmus:

- der Report muss Zweipass aktiviert haben

- beim ersten Durchgang wird die Summe jeder Gruppe ermittelt und in irgendeinem Datenfeld gespeichert

- beim zweiten Durchgang wird diese aus dem Datenfeld geholt und im Gruppenkopf dargestellt.

Demonstrieren wir die Lösung dieser Aufgabe auf zwei Arten. Als erstes erstellen wir ein neues Projekt in Delphi und legen auf die Seite die Komponenten TQuery, TfrxReport, TfrxDBDataSet. Die Einstellungen sind wie folgt:

Query1:

DatabaseName = 'DBDEMOS'

SQL =

select * from customer, orders

where orders.CustNo = customer.CustNo

order by customer.CustNo, orders.OrderNo

frxDBDataSet1:

DataSet = Query1

UserName = 'Group'

Jetzt gehen wir in den Designer und verknüpfen unsere Datenquelle mit dem Report. In den Einstellungen des Reports (Menüpunkt "Report|Einstellungen...") aktivieren wir Zweipass. Zwei Bänder werden eingefügt: „Gruppenkopf“ und „Daten 1. Ebene“. Im Editor des Bandes „Gruppenkopf“ fügen wir die Bedingung Datenfeld Group.CustNo ein: Das Datenband verknüpfen wir mit der Datenquelle und ordnen die Objekte folgendermaßen an:

Das markierte Objekt in der Grafik (der Name: Memo8) benutzen wir um die Summe anzuzeigen.

Möglichkeit 1.

Wir verwenden als Datenfeld für die Aufbewahrung der Summen "TstringList". Die Summe soll in Form von Zeilen gespeichert werden. Dabei soll die erste Zeile die Werte der ersten Gruppe darstellen usw. Die Gruppennummer soll eine ganzzahlige Variable sein, die sich mit jeder folgenden Gruppe erhöht.

Unser Script sieht in diesem Fall so aus:

PascalScript:

var

List: TStringList;

i: Integer;

procedure frxReport1OnStartReport(Sender: TfrxComponent);

begin

List := TStringList.Create;

end;

procedure frxReport1OnStopReport(Sender: TfrxComponent);

begin

List.Free;

end;

procedure Page1OnBeforePrint(Sender: TfrxComponent);

begin

i := 0;

end;

procedure GroupHeader1OnBeforePrint(Sender: TfrxComponent);

begin

if Engine.FinalPass then

   Memo8.Text := 'Sum: ' + List[i];

end;

procedure GroupFooter1OnBeforePrint(Sender: TfrxComponent);

begin

if not Engine.FinalPass then

   List.Add(FloatToStr(SUM(<Group."ItemsTotal">,MasterData1)));

Inc(i);

end;

begin

end.

C++ Script:

TStringList List;

int i;

void frxReport1OnStartReport(TfrxComponent Sender)

{

List = TStringList.Create();

}

void frxReport1OnStopReport(TfrxComponent Sender)

{

List.Free();

}

void Page1OnBeforePrint(TfrxComponent Sender)

{

i = 0;

}

void GroupHeader1OnBeforePrint(TfrxComponent Sender)

{

if (Engine.FinalPass)

   Memo8.Text = "Sum: " + List[i];

}

void GroupFooter1OnBeforePrint(TfrxComponent Sender)

{

List.Add(FloatToStr(SUM(<Group."ItemsTotal">,MasterData1)));

i++;

}

{

}

An dem Namen der Prozedur kann man sehen, welches Ereignis wir verwendet haben: Report.OnStartReport, Report.OnStopReport, Page1.OnBeforePrint, GroupHeader1.OnBeforePrint, GroupFooter1.OnBeforePrint. Was die beiden ersten Ereignisse angeht, so werden diese am Anfang und am Ende eines Reports aufgerufen. Um die Bearbeiter für diese Ereignisse zu erstellen, markieren wir das Objekt „Report“ im Fenster „Reporttree“. Die Eigenschaften erscheinen dadurch im Objektinspektor. Den Rest erledigen wir wie gewohnt, indem wir auf den Tab „Ereignisse“ des Inspektors gehen und die Bearbeiter erstellen.

Wieso haben wir für die Erstellung der Liste List nicht die Hauptprozedur benutzt, sondern haben es im Ereignis OnStartReport gemacht? Weil das erstellte Objekt nach dem Vollenden des Reports befreit werden muss. Logischerweise ist es besser die Objekte im Ereignis OnStartReport zu erstellen und im OnStopReport zu befreien. In anderen Fällen (wenn der Speicher nicht befreit werden muss) kann man die Hauptprozedur verwenden um Variablen zu initialisieren.

Das Erstellen und das Befreien des Objektes "List" haben wir geklärt. Lassen Sie uns nun die Arbeitsweise des Scripts betrachten. Am Anfang der Seite wird der Zähler der laufenden Gruppe (Variable i) auf 0 gesetzt und wird um 1 erhöht nach jeder neuen Gruppe (im Ereignis GroupFooter1.OnBeforePrint). Ebenfalls wird in diesem Ereignis die Summe in die Liste eingefügt. Das Ereignis GroupHeader1.OnBeforePrint funktioniert beim ersten Durchgang nicht (Überprüfung Engine.FinalPass). Beim zweiten Durchgang (wenn die Liste List mit Werten gefüllt ist), wird dieses Eeignis den Wert der aktuellen Gruppe anzeigen und in den Text des Objektes Memo8 eintragen. Der Text zeigt die Summe in der Kopfzeile der Gruppe. Im fertigen Report sieht es so aus:

Wie man sieht ist der Algorithmus relativ einfach. Man kann ihn aber noch einfacher gestalten.

Möglichkeit 2.

Wir verwenden als Datenfeld zum Speichern der Summen die Liste der Reportvariablen. Der Bezug auf diese Variablen läuft mit den Funktionen Get und Set. Dadurch müssen wir nicht neue Objekte erstellen und der Speicher muss nicht gelöscht werden. Das Script sieht dann so aus:

PascalScript:

procedure GroupHeader1OnBeforePrint(Sender: TfrxComponent);

begin

if Engine.FinalPass then

   Memo8.Text := 'Sum: ' + Get(<Group."CustNo">);

end;

procedure GroupFooter1OnBeforePrint(Sender: TfrxComponent);

begin

Set(<Group."CustNo">,

   FloatToStr(SUM(<Group."ItemsTotal">,MasterData1)));

end;

begin

end.

C++ Script:

void GroupHeader1OnBeforePrint(TfrxComponent Sender)

{

if (Engine.FinalPass)

   Memo8.Text = "Sum:" + Get(<Group."CustNo">);

}

void GroupFooter1OnBeforePrint(TfrxComponent Sender)

{

Set(<Group."CustNo">,

   FloatToStr(SUM(<Group."ItemsTotal">,MasterData1)));

}

{

}

Wie man sieht ist das Script wesentlich einfacher geworden. Der Code im Bearbeiter GroupFooter1.OnBeforePrint stellt den Wert der Variablen mit dem Namen des Kunden (der Gleich der Kundennummer ist) dar. Man kann ein beliebiges Identifizierungszeichen verwenden, das den Kunden eindeutig identifiziert z. B. seinen Namen <Group."Company">. Gibt es eine solche Variable nicht, so wird sie erstellt. Gibt es sie, so wird deren Wert geändert. Im Bearbeiter GroupHeader1.OnBeforePrint wird der Wert der Variablen mit der Nummer der aktuellen Gruppe angezeigt.


Ereignis OnAfterData

Dieses Ereignis wird generiert, nachdem das Objekt im Report mit den verknüpften Daten gefüllt worden ist. Das Ereignis ist praktisch, um die Werte des DB-Feldes oder die Ausdrücke im Objekt zu analysieren. Tatsache ist, dass sich dieser Wert in der Dienstvariable Value befindet und deren Werte sind nur in diesem Ereignis zugänglich. Hat man zwei Objekte "Text" mit dem Inhalt [Table1."Field1"] und [<Table2."Field1"> + 10], kann man die Werte dieser Ausdrücke bequem analysieren, wenn man sich auf die Variable Value bezieht:

PascalScript:

if Value > 3000 then

Memo1.Color := clRed

C++ Script:

if (Value > 3000)

Memo1.Color = clRed;

anstatt etwas wie dies zu schreiben:

PascalScript:

if <Table1."Field1"> > 3000 then

Memo1.Color := clRed

C++ Script:

if (<Table1."Field1"> > 3000)

Memo1.Color = clRed;

Darüber hinaus gibt die Verwendung von Value, anstatt eines Ausdrucks, die Möglichkeit einen universellen Bearbeiter für das Ereignis OnAfterData zu erstellen und diesen mit mehreren Objekten zu verknüpfen.

Eins muss noch erwähnt werden, enthält das Objekt mehrere Ausdrücke z.B. [expr1] [expr2], so wird in die Variable Value der Wert des letzten Ausdruckes übernommen.

Das Ereignis OnAfterData passt ausgezeichnet, um die Höhe und Breite von Objekten wie z.B. „Text“ zu berechnen. Sprich, wenn man im Script des Reports den tatsächlichen Wert der Höhe des Objekts haben möchte (dehnbares Objekt) und im Objekt „Text“ wird ein Ausdruck verwendet, so kann man solch ein Script benutzen im Ereignis OnAfterData:

PascalScript:

var

MemoWidth: Extended;

begin

MemoWidth := TfrxMemoView(Sender).CalcWidth;

end;

C++ Script:

float MemoWidth;

MemoWidth = TfrxMemoView(Sender).CalcWidth;

Wenn der Datencode in das Ereignis OnBeforePrint einfügt wird, so wird das Resultat, die Höhe des Objektes (welches den Ausdruck enthält) und nicht sein Wert sein.


Serviceobjekte

Neben den im Report enthaltenen Objekten (Seiten, Bänder, Objekte „Text“ usw.), sind zusätzlich im Script einige Serviceobjekte enthalten. Diese sind hilfreich bei der Steuerung der Erstellung eines Reports. Zu diesen Objekten gehört das oben benutzte Objekt Engine. Die Liste der Serviceobjekte ist unten aufgeführt:

- Report – Objekt "Report";

- Engine – Link zur Reportengine;

- Outline – Link zum Steuerungselement „Reporttree“ im Vorschaufenster.

Betrachten wir die Objekte.


Objekt Report

Stellt einen Link zum laufenden Report dar. Die Eigenschaften des Objekts kann man sehen, wenn man das Element „Report“ im Fenster „Reporttree“ auswählt.

Methoden:

Methode | Beschreibung
function Calc(const Expr: String): Variant | Zeigt den Wert des Ausdrucks Expr an, z.B. Report. Calc('1+2') würde 3 anzeigen. Jeder Ausdruck, der aus Sicht von FastReport korrekt ist, kann als Ausdruck übertragen werden.
function GetDataSet(const Alias: String): TfrxDataSet | Gibt einen Datensatz mit einem angegebenen Namen zurück. Der Datensatz muss in der Liste der Reportdaten enthalten sein (Dialog „Report|Daten…“).


Objekt Engine

Dies ist ein sehr nützliches und interessantes Objekt, welches einen Link zur Engine (der Kern von FastReport, welcher die Erstellung des Reports steuert) darstellt. Indem man die Eigenschaften und Methoden der Engine verwendet, kann man wahrhaft exotische Reporttypen erstellen. Betrachten wir die Eigenschaften und Methoden des Objekts.

Eigenschaft | Typ | Beschreibung
CurColumn | Integer | Die Nummer der aktuellen Spalte im Multispalten-Report. An diese Eigenschaft kann man einen Wert binden.
CurX | Extended | Die aktuelle Verschiebung der Koordinaten auf der X-Achse. An diese Eigenschaft kann man einen Wert binden.
CurY | Extended | Die aktuelle Verschiebung der Koordinaten auf der Y-Achse. An diese Eigenschaft kann man einen Wert binden.
DoublePass | Boolean | Standardmäßig True, wenn der Report Zweipass aktiviert hat. Analog Report.EngineOptions.DoublePass.
FinalPass | Boolean | Standardmäßig True, wenn der zweite Durchgang eines Reports ausgeführt wird.
PageHeight | Extended | Die Höhe der zu druckenden Region in Pixel.
PageWidth | Extended | Die Breite der zu druckenden Region in Pixel.
StartDate | TDateTime | Die Zeit des Startens des Reports. Analog der Systemvariable <Date>.
StartTime | TDateTime | Die Zeit des Startes des Reports. Analog der Systemvariable <Time>.
TotalPages | Integer | Anzahl der Seiten im Report. Analog der Systemvariablen <TotalPages>. Im diese Variable nutzen zu können, muss der Report Zweipass aktiviert haben.
SecondScriptcall | Boolean | Standardmäßig True, wenn beim Übertragen der Objekte das Ereignis des Objekts wiederholt aufgerufen wird (passiert beim Übertragen des Objektes „Text“ mit der aktivierten Eigenschaft SuppressRepeated ).

Methoden:

Methode | Beschreibung
procedure AddAnchor(const Text: String) | Fügt einen „Anker“ in die Liste der Anker ein. Genaueres folgt später.
procedure NewColumn | Erstellt eine neue Spalte im Multispalten-Report. Nach der letzten Spalte wird automatisch die Seite getrennt.
procedure NewPage | Erstellt eine neue Seite (Seitentrennung).
procedure ShowBand(Band: TfrxBand) | Zeigt das Band mit dem eingegebenen Namen an. Nach der Ausführung des Bandes verschiebt sich automatisch die Position CurY.
function FreeSpace: Extended | Zeigt die Höhe des restlichen freien Platzes auf der Seite an (in Pixel).
function GetAnchorPage(const Text: String): Integer | Zeigt die Seitennummer an, auf der sich der eingegebene Anker befindet.


Objekt Outline

Dieses Objekt stellt ein Steuerungselement "Reporttree" im Vorschaufenster dar.

Dieses Element zeigt die Baumstruktur des fertigen Berichtes an. Beim Klick auf einen Knoten wechselt man auf die Reportseite, mit der dieser verbunden ist. Um den Baum darzustellen klickt man entweder auf auf den Instrumentenpanel im Vorschaufenster oder stellt die Eigenschaft Report.PreviewOptions.OutlineVisible gleich True. Dort kann man ebenfalls die Breite des Steuerungselementes in Pixel eingeben: Report.PreviewOptions.OutlineWidth.

Betrachten wir die Methoden dieses Objektes:

Methode | Beschreibung
procedure AddItem(const Text: String) | Fügt ein Element mit der Bezeichnung „Text“ in die aktuelle Position des Baumes. Mit dem Element wird die aktuelle Reportseite und die aktuelle Position auf der Seite assoziiert.
procedure LevelRoot | Verschiebt die aktuelle Position in dem Baum auf die Wurzelebene.
procedure LevelUp | Verschiebt die aktuelle Position in dem Baum eine Ebene höher.


Anwendung des Objektes Engine

Wir haben schon erwähnt, dass das Objekt Engine die Reportengine darstellt und die Reporterstellung steuert. Durch die Verwendung der Eigenschaften und Methoden der Engine, steuert man den Prozess der Bandverteilung auf der Seite. Am Anfang etwas Theorie.

Die Grafik unten zeigt die Darstellung einer Reportseite und der Namen der Eigenschaften, welche die Maße steuern.

Eine Seite besitzt die physischen Maße PaperWidth, PaperHeight. Diese entsprechen namentlich den Eigenschaften der Seite, welche im Objektinspektor zusehen sind. Die Seite besitzt das Format A4 und ist 210ő297 mm groß.

Die Parameter PageWidth, PageHeight bestimmen die Größe der Seite auf der der Druck erfolgt. Diese ist in der Regel kleiner als die eigentliche Seite. Die Maße der bedruckbaren Fläche der Seite werden über die Eigenschaften LeftMargin, TopMargin, RightMargin, BottomMargin gesteuert. Die Eingabe der Maße der bedruckbaren Fläche in Pixel erfolgt über die Eigenschaften Engine.PageWidth, Engine.PageHeight

Das Parameter FreeSpace bestimmt die Höhe der freien Fläche der Seite. Enthält die Seite das Band „Seitenfuß“ (Page Footer), so wird dessen Höhe beim Berechnen der Höhe durch FreeSpace berücksichtigt. Dieses Parameter in Pixel ist die Funktion Engine.FreeSpace. Man muss hinzufügen, dass nach dem Anzeigen des nächsten Bandes der freie Platz auf der Seite abnimmt. Auch dies berücksichtigt FreeSpace beim Berechnen.

Wie erfolgt das Formieren der Seiten eines fertigen Reports? Der Kern von FastReport fügt der Seite Bänder hinzu, solange es genügend Platz für das Band gibt. Reicht der Platz nicht aus, wird das Band „Seitenfuß“ gedruckt (falls vorhanden) und eine neue Seite wird erstellt. Wie oben erwähnt, reduziert sich nach dem nächsten Band die freie Fläche. Außerdem wird das folgende Band von der gegenwärtigen Position angezeigt, die durch Koordinaten auf der X-Achse und Y-Achse definiert wird. Die Steuerung erfolgt über die Eigenschaften Engine.CurX, Engine.CurY. Nach dem Druck des nächsten Bandes erhöht CurY automatisch die Höhe, entsprechend der des Bandes. Nach dem Erstellen der neuen Seite ist CurY = 0. CurX verändert sich nur bei Multispalten-Reporten.

Die Eigenschaften Engine.CurX, Engine.CurY sind nicht nur zum Lesen verfügbar, sondern auch zum Schreiben. Die Bänder können dadurch manuell verschoben werden indem man eines der Ereignisse nutzt. Betrachten wir folgendes Beispiel:

Man kann ihn folgendermaßen drucken:

Die ist das Resultat eines Scripts, zugeteilt dem Ereignis OnBeforePrint des Bandes:

PascalScript:

procedure MasterData1OnBeforePrint(Sender: TfrxComponent);

begin

Engine.CurX := Engine.CurX + 5;

end;

C++ Script:

void MasterData1OnBeforePrint(TfrxComponent Sender)

{

Engine.CurX = Engine.CurX + 5;

}

Durch Manipulation der Eigenschaft CurY kann man die Bänder übereinander darstellen:

Das verantwortliche Script:

PascalScript:

procedure MasterData1OnBeforePrint(Sender: TfrxComponent);

begin

Engine.CurY := Engine.CurY - 15;

end;

C++ Script:

void MasterData1OnBeforePrint(TfrxComponent Sender)

{

Engine.CurY = Engine.CurY - 15;

}

Die Methode Engine.NewPage erlaubt die Trennung der Seite an der gewünschten Stelle. Der Druck erfolgt auf der nächsten Seite. In unserem Beispiel trennen wir die Seite nach der zweiten Zeile:

PascalScript:

procedure MasterData1OnAfterPrint(Sender: TfrxComponent);

begin

if <Line> = 2 then

   Engine.NewPage;

end;

C++ Script:

void MasterData1OnAfterPrint(TfrxComponent Sender)

{

if (<Line> == 2)

   Engine.NewPage();

}

Beachten Sie, dass wir es jetzt im Ereignis OnAfterPrint machen, sprich nachdem das Band schon erstellt worden ist. Die Systemvariable Line fügt die korrekte Nummer des Eintrags ein.

Die Methode Engine.NewColumn trennt die Spalten im Multispalten-Report. Nach der letzten Spalte wird eine neue Seite erstellt.


Anker

Anker (anchors) ist eines der Elemente des Hyperlink Systems, welches es erlaubt, durch einen Klick auf ein Objekt im fertigen Report (im Vorschaufenster), auf das verbunde Element zu wechseln.

Anker ist ein spezielles Zeichen, welches über die Methode Engine.AddAnchor gesetzt wird. Der Anker hat einen Namen und ihm entspricht die Nummer und die Position auf der Seite. Um zu einem Anker mit dem angegebenen Namen zu wechseln, kann man in die Eigenschaft URL eines beliebiges Objektes des Reports, die folgende Zeile einfügen:

#NameAnker

čëč

#[NameAnker]

Im letzten Fall wird FastReport den Wert in der eckigen Klammer anzeigen.

Beim Klick auf dieses Objekt, wird man zu der Stelle des Reports weitergeleitet, in der der Anker eingefügt wurde.

Anker sind praktisch beim Erstellen des Kapitels „Inhaltverzeichnis“ mit Links zu den entsprechenden Kapiteln. Zeigen wir dies an einem kleinen Beispiel. Hierfür benötigen wir die uns bekannte Tabelle Customer.db.

Unser Report wird zweiseitig (sprich zwei Seiten im Designer). Auf der ersten Seite erstellen wir das „Inhaltverzeichnis“ und auf der zweiten die eigentliche Kundenliste. Beim Klick auf eine Zeile im Inhaltsverzeichnis, wird man zum entsprechenden Element des Reports weitergeleitet.

Erste Seite:

In die Eigenschaft URL des Objektes „Text“, welcher auf dem Datenband liegt, fügen wir folgende Zeile ein:

#[Customers."Company"]

und stellen die Eigenschaften der Schrift ein: blau und unterstrichen, um das Aussehen des Hyperlinks zu immitieren.

Zweite Seite:

Um den Anker einzufügen, schreiben wir im Script des Bandes MasterData2.OnBeforePrint:

PascalScript:

procedure MasterData2OnBeforePrint(Sender: TfrxComponent);

begin

Engine.AddAnchor(<Customers."Company">);

end;

C++ Script:

void MasterData2OnBeforePrint(TfrxComponent Sender)

{

Engine.AddAnchor(<Customers."Company">);

}

Nun starten wird den Report und vergewissern uns, dass die Hyperlinks funktionieren.

Was man noch erwähnen kann, ist die Funktion Engine.GetAnchorPage. Diese zeigt die Nummer der Seite an, in der der Anker hinzugefügt wurde. Ebenfalls ist diese Funktion wichtig für die Erstellung des „Inhaltsverzeichnisses“. Dazu muss im Report Zweipass aktiviert werden.


Anwendung des Objektes Outline

Das Objekt Outline stellt den Reporttree dar, welcher im Vorschaufenster angezeigt werden kann. Beim Klick auf ein Element des Baums wird man auf die damit verbundene Reportseite geleitet. Um mit Outline arbeiten zu können muss man das Script nutzen, weil manche Bänder einen Mechanismus besitzen, der es ihnen erlaubt, den Baum automatisch zu erstellen. Betrachten wir zwei Beispiele der Nutzung von Outline. Einmal mit Hilfe der Bänder und aus dem Script.

Um den Baum automatisch zu erstellen, besitzen fast alle Bänder die Eigenschaft OutlineText in die die Zeile des Ausdrucks eingefügt wird. Der Ausdruck wird berechnet und der Wert wird beim Druck des Bandes in den Baum eingefügt. Die Hierarchie der Elemente im Baum entspricht der, der Bänder im Report. Das heißt im Baum werden Haupt, und untergeordnete Elemente vorhanden sein, die den Haupt und Untergeordneten Bändern im Report entsprechen (z. B. ein Report mit zwei Ebenen oder mit Gruppen). Betrachten wir die Arbeit mit dem Baum am Beispiel des Reportes mit Gruppen, welchen wir vorhin hatten.

Stellen wir die Eigenschaft des Bandes GroupHeader1.OutlineText gleich <Group."Company">. Beim Start sehen wir folgendes:

Beim Klick auf ein beliebiges Element des Baumes, werden wir auf die entsprechende Seite des Reportes geleitet. Das Element wird oben im Fenster angezeigt.

Fügen wir eine zweite Ebene in den Reporttree ein. Hierfür müssen wir die Eigenschaft des Bandes MasterData.OutlineText gleich <Group."OrderNo"> stellen. Der Baum sieht nun wie folgt aus:

Wie man sieht, ist nun die Navigation über die Bestellnummern möglich. Die Hierarchie der Elemente im Baum, entspricht der Hierarchie der Elemente im Report.

Schauen wir uns die Erstellung eines analogen Baumes mit Hilfe eines Scriptes und ohne die Nutzung der Eigenschaft OutlineText. Bereinigen wir die Eigenschaften OutlineText beider Bänder und erstellen zwei Bearbeiter der Ereignisse GroupHeader1.OnBeforePrint und MasterData1.OnBeforePrint:

PascalScript:

procedure GroupHeader1OnBeforePrint(Sender: TfrxComponent);

begin

Outline.LevelRoot;

Outline.AddItem(<Group."Company">);

end;

procedure MasterData1OnBeforePrint(Sender: TfrxComponent);

begin

Outline.AddItem(<Group."OrderNo">);

Outline.LevelUp;

end;

begin

end.

C++ Script:

void GroupHeader1OnBeforePrint(TfrxComponent Sender)

{

Outline.LevelRoot;

Outline.AddItem(<Group."Company">);

}

void MasterData1OnBeforePrint(TfrxComponent Sender)

{

Outline.AddItem(<Group."OrderNo">);

Outline.LevelUp;

}

{

}

Starten wir den Report und vergewissern uns, dass dieser analog dem vorherigen Report ist, in dem der Baum automatisch erstellt wurde. Sehen wir uns nun die Erstellung des Baumes an.

Die Methode Outline.AddItem fügt dem aktuellen Knoten im Baum, einen weiteren untergeordneten hinzu und macht ihn zum aktuellen. Ruft man AddItem ein paar mal auf, so erhält man eine „Treppe“ folgender Art

Item1

Item2

Item3

...

Zur Steuerung des aktuellen Elementes dienen „Outline LevelUp“ und „LevelRoot“. Die erste Methode verschiebt das Element eine Ebene höher. Das Script

Outline.AddItem('Item1');

Outline.AddItem('Item2');

Outline.AddItem('Item3');

Outline.LevelUp;

Outline.AddItem('Item4');

würde folgenden Baum erstellen.

Item1

Item2

Item3

Item4

Sprich, das Element Item4 wird dem Element Item2 untergeordnet. Die Methode LevelRoot verschiebt das aktuelle Element in die Wurzel. Hier ein Beispiel, das Script

Outline.AddItem('Item1');

Outline.AddItem('Item2');

Outline.AddItem('Item3');

Outline.LevelRoot;

Outline.AddItem('Item4');

würde folgenden Baum erstellen

Item1

Item2

Item3

Item4

Nach diesen Erklärungen sollte klar sein wie unser Report funktioniert. Jedesmal beim Druck des Gruppenkopfes wird die Wurzel zum aktuellen Element und der Unternehmensname eingefügt. Danach wird die Liste der Bestellungen gedruckt und jede Bestellung wird als untergeordnetes Element hinzugefügt. Damit die Bestellnummern auf einer Ebene liegen und nicht in Form einer „Treppe“ dargestellt werden. verschieben Sie diese im Script eine Ebene höher mit Hilfe von Outline.LevelUp.


Das Ereignis der Seite OnManualBuild

Normalerweise übernimmt die Erstellung des Reports der Kern von FastReport. Dieser führt die Bänder in einer bestimmten Reihenfolge aus und zwar solange es Daten gibt und bildet dadurch den fertigen Report. Manchmal ist es notwendig einen Report zu erstellen, welcher nicht die Standardform besitzt und deswegen nicht vom Kern FastReport gebildet werden kann. In diesem Fall kann man die Möglichkeit nutzen den Report manuell zu erstellen, durch Nutzung des auf der Seite enthaltenen Ereignisses OnManualBuild. Wenn man den Bearbeiter dieses Ereignisses definiert, so übergibt FastReport die Steuerung bei der Erstellung ihm. Gleichzeitig stellt der Kern die auf der Seite enthaltenen Bänder „Gruppenkopf“, „Spaltenkopf“, „Fuß“, „Seitenfuß“, „Spaltenfuß“ und „Background“ dar. Der Kern bearbeitet die Bildung neuer Seiten/Spalten. Die Aufgabe des Bearbeiters des Ereignisses OnManualBuild, ist die Ausführung der Datenbänder und deren Köpfe und Füße in einer bestimmten Reihenfolge.

Der Sinn des Bearbeiters OnManualBuild besteht darin, dem Kern von FastReport die Befehle zu Ausführung bestimmter Bänder zu geben. Alles andere erledigt der Kern selbstständig: die Bildung einer neuen Seite ( wenn die aktuelle endet), die Ausführung von Scripten, usw.

Demonstrieren wir das Ganze am Beispiel deines einfachen Bearbeiters. Der Report enthält zwei Bänder MasterData, diese sind nicht mit Daten verknüpft:

Der Bearbeiter wird diese Bänder je sechs mal ausführen und zwar abwechselnd. Nach sechs Bändern soll eine kleine Lücke sein.

PascalScript:

procedure Page1OnManualBuild(Sender: TfrxComponent);

var

i: Integer;

begin

for i := 1 to 6 do

begin

   { zeigen nacheinander zwei Bänder }

   Engine.ShowBand(MasterData1);

   Engine.ShowBand(MasterData2);

   { machen eine kleine Lücke }

   if i = 3 then

     Engine.CurY := Engine.CurY + 10;

end;

end;

C++ Script:

void Page1OnManualBuild(TfrxComponent Sender)

{

int i;

for (i = 1; i <= 6; i++)

{

   // zeigen nacheinander zwei Bänder

   Engine.ShowBand(MasterData1);

   Engine.ShowBand(MasterData2);

   // machen eine kleine Lücke

   if (i == 3)

     Engine.CurY = Engine.CurY + 10;

}

}

Das nächste Beispiel wird zwei Gruppen mit Bändern nebeneinander anzeigen.

PascalScript:

procedure Page1OnManualBuild(Sender: TfrxComponent);

var

i, j: Integer;

SaveY: Extended;

begin

SaveY := Engine.CurY;

for j := 1 to 2 do

begin

   for i := 1 to 6 do

   begin

     Engine.ShowBand(MasterData1);

     Engine.ShowBand(MasterData2);

     if i = 3 then

       Engine.CurY := Engine.CurY + 10;

   end;

   Engine.CurY := SaveY;

   Engine.CurX := Engine.CurX + 200;

end;

end;

C++Script:

void Page1OnManualBuild(TfrxComponent Sender)

{

int i, j;

Extended SaveY;

SaveY = Engine.CurY;

for (j = 1; j <= 2; j++)

{

   for (i = 1; i <= 6; i++)

   {

     Engine.ShowBand(MasterData1);

     Engine.ShowBand(MasterData2);

     if (i == 3)

       Engine.CurY = Engine.CurY + 10;

   }

   Engine.CurY = SaveY;

   Engine.CurX = Engine.CurX + 200;

}

}

Wie man an diesen Beispielen sehen kann, steuerten wir nur den Output der Datenbänder. Alle anderen Bänder (z. B. „Seitenkopf“ in unserem Beispiel) wurden automatisch gedruckt.

Jetzt werden wir einen Report „Kundenliste“ erstellen (diesen haben wir schon ein paar mal erstellt), wir nutzten dazu das Ereignis OnManualBuild. Hier verknüpfen wir das Datenband mit der Datenquelle.

Der Script des Ereignisses ist folgender:

PascalScript:

procedure Page1OnManualBuild(Sender: TfrxComponent);

var

DataSet: TfrxDataSet;

begin

DataSet := MasterData1.DataSet;

DataSet.First;

while not DataSet.Eof do

begin

   Engine.ShowBand(MasterData1);

   DataSet.Next;

end;

end;

C++Script:

void Page1OnManualBuild(TfrxComponent Sender)

{

TfrxDataSet DataSet;

DataSet = MasterData1.DataSet;

DataSet.First();

while (!DataSet.Eof)

{

   Engine.ShowBand(MasterData1);

   DataSet.Next();

}

}

Wenn wir den Report nun starten, sehen wir, das das Resultat sich nicht vom Standardreport unterscheidet. Beachten Sie wie der Link zu Dataset funktioniert. In unserem Beispiel haben wir das Band mit der Datenquelle verlinkt, deswegen wird die Zeile

DataSet := MasterData1.DataSet;

uns mit der Datenquelle verbinden. Den Link zu der benötigten Datenquelle kann man auch so erhalten:

DataSet := Report.GetDataSet('Customers');

Selbstverständlich muss die uns interessierende Quelle in dem Report hinzugefügt werden in „Report|Daten...“.


Das Erstellen von Objekten im Script

Durch Nutzung des Scripts kann man dem Report neue Objekte hinzufügen. Zeigen wir das an einem kleinen Beispiel. Wir erstellen einen neuen Report und fügen in die Hauptprozedur des Scripts folgendes ein:

PascalScript:

var

Band: TfrxReportTitle;

Memo: TfrxMemoView;

begin

Band := TfrxReportTitle.Create(Page1);

Band.Height := 20;

Memo := TfrxMemoView.Create(Band);

Memo.SetBounds(10, 0, 100, 20);

Memo.Text := 'This memo is created in code';

end.

C++ Script:

TfrxReportTitle Band;

TfrxMemoView Memo;

{

Band = TfrxReportTitle.Create(Page1);

Band.Height = 20;

Memo = TfrxMemoView.Create(Band);

Memo.SetBounds(10, 0, 100, 20);

Memo.Text = "This memo is created in code";

}

Wir starten den Report:

Beachten Sie das die Objekte des Reports nicht zerstört werden müssen. Dies ist nicht notwendig, da FastReport diese automatisch zerstört nachdem der Report fertig ist.


Kreuztabellen (Cross-tab Objekt)

Dieser Art des Report hat eine Tabellenstruktur, d.h. er besteht aus Zeilen und Spalten, wobei man nicht genau weiß wieviele Zeilen und Spalten enthalten sein werden. Deswegen wächst der Report nicht nur nach unten, wie die schon betrachteten Reporttypen, sondern auch zur Seite. Ein typisches Beispiel eines solchen Reportes sieht so aus:

Schauen wir uns die Elemente der Tabelle an:

In der Grafik sehen wir eine Tabelle mit zwei Zeilen und vier Spalten. Hier stellen a und b, die Zeilenbezeichnungen, 1,2,3,4 die Spaltenbezeichnungen und a1...a4, b1...b4 usw. die einzelnen Zellen dar. Um solch einen Report erstellen zu können benötigen wir nur einen Datensatz (die Anfrage oder Tabelle), welcher drei Felder und folgende Daten enthält:

a 1 a1

a 2 a2

a 3 a3

a 4 a4

b 1 b1

b 2 b2

b 3 b3

b 4 b4

Wie man sieht, enthält das erste Feld die Zeilennummer, das zweite die Spaltennummer und das dritte den Inhalt der Überkreuzung (Zeilen-, und Spaltennummer). Beim Erstellen des Reports konstruiert FastReport die Tabelle im Speicher und füllt diese mit Daten. Sollten die eingegebenen Zeilen-, Spaltennummern nicht vorhanden sein, so wird die Tabelle dynamisch vergrößert.

Die Spalten können mehr als nur eine Ebene haben. Betrachten wir folgendes Beispiel:

Hier besteht die Spaltennummer (Index) aus zwei Ebenen. Dieser Report benötigt folgende Daten:

a 10 1 a10.1

a 10 2 a10.2

a 20 1 a20.1

a 20 2 a20.2

b 10 1 b10.1

b 10 2 b10.2

b 20 1 b20.1

b 20 2 b20.2

Hier enthält das erste Feld wie vorhin die Zeilenbezeichnung, das zweite und dritte Feld den Spaltenindex. Das letzte Feld enhält den Inhalt der Zellen. Um zu verstehen wie FastReport eine Tabelle mit komplexen Spaltenbezeichnungen erstellt, betrachten wir folgende Grafik:

Unsere Tabelle sah vor dem Bearbeiten ungefähr so aus. Während der Bearbeitung verbindet FastReport die Spaltenköpfe und mit den Werten der entsprechenden Ebene.

Das folgende Element der Tabelle zeigt Zwischenergebnisse und Endergebnisse an, wie die folgende Grafik zeigt:

Dieser Report wird mit denselben Datenerstellt wie der vorhergehende. Die grauen Spalten in der Grafik werden automatisch berechnet.


Die Erstellung einer Kreuztabelle (Cross-tab Objekt)

Gehen wir von der Theorie zur Praxis über. Erstellen wir eine einfache Kreuztabelle. Diese soll das Gehalt der Mitarbeiter für die letzten vier Jahre anzeigen. Wir benötigen dafür die Tabelle „crosstest“, welche im Ordner FastReport DEMOS\MAIN enthalten ist. Die Tabelle enthält folgende Daten:

Name Year Salary

Ann 1999 3300

Ben 2002 2000

….

Wie üblich erstellen wir ein neues Projekt in Delphi. In die Form fügen wir die Komponenten TTable, TfrxDBDataSet, TfrxReport ein und stellen diese wie folgt ein:

Table1:

DatabaseName = 'c:\Program Files\FastReports\FastReport 3\Demos\Main'

TableName = ' crosstest.db'

Selbstverständlich muss der Wert der Eigenschaft DatabaseName, dem Pfad zu Ihrem Ordner FastReport entsprechen!

frxDBDataSet1:

DataSet = Table1

UserName = 'SimpleCross'

Um Kreuztabellen konstruieren zu können, müssen Sie die Komponente TfrxCrossObject [image] aus dem Satz der FastReport Komponenten verwenden. Legen Sie diese einfach auf die Seite, man muss nichts einstellen. In die Liste "uses" Ihres Projektes wird das Modul frxCross hinzugefügt, dieses besitzt alle benötigten Funktionalitäten.

Gehen wir in den Reportdesigner. Als erstes verknüpfen wir die Datenquelle im Menü „Report|Daten...“. Auf das Blatt legen wir nun das Objekt „Datenbank Cross-tab Objekt“ 159 :

Alle Einstellungen werden mit dem Editor des Objektes gemacht. Diesen rufen wir über den Doppelklick auf:

Screenshot - 18.05.2009 , 16_56_20

Die Zahlen bedeuten:

1 – Drop-Down-Leste der vorhandenen Datenquellen;

2 – die Liste der Felder in der Datenquelle; Diese können nach 3, 4, 5 rübergezogen werden;

3 – die Liste der Felder, die die Kopfzeile darstellen werden;

4 – die Liste der Felder, die die Spaltenüberschriften darstellen werden;

5 – die Liste der Felder, die die Zellen der Tabellen darstellen werden;

6 – hier wird die Struktur der zukünftigen Tabelle angezeigt;

7 – die Objekteinstellungen.

Wie man sieht wird hier nur mit der Maus gearbeitet. In unserem Fall werden nur die Felder aus Liste 2 in die Listen 3, 4, 5 rübergezogen. Mehr machen wir fürs erste nicht und schließen den Editor mit OK. Jetzt sehen wir, dass das Objekt diese Struktur auf der Reportseite annimmt:

Wenn wir den Report nun starten, erscheint folgendes:


Aussehen der Tabelle

Fahren wir fort das Objekt näher kennenzulernen. Als erstes sollten wir die Farbe der Überschriften ändern und die englischen Bezeichnungen ins deutsche übersetzen. Dies ist ganz einfach. Um die Farbe zu wechseln, klicken Sie auf „Year“, „Name“, „Grand Total“ und wählen die benötigte Farbe mit [image] auf dem Instrumentenpanell aus. Folgendes sollte passieren:

Man kann auich vorgefertigte Stile verwenden. Hierfür gehen Sie in den Objekteditor und klicken auf den Button „Stil auswählen“:

Um den Text der Überschriften zu ändern, klicken Sie doppelt auf die Zelle. Es erscheint der uns bekannte Texteditor, hier wählen wir den gewünschten Text. Danach sieht unser Objekt so aus:

Jetzt müssen wir nur noch das Format eingeben, in welchem die Werte angezeigt werden sollen. Dazu klicken Sie auf die erste Zelle (wo sich Year und Name kreuzen) und rufen das Kontextmenü mit einem Rechtsklick der Maus. Dann wählen Sie „Formatieren...“.

Hier wählen Sie das benötigte Format:


Die Verwendung von Funktionen

In unserem Beispiel haben wir in der Zeile „Summe“ das Gehalt der letzten vier Jahre. Außer der Summe kann man folgende Funktionen verwenden:

MIN – Minimaler Wert

MAX – maximaler Wert

AVG – Mittelwert

COUNT – Anzahl der Werte

Lassen Sie uns die Funktion Min ausprobieren. Öffnen wir den Editor des Cross-Tab Objektes und klicken auf das Feld „Salary“ im Bereich der Drop-Down-Liste.

Wählen Sie im Menü die Funktion MIN aus. Jetzt können Sie den Text der Zelle von „Summe“ in „Minimum“ abändern. Der Report sieht nun wie folgt aus:


Sortieren der Werte

Standardmäßig sind die Werte der Zeilen und Spalten aufsteigend sortiert. Handelt es sich dabei um Zahlen so werden diese der Höhe nach sortiert. Bei Text verwendet man die alphabetische Reihenfolge. Das Sortieren kann für jede Zeile und Spalte separat eingestellt werden. Folgende Arten der Sortierung sind möglich: aufsteigend, absteigend oder keine Sortierung. Im letzten Fall werden die Werte der Zeilen/Spalten so angezeigt, wie sie eingetragen werden.

Ändern wir die Sortierung der Spalten in unserem Beispiel. Die Jahre sollen absteigend sortiert werden. Wir gehen in den Editor des Cross-tab Objektes und wählen das Spaltenelement „Year“ aus und klicken, um die Sortierung zu ändern, auf den Pfeil nach unten:

Danach schließen wir den Editor und starten den Report. Dieser sieht jetzt wie folgt aus:


Tabelle mit zusammengesetzten Kopfzeilen

Unser vorhergehendes Beispiel enthielt nur einen Wert im Spaltenkopf bzw. Zeilenkopf. Betrachten wir nun am Beispiel, die Erstellung einer Tabelle welche zusammengesetzte Kopfzeilen besitzt (zwei und mehr Überschriften). Die Tabelle enthält folgende Daten:

Name Year Month Days Salary

Ann 1999 2 3 1000

Ben 2002 1 5 2000

….

Es sind zwei Felder hinzugekommen – Month und Days. Diese enthalten die Monatsnummer und die Tage an denen gearbeitet worden ist. Mit diesen Daten kann man schon einige Reporte erstellen z. B. das Gehalt der Mitarbeiter für die Jahre mit der Monatseinteilung.

Welches Aussehen soll unser Report besitzen? Er soll ähnlich dem Report aus dem vorherigen Beispiel sein, aber zusätzlich eine Monatseinteilung der Jahre besitzen. Deswegen stellen wir das „Cross-tab Objekt“ auf die selbe Weise ein und fügen in den Spaltenkopf das Feld „Month“ hinzu:

Screenshot - 18.05.2009 , 17_04_37

Falls gewünscht, kann man die Farben ändern und die englischen Ausdrücke "Grand total" und "Total" durch "Summe" ersetzen. Wir erhalten folgenden Report:

Beachten Sie, dass FastReport automatisch eine Spalte mit der Zwischensumme eines jeden Jahres eingefügt hat. Diese Option ist über den Editor des Cross-tab Objekts erreichbar. Man markiert das Element "Year" in der Spalte und setzt/entfernt das Häkchen bei "Zwischensumme":

Screenshot - 18.05.2009 , 17_05_52

Ebenfalls kann man erwähnen, dass das Zwischenergebnis beim untersten Element der Spalte fehlt (auch falls es das einzige Element ist). In unserem Beispiel sind die Zwischenergebnisse nach jedem Monat nicht nötig.

Betrachten wir eine weitere Möglcihkeit der Darstellung der Zwischenergebnisse. In unserem Beispiel wäre es besser statt „Summe“ die Überschrift „Summe für 2000“. Dies ist einfach: markieren Sie das gewünschte Objekt und schreiben Sie folgenden Text rein:

Summe für [Value]

Bei der Erstellung wird der Ausdruck "Value" durch den Wert aus der darüberliegenden Kopfzeile ersetzt:


Zellengröße

Zellengro?e

In der vorhergehenden Grafik sieht man, dass FastReport automatisch die Breite der Zellen anpasst und zwar so, das die längsten Zeilen reinpassen. In manchen Fällen ist das nicht erwünscht, da bei sehr langen Zeilen das Aussehen der Tabelle darunter leidet. Was kann man in solch einen Fall machen? Betrachten wir drei Beispiele der Steuerung der Größenanpassung der Zellen.

Die erste Variante ist es, einen Bruch der Zeile in den Text des Objektes mit den Zwischenergebnissen einzusetzen, d.h. eine Zeile einfügen:

Summe

für [Value]

Wir sehen die Tabelle sieht jetzt viel besser aus:

Diese Methode kann man aber auch nicht immer verwenden, da die Werte der Zeilen/Spalten auch zu lang sein können und die Trennung nicht im nachhinein manuell eingefügt werden kann. Die zweite Methode, ist die Nutzung der Eigenschaften MinWidth und MaxWidth (minimale und maximale Breite der Zellen selbst). Beide Eigenschaften sind nur über den Objektinspektor erreichbar.

Standardmäßig ist der Wert MinWidth = 0 und MaxWidth = 200. Dies ist in den meisten Fällen ausreichend. Sie können diese jedoch verändern, falls an die Tabellen besondere Ansprüche gestellt werden.

In unserem Beispiel kann man MinWidth = MaxWidth = 50 eingeben, d.h. die Breite der Zelle soll in jedem Fall 50 Pixel betragen. Ist die Zelle kleiner, so wird sie auf diese Breite gedehnt. Ist sie größer, so richtet sie sich nach MaxWidth aus und der Text wird mit einzelnen Wörtern übertragen. Was so aussieht:

Jetzt die dritte Methode, in welcher man selbstständig die benötigten Maße einstellt. Hierfür deaktivieren wir die Eigenschaft "Größe automatisch" im Objekteditor (AutoSize im Inspektor). Jetzt können die Maße der Elemente in der Tabelle manuell verändert werden. Dazu ziehen Sie die Maus über die einzelnen Elemente, der Mauszeiger ändert dabei seine Form und erlaubt die Höhe und Breite zu ändern. Hier ein Beispiel dazu:

Beachten Sie, dass das Deaktivieren der Eigenschaft "Größe automatisch" dazu führt, dass die Maße der Zellen nicht mehr automatisch angepasst werden. Falls Sie die Breite der Zelle zu klein einstellen, so wird der Text einfach abgeschnitten:

Sollte dies passieren, erhöhen Sie die Maße der betroffenen Zellen.


Farbliche Hervorhebung der Werte

Oft ist es notwendig bestimmte Werte in einer anderen Farbe der Schrift oder des Hintergrunds darzustellen. Wir hatten schon eine ähnliche Aufgabe, betrachtet am Beispiel des Reportes mit Gruppen. Damals verwendeten wir das Hervorheben unter bestimmten Bedingungen des Objektes „Text“. Dies wollen wir auch jetzt anwenden.

Betrachten wir das Hervorheben an unserem Beispiel. Gehen wir davon aus das ein Wert über 3000 in roter Schrift dargestellt werden muss. Wir klicken auf das Objekt das die Tabellenzelle darstellt und drücken auf den Button [image] auf den Instrumentenpanell. Es öffnet sich der Editor der Hervorhebung und hier trägt man folgende Bedingung ein:

Value > 3000

Screenshot - 18.05.2009 , 17_10_33

Mehr braucht man nicht. Schließen wir den Editor mit OK und starten den Report:

Falls nötig, kann man auf diese Weise die Spalten-/Zeilensummen hervorheben.


Steuerung der Kreuztabelle aus dem Script

Falls die visuellen Möglichkeiten der Tabelleneinstellungen nicht ausreichen, kann man das Script nutzen, um Feineinstellungen des Tabellenäußeren vorzunehmen. Das „Cross-tab Objekt“ besitzt folgende Ereignisse:

Ereignis | Beschreibung
OnAfterPrint | Ereignis wird nach dem Druck der Tabelle aufgerufen.
OnBeforePrint | Ereignis wird vor dem Druck der Tabelle aufgerufen.
OnCalcHeight | Ereignis wird vor dem Berechnen der Zeilenhöhe der Tabelle aufgerufen. Der Bearbeiter des Ereignisses gibt die eingegebene Höhe wieder oder 0 um die Zeile zu verbergen.
OnCalcWidth | Ereignis wird vor dem Berechnen der Spaltenbreite der Tabelle aufgerufen. Der Bearbeiter des Ereignisses gibt die eingegebene Breite wieder oder 0 um die Spalte zu verbergen.
OnPrintCell | Ereignis wird vor dem Anzeigen der Zellen der Tabelle aufgerufen. Der Bearbeiter kann das Format und den Inhalt ändern.
OnPrintColumnHeader | Ereignis wird vor dem Anzeigen der Spaltenköpfe der Tabelle aufgerufen. Der Bearbeiter kann das Format und den Inhalt der Spaltenköpfe ändern.
OnPrintRowHeader | Ereignis wird vor dem Anzeigen der Zeilenköpfe der Tabelle aufgerufen. Der Bearbeiter kann das Format und den Inhalt der Zeilenköpfe ändern.

In den Ereignissen kann man folgende Methoden des "Cross-tab Objektes verwenden":

Methode | Beschreibung
function ColCount: Integer | Zählt die Anzahl der Spalten in der Tabelle.
function RowCount: Integer | Zählt die Anzahl der Zeilen in der Tabelle.
function IsGrandTotalColumn (Index: Integer): Boolean | Zeigt True an, falls die angegebene Spalte eine Summenspalte ist.
function IsGrandTotalRow (Index: Integer): Boolean | Zeigt True an, falls die angegebene Zeile eine Summenzeile ist.
function IsTotalColumn (Index: Integer): Boolean | Zeigt True an, falls die angegebene Spalte eine Spalte mit Zwischensummen ist.
function IsTotalRow (Index: Integer): Boolean | Zeigt True an, falls die angegebene Zeile eine Zeile mit Zwischensummen ist.
procedure AddValue(const Rows, Columns, Cells: array of Variant) | Fügt einen Wert in die Tabelle ein.

Betrachten wir am Beispiel, wie man den Hintergrund der dritten Spalte hervorheben kann (in unserem Beispiel sind es die Daten des November 1999). Wir markieren die Kreuztabelle und erstellen den Bearbeiter des Ereignisses OnPrintCell:

Pascal script:

procedure Cross1OnPrintCell(Memo: TfrxMemoView;

RowIndex, ColumnIndex, CellIndex: Integer;

RowValues, ColumnValues, Value: Variant);

begin

if ColumnIndex = 2 then

   Memo.Color := clRed;

end;

C++ Script:

void Cross1OnPrintCell(

TfrxMemoView Memo,

int RowIndex,

int ColumnIndex,

int CellIndex,

Variant RowValues,

Variant ColumnValues,

Variant Value)

{

if (ColumnIndex == 2) { Memo.Color = clRed; }

}

Wir erhalten folgendes Ergebnis:

Um den Spaltenkopf hervorzuheben, erstellen wir einen Bearbeiter des Ereignisses OnPrintColumnHeader:

Pascal script:

procedure Cross1OnPrintColumnHeader(Memo: TfrxMemoView;

HeaderIndexes, HeaderValues, Value: Variant);

begin

if (VarToStr(HeaderValues[0]) = '1999') and

   (VarToStr(HeaderValues[1]) = '11') then

   Memo.Color := clRed;

end;

C++ Script:

void Cross1OnPrintColumnHeader(

TfrxMemoView Memo,

Variant HeaderIndexes,

Variant HeaderValues,

Variant Value)

{

  if ((VarToStr(HeaderValues[0]) == "1999") &&

     (VarToStr(HeaderValues[1]) == "11"))

{

   Memo.Color = clRed;

}

}

Das Resultat:

Klären wir die Arbeitsweise der Scripte. Der Bearbeiter des Ereignisses OnPrintCell wird vor dem Druck der Zelle, welche in der Tabelle ist, aufgerufen. Beim Druck der Zellen der Spaltenköpfe der Tabelle werden die Bearbeiter OnPrintColumnHeader oder OnPrintRowHeader aufgerufen. Dazu wird in den Bearbeiter OnPrintCell ein Link zum Objekt „Text“ erstellt. Dieser stellt die Zellen der Tabelle (Parameter Memo) und die Adresse der Zellen in zwei Varianten dar: Zeilen-, Spalten-, Zellennummer (die letzte aktuell, falls Sie in der Tabelle Zellen mit mehreren Ebenen haben) in Parametern RowIndex, ColumnIndex, CellIndex entsprechend. Die zweite Variante der "Adresse", sind die Parameter RowValues und ColumnValues. Das Parameter Values stellt den Inhalt der Zelle dar.

Um eine „Adresse“ zu spezifizieren, können Sie sowohl die erste Variante (RowIndex, ColumnIndex), als auch die zweite Variante (RowValues, ColumnValues) verwenden. Diese ist in unserem Beispiel besser. Wir wollten in unserem Fall die dritte Spalte hervorheben, deswegen analysieren wir am besten die erste Variante. Da die Nummerierung der Spalten und Zeilen bei 0 beginnt, hilft die Überprüfung ColumnIndex = 2 uns, die dritte Spalte zu ermitteln. Man kann auch anders vorgehen und die Spalte anhand der Daten ermitteln (wir benötigen den 11 Monat 1999):

Pascal script:

procedure Cross1OnPrintCell(Memo: TfrxMemoView;

RowIndex, ColumnIndex, CellIndex: Integer;

RowValues, ColumnValues, Value: Variant);

begin

if (VarToStr(ColumnValues[0]) = '1999') and

   (VarToStr(ColumnValues[1]) = '11') then

   Memo.Color := clRed;

end;

C++ Script:

void Cross1OnPrintCell(

TfrxMemoView Memo,

int RowIndex,

int ColumnIndex,

int CellIndex,

Variant RowValues,

Variant ColumnValues,

Variant Value)

{

if ((VarToStr(ColumnValues[0]) == "1999") &&

    (VarToStr(ColumnValues[1]) == "11"))

{

   Memo.Color = clRed;

}

}

Die Werte, die in den Parametern RowValues und ColumnValues sind Reihen des Types „Variant“ mit einer Nullbasis. Das Nullelement ist der Wert der obersten Ebene im Tabellenkopf, das erste Element der Wert der nächsten Ebene usw. In unserem Fall ist ColumnValues[0] die Jahre und ColumnValues[1] die Monate.

Wozu benötigt man VarToStr? Dies garantiert die Fehlerfreiheit bei der Konvertierung der Typen. Bei Operationen des Typs Variant versucht FastReport die Zeilen automatisch im Format „Zahl“ darzustellen. In unserem Fall würde das zu einem Fehler führen, wenn die Werte der Spalten 'Total' und 'Grand Total' angezeigt werden sollen.

Der Bearbeiter des Ereignisses OnPrintColumnHeader wird beim Druck der Zellen des Spaltenkopfes aufgerufen. Die Auswahl der Parameter ist ähnlich der Bearbeiter OnPrintCell, hier jedoch wird die „Adresse“ der Zelle (Parameter HeaderIndexes, HeaderValues) anders transferiert. Der Parameter HeaderValues zeigt dieselben Werte wie die Parameter ColumnValues und RowValues im Bearbeiter OnPrintCell. Der Parameter HeaderIndexes ist ebenfalls eine Reihe des Types Variant und enthält die „Adresse“ der Zelle des Kopfes in einer anderen Form. Das Nullelement ist die Reihennummer der obersten Ebene, das erste Element die Nummer der nächsten Ebene usw. Das Prinzip der Nummerierung der Zellen wird verständlich, wenn man die Grafik betrachtet:

In unserem Beispiel ist es einfacher die Werte HeaderValues zu analysieren, aber man kann auch den folgenden Bearbeiter schreiben:

Pascal script:

procedure Cross1OnPrintColumnHeader(Memo: TfrxMemoView;

HeaderIndexes, HeaderValues, Value: Variant);

begin

if (HeaderIndexes[0] = 0) and (HeaderIndexes[1] = 2) then

   Memo.Color := clRed;

end;

C++ Script:

void Cross1OnPrintColumnHeader(

TfrxMemoView Memo,

Variant HeaderIndexes,

Variant HeaderValues,

Variant  Value)

{

if ((HeaderIndexes[0] == 0) && (HeaderIndexes[1] == 2)) { Memo.Color = clRed; }

}

Mit Hilfe der Bearbeiter der Ereignisse OnCalcWidth und OnCalcHeight kann man die Breite und Höhe der Zeilen/Spalten steuern. Zeigen wir das an einem Beispiel: wir vergrößern die Breite der Spalte, welche 11 Monat 1999 entspricht. Hierfür erstellen wir Bearbeiter des Ereignisses OnCalcWidth:

Pascal script:

procedure Cross1OnCalcWidth(ColumnIndex: Integer;

ColumnValues: Variant; var Width: Extended);

begin

if (VarToStr(ColumnValues[0]) = '1999') and

   (VarToStr(ColumnValues[1]) = '11') then

   Width := 100;

end;

C++ Script:

void Cross1OnCalcWidth(

int ColumnIndex,

variant ColumnValues,

Extended &Width)

{

if ((VarToStr(ColumnValues[0]) == "1999") &&

   (VarToStr(ColumnValues[1]) = "11"))

   {

     Width = 100;

   }

}

Das Resultat:

Um die Spalte zu verbergen, reicht es aus Width := 0 einzustellen. Beachten Sie, dass die Summen nicht neu berechnet werden, da die Matrix schon mit Werten gefüllt worden ist.


Farbliche Hervorhebung der Werte

Manuelles Ausfullen der Tabelle

The user can adjust width and height of the table’s rows and columns using the “OnCalcWidth” and “OnCalcHeight:” events’ handlers. Let us show how to increase width of the column, which corresponds to the 11th month of 1999 by the following example. To do this, create the “OnCalcWidth” event’s handler:

Pascal script:

procedure Cross1OnCalcWidth(ColumnIndex: Integer;

ColumnValues: Variant; var Width: Extended);

begin

if (VarToStr(ColumnValues[0]) = '1999') and

(VarToStr(ColumnValues[1]) = '11') then

Width := 100;

end;

C++ Script:

void Cross1OnCalcWidth(

int ColumnIndex,

variant ColumnValues,

Extended &Width)

{

if ((VarToStr(ColumnValues[0]) == "1999") &&

(VarToStr(ColumnValues[1]) = "11"))

{

Width = 100;

}

}

And the result would appear as follows:

In our example, to hide a column, it is enough to return the Width := 0. Note, that the sums are not recalculated at the same time, since the matrix is already full of values at this time.


Manuelles Ausfüllen der Tabelle

Manuelles Ausfullen der Tabelle

Wie wir bereits wissen, gibt es 2 Arten der Kreuztabelle: die Objekte "Datenbank Cross-tab Objekt" und "Cross-tab Objekt" Bis jetzt haben wir nur mit dem ersten Objekt gearbeitet. Dieses wird an die Daten der DB-Tabelle geknüpft und wird beim Start des Reports automatisch mit Daten gefüllt. Betrachten wir nun das zweite Objekt "Cross-tab Objekt".

Dieses Objekt ist nicht mit Daten der Datenbank verknüpft. Sie müssen diese selber in die Tabelle eintragen. Das Objekt hat einen ähnlichen Editor, hier wählen Sie aber die Anzahl Zeilen, der Spalten und der Zellen:

Screenshot - 18.05.2009 , 17_15_14

Betrachten wir die Arbeit mit dem Objekt „Cross-tab“ am Beispiel. Wir legen auf das Blatt des Reportes das Objekt und stellen die Eigenschaften wie in der folgenden Grafik ein: die Anzahl der Ebenen im Zeilenkopf – 1, im Spaltenkopf – 2, in Zellen – 1. Um die Tabelle mit Daten zu füllen, nutzen wir den Bearbeiter des Ereignisses OnBeforePrint des Objektes:

PascalScript:

procedure Cross1OnBeforePrint(Sender: TfrxComponent);

begin

with Cross1 do

begin

   AddValue(['Ann'], [2001, 2], [1500]);

   AddValue(['Ann'], [2001, 3], [1600]);

   AddValue(['Ann'], [2002, 1], [1700]);

   AddValue(['Ben'], [2002, 1], [2000]);

   AddValue(['Den'], [2001, 1], [4000]);

   AddValue(['Den'], [2001, 2], [4100]);

end;

end;

C++ Script:

void Cross1OnBeforePrint(TfrxComponent Sender)

{

Cross1.AddValue(["Ann"], [2001, 2], [1500]);

Cross1.AddValue(["Ann"], [2001, 3], [1600]);

Cross1.AddValue(["Ann"], [2002, 1], [1700]);

Cross1.AddValue(["Ben"], [2002, 1], [2000]);

Cross1.AddValue(["Den"], [2001, 1], [4000]);

Cross1.AddValue(["Den"], [2001, 2], [4100]);

}

Im Bearbeiter ist es notwendig die benötigten Daten mit Hilfe der Methode TfrxCrossView.AddValue einzufügen. Diese Methode besitzt drei Parameter und jedes ist eine Reihe des Types Variant. Der erste Parameter, ist der Wert der Zeile, der zweite der Wert der Spalte und der dritte stellt den Wert der Zellen dar. Beachten Sie, dass die Anzahl der Werte in jeder Reihe der Einstellungen des Objektes entsprechen muss! In unserem Beispiel besitzt das Objekt eine Ebene im Kopf der Zeilen, zwei Ebenen im Kopf der Spalten und eine Ebene in den Zellen. Entsprechend fügen wir in AddValue einen Wert für die Zeilen, zwei Werte für die Spalten und einen Wert für die Zellen hinzu.

Starten wir den Report, sehen wir nun folgendes:

Die Methode AddValue kann man genauso verwenden für das Objekt " Datenbank Cross-tab Objekt“. Dadurch kann man in die Kreuztabelle Daten eintragen, die nicht in der verknüpften Datenquelle vorhanden sind. Sind die Daten vorhanden, so werden diese hinzuaddiert.


Hinzufügen von Objekten in die Tabelle

In die Tabelle können zusätzliche Objekte eingefügt werden. Wozu braucht man das? Man kann z. B. bestimmte Werte in den Zellen damit grafisch hervorheben. Zwar kann man dazu auch das Hervorheben unter bestimmten Bedingungen verwenden, aber das reicht nicht immer aus.

Betrachten wir ein Beispiel. Jeder Wert in den Zellen soll zusätzlich einen kleinen Balken erhalten, welcher die Höhe des Gehaltes anzeigt. Wir erhalten folgendes:

In rot werden Werte unter 100 angezeigt, in gelb die weniger 3000 und in grün die Werte über 3000.

Fangen wir mit der Erstellung des Reports an. Legen wir das Objekt "Datenbank Cross-tab Objekt" auf das Blatt und stellen es wie folgt ein:

Screenshot - 18.05.2009 , 17_16_48

Jetzt stellen wir das Erscheinungsbild ein. Hierzu wählen wir eine Farbe für die Köpfe, ändern die englischen Bezeichnungen in deutsche (Gehalt, Mitarbeiter, Jahr, Summe) und deaktivieren die Eigenschaft "Größe automatisch" (AutoSize). Als Resultat erhalten wir folgende Tabelle:

Nun fügen wir die Elemente in die Tabelle ein, die den Balken darstellen sollen. Wählen Sie "Zeichnen/Rechteck" im Objektenpanell aus und legen diesen in die Zelle:

Screenshot - 18.05.2009 , 17_20_22

Jetzt erstellen wir ein Script, das die nötige Anzahl der Rechtecke einfügt und diese in der gewünschten Farbe anzeigt. Wählen Sie die Zelle an und erstellen einen Bearbeiter des Ereignisses OnBeforePrint:

Im Bearbeiter schreiben wir folgendes (beachten Sie Objektbezeichnungen, die Objekte in der Tabelle haben genau die Namen):

procedure DBCross1Cell0OnBeforePrint(Sender: TfrxComponent);

begin

// Value - aktueller Wert der Zelle

if Value < 100 then

begin

   // das ist das erste Objekt

   DBCross1Object1.Color := clMaroon; // rot

   // das ist das zweite Objekt

   DBCross1Object2.Color := clWhite;

   // das ist das dritte Objekt

   DBCross1Object3.Color := clWhite;

end

else if Value < 3000 then

begin

   DBCross1Object1.Color := $00CCFF;  // gelb

   DBCross1Object2.Color := $00CCFF;

   DBCross1Object3.Color := clWhite;

end

else

begin

   DBCross1Object1.Color := $00CC98;  // grün

   DBCross1Object2.Color := $00CC98;

   DBCross1Object3.Color := $00CC98;

end;

end;

Wenn wir den Report nun starten, sehen wir die am Anfang gezeigte Tabelle.


Weitere nützliche Einstellungen

Betrachten wir weitere Tabelleneinstellungen, die uns nützlich sein können. Alle diese Einstellungen sind im Editor des Objektes erreichbar.

Screenshot - 18.05.2009 , 17_22_43

Die obere Gruppe der Einstellungen zeigt oder verbirgt verschiedene Elemente der Tabelle.

Die Option "Größe automatisch" haben wir schon kennen gelernt. Diese deaktiviert die automatische Anpassung der Tabelle und erlaubt die manuelle Einstellung.

Die Option "Umrandung der Zellen" fügt äußere Rahmenlinien den Zellen hinzu. Man kann damit einen Rahmen um den kompletten Zellenblock machen (nicht um die Tabelle!). Hier ein Beispiel (alle Rahmenlinien, bis auf den äußeren Rahmen, sind deaktiviert):

Die Option "Druckrichtung erst nach unten, dann gegenüber" steuert die Verteilung einer großen Tabelle auf mehrere Seiten. Hier ein Beispiel einmal mit der aktivierten Option und einmal ohne (beachten Sie die Nummerierung der Seiten).

1) " Druckrichtung erst nach unten, dann gegenüber " - aktiviert:

2) " Druckrichtung erst nach unten, dann gegenüber " - deaktiviert:

Die Option "Kopf auf neuer Seite wiederholen" bestimmt, ob die Köpfe der Tabelle auf jeder neuen Seite der Tabelle gedruckt werden sollen.

Die Option "Zellen Seite an Seite" wird verwendet, wenn in der Zelle mehrere Ebenen vorhanden sind. Die Option bestimmt, ob die Zellen nebeneinander gedruckt werden sollen (in einer Zeile) oder untereinander.

Die Option "Verbinde gleiche Zellen" erlaubt zwei oder mehr Zellen in einer Zeile zusammenzufassen, wenn sie dieselben Werte haben. Hier ein Beispiel:

Weitere Einstellungen sind im Objektinspektor enthalten:

- AddWidth, AddHeight – der freie Platz der hinzugefügt wird beim Berechnen der Zellenmaße. Diese Eigenschaft vergrößert die Zelle auf die gewünschten Maße. Die Eigenschaft AutoSize muss gleich True sein;

- NextCross – Hinweis zum nächstem "Cross-tab Objekt", wird rechts neben den Tabellendaten angezeigt;

- NextCrossGap – der Abstand zwischen zwei Tabellen.


Grafiken, Diagramme

FastReport erlaubt es in den Report Diagramme einzufügen. Man verwendet dafür die Komponente TfrxChartObject [image] aus den Komponenten von FastReport. Die Komponente basiert auf der Bibliothek TeeChart, welche im Komplekt Delphi enthalten ist. Ebenfalls kann die Bibliothek TeeChartPro verwendet werden, diese muss separat besorgt werden.

Betrachten wir die Erstellung eines einfachen Diagramms am Beispiel. Dazu benötigen wir die Tabelle country aus dem Komplekt der Demonstrationsdatenbank DBDEMOS. Die Tabelle enthält Daten über ein Land, dessen Fläche und Bevölkerung.

Name Area Population

Argentina 2 777 815 32 300 003

Bolivia 1 098 575 7 300 000

….

Erstellen wir ein neues Projekt in Delphi. Wir legen auf die Form die Komponenten TTable, TfrxDBDataSet, TfrxReport und stellen diese wie folgt ein:

Table1:

DatabaseName = 'DBDEMOS'

TableName = 'coutry.db'

frxDBDataSet1:

DataSet = Table1

UserName = 'Country'

Wir öffnen den Reportdesigner und verknüpfen ihn mit der Datenquelle im Fenster "Report|Daten…". Auf das Blatt legen wir das Objekt „Diagram“ [image] . Die Maße des Objektes setzen wir auf 18ő8 cm. Um die Einstellungen des Objektes verändern zu können, rufen wir den Editor mit einem Doppelklick der Maus auf.

Screenshot - 18.05.2009 , 17_55_50

Die Zahlen in der Grafik bedeuten:

1 – Diagrammstruktur. Das Diagramm kann eine oder mehrere Serien (series) enthalten.

2 – Objektinspektor. Dieser zeigt die Eigenschaften des gewählten 1 Elementes an. Auf diese Weise können die Feineinstellungen der Eigenschaften vorgenommen werden.

3 – das Panell der Vernüpfung der Daten und der Serie, zugänglich nach Auswahl einer Serie im Fenster 1.

Beim ersten Start des Editors sieht das Fenster wie oben dargestellt aus. Das erste was gemacht werden muss, ist das Zufügen einer oder mehrerer Serien (in unserem Beispiel nur eine). Klicken Sie dazu auf den Button [image] und wählen aus der Drop-Down-Liste das Kreisdiagramm (Pie):

Nach dem Hinzufügen der Serie, ist das Panell 3 aktiviert worden. Hier muss eingegeben werden welche Daten bei der Diagrammerstellung verwendet werden sollen. Als erstes wählen wir den Datensatz aus der Drop-Down-Liste „Datensatz“. Die Felder "Label" und "Pie" füllen wir auf folgende Weise (diese können ebenfalls über die Drop-Down-Listen gewählt werden):

Screenshot - 18.05.2009 , 17_50_42

Die Buttons mit den Pfeilen nach oben und nach unten erlauben es die Serie des Diagrams zu verschieben und geben die Reihenflge der Darstellung vor. Falls nötig kann man den Namen der Serie über einen Klick darauf eingeben.

In unserem Beispiel (mit dem Kreisdiagramm) werden die Werte "Label" für die Beschriftungen verwendet. Für die Erstellung des Diagrames selber werden nur die Werte "Pie" verwendet. Man kann ebenfalls in "Color" für jedes „Stück“ des Diagramms die gewünschte Farbe einstellen.

Beenden wir erstmal die Konfiguration und schließen den Editor mit dem Button OK. Nun starten wir den Report:

Was könnte man in diesem Report besser machen? Als erstes wäre es gut die Sortierung absteigen einzustellen. Wir öffnen den Editor des Diagramms erneut und wählen die Serie oben im Fenster aus. Nun müssen wir die Art der Sortierung auswählen:

Screenshot - 18.05.2009 , 17_53_54

Wenn wir den Report wieder starten sehen wir, dass die Daten in der Tabelle durchsortiert worden sind.


Begrenzung der Anzahl der Werte im Diagramm

Unser Diagramm sieht überfüllt aus. Zu viele kleine Werte, die im Diagramm sowieso nicht zu sehen sind. Mit FastReport kann man die Mengen der Werte im Diagramm beschränken. Dabei werden alle Werte die nicht eine bestimmte Bedingung erfüllen, zu einem Wert zusammengefasst. Dieser Wert wird dann als Summe angezeigt.

In unserem Beispiel hat das Diagramm 18 Werte, wir wollen nur 8 davon darstellen. Öffnen wir den Editor und geben die Beschränkung ein:

Screenshot - 18.05.2009 , 17_57_29

Die Begrenzung wird arbeiten, wenn das Feld "ErsteN Werte" ungleich null ist. Im Feld "ErsteN Beschriftung" muss der Name eingetragen werden, welche gegenüber der Summe stehen soll. Die Art der Sortierung spielt keine Rolle, diese ist absteigend.

Das Resultat sieht so aus:


Weitere nützliche Einstellungen

Weitere nutzliche Einstellungen

Betrachten wir weitere Einstellungen, die uns dabei helfen das Erscheinungsbild des Diagramms zu gestalten. Diese Einstellungen kann man nur im Objektinspektor durchführen.

Folgende Grundeigenschaften sind beim Anwählen des Diagramms in der Liste oben anwähbar:

- Gradient – Einstellungen für die steigende Hintergrundfüllung. Um diesen anzuzeigen, aktivieren Sie Gradient.Visible.

- Legend – Einstellungen des Aussehens der Legende. Wird über Legend.Visible deaktiviert. Verschieben kann man sie über Legend.Alignment.

Haben Sie eine Serie ausgewählt, sind folgende Eigenschaften zugänglich:

- ColorEachPoint – markiert jeden Wert in einer anderen Farbe.

- ExplodeBiggest – markiert den höchsten Wert (nur beim Kreisdiagramm).

- Marks – Einstellungen für das Aussehen der Hilfstexte.

- ValueFormat – Zeile der Formatierung der Werte.

Man muss anmerken, dass man alle Möglichkeiten der Diagrammbearbeitung mit dem Paket TeeChart Pro erhält (wird separat erworben). Dieses Paket enthält viele weitere Arten der Diagramme und besitzt Editoren zur bequemen Bearbeitung der Diagramme und Serien. All das erlaubt eine einfache und schnelle Bearbeitung der Diagramme.


Chart with specified values

Im vorherigen Beispiel haben wir ein Diagramm auf Basis der DB-Tabelle erstellt. Man kann aber auch das Diagramm auf eine andere Weise erstellen und zwar indem man die Daten manuell eingibt. Diese Möglichkeit ist praktisch für kleine Diagramme.

Schauen wir uns das ganze an einem Beispiel an. Legen wir ein Diagramm auf das Blatt und gehen in dessen Editor. Als nächstes fügen wir die Serie "Säulendiagramm" ein und konfigurieren die Eigenschaften:

Screenshot - 18.05.2009 , 18_03_27

Beim Start des Reports sehen wir folgendes Ergebnis:


Füllen des Diagrammes aus dem Script

Fullen des Diagrammes aus dem Script

Füllen wir das vorhergehende Diagramm mit Daten aus einem Script. Dazu lassen wir im Editor die Felder X und Y leer. Im Script des Reports schreiben wir folgendes:

PascalScript:

begin

Chart1.SeriesData[0].Source1 := 'Januar;Februar;März;April';

Chart1.SeriesData[0].Source2 := '31;28;31;30';

end.

C++Script:

{

Chart1.SeriesData[0].Source1 = "Januar;Februar;März;April";

Chart1.SeriesData[0].Source2 = "31;28;31;30";

}

In diesem Fall erlaubt SeriesData[0] die Eingabe der Parameter der ersten Serie im Diagramm. Hat das Diagramm mehrere Serien, so kann man diese über SeriesData[Nummer_Serie] erreichen.


Drucken von Diagrammen (erstellt in Delphi)

Falls Sie schon ein Diagramm im Code Delphi erstellt haben und dieses in den Report einfügen wollen, so benötigen Sie das Objekt „Grafik“. Plazieren Sie das Objekt an dem gewünschten Platz und schreiben folgenden Bearbeiter des Ereignisses TfrxReport.OnBeforePrint:

procedure TForm1.frxReport1BeforePrint(Sender: TfrxReportComponent);

begin

if Sender.Name = 'Picture1' then

   TfrxPictureView(Sender).Picture.Assign(

     Chart1.TeeCreateMetafile(False,

       Rect(0, 0, Round(Sender.Width), Round(Sender.Height))));

end;

wo Picture1 steht, kommt der Name des Objetes „Grafik“ rein. Chart1 ist Ihr Delphi Diagramm.


Dot-Matrix Reporte

Bis jetzt haben wir uns Reporte angesehen, die für den Druck auf Standarddruckern (Tinten-, Laserdrucker) bestimmt waren. Das Drucken eines solchen Reportes wird auf einem Nadeldrucker sehr viel Zeit in Anspruch nehmen. Mit FastReport kann man spezielle Reporte extra für Nadeldrucker erstellen. Es werden nur die Standardsymbole der Schrift verwendet, ohne grafische Elemente. Dadurch erfolgt der Druck wesentlich schneller.

Betrachten wir das Erstellen eines Reportes der Art «Liste» bestimmt zum Druck auf einem Nadeldrucker. Wir haben solch einen Report schon eher erstellt s.h. Kapitel «Report «Kundenliste». Wir verwenden für den Report jetzt dieselben Daten.

Nun erstellen wir ein neues Projekt in Delphi und legen auf die Form die Komponenten TTable, TfrxDBDataSet, TfrxReport, TfrxDotMatrixExport und stellen die Egenschaften ein:

TTable:

DatabaseName = 'DBDEMOS'

TableName = 'Customer.db'

TfrxDBDataSet:

DataSet = Table1

UserName = ‘Customers’

Wir öffnen den Reportdesigner und wählen den Punkt “Datei|Neu…”. Es öffnet sich ein Fenster, in dem sich die Assistenten aufgeführt sind. Wir wählen «Dot-Matrix Report»:

Screenshot - 18.05.2009 , 18_06_02

Wenn Sie auf OK gehen erscheint eine leere Seite. Diese ist der Matrixschrift angepasst:

Die Liste der Objekte, welche eingefügt werden können, hat sich verändert. Es sind nun «Band», «Text», «Dot-matrix Linie», «ESC-Befehl», «Unterreport» und «Cross-tab Objekt». Andere Objekte können in einem Matrixreport nicht verwendet werden.

Fügen wir auf die Seite die Bänder Report title, Page header und Master data ein:

Die Objekte „Text“ verteilen wir auf die Bänder auf folgende Weise:

Das Prinzip der Objektverteilung ist dasselbe wie auch im Standardreport. Der Unterschied besteht darin, dass die Objekte fest im Netz verankert sind. Für diese kann man keine andere Schriftgröße oder Farbe wählen. Jedoch können bestimmte Eigenschaften der Schrift verändert werden. Wählen Sie das Objekt „Text“ an und klicken auf 72.6 im Instrumentenpanell:

Screenshot - 18.05.2009 , 18_08_54

Wie man sieht können hier die Eigenschaften eingegeben werden die für das Drucken auf Nadeldruckern speziefisch sind. Diese Eigenschaften besitzt die Seite und alle Matrixobjekte (ausgenommen die Bänder).

Achtung! Im Designer und der Vorschau werden nur die Eigenschaften «Fett», «Kursiv», «Unterstrichen». Zum Drucken werden jedoch alle Eigenschaften verwendet.

Verändern wir das Aussehen des Reportes und geben für die Köpfe «Fett». Der Report ist nun fertig und kann in der Vorschau betrachtet werden:


Cross-tab in dot-matrix

Die Anzahl der Objekte im Matrixreport ist nur auf die beschränkt, die in der Textform dargestellt werden können. Dazu gehört auch das «Cross-ňŕb Objekt». Betrachten wir die Erstellung solch eines Reports, dies geschieht analog dem im Kapitel «Tabelle mit zusammengesetzten Kopfzeilen» erstellten Report.

Wir führen nun dieselben Schritte durch und rufen den Assistenten “Dot-matrix Report“ auf. Auf die Seite legen wir nun die Komponente „Datenbank Cross-tab Objekt“ und konfigurieren die Struktur:

Screenshot - 18.05.2009 , 18_09_57

Wie man sieht, zeigt der Editor die Struktur der zukünftigen Tabelle schon in der Matrixform. Den Stil der Zellen kann man im Designer durch den Button 73.2 verändern. Die übrigen Arbeitsschritte unterscheiden sich nicht von den oben durchgeführten. Auf dem Bildschirm würde solch ein Report so aussehen:


Dot-matrix reports printing

Um einen Matrixreport im Textmodus drucken zu können (d.h. mit maximaler Geschwindigkeit), muss auf die Seite Ihres Projektes unbedingt die Komponente TfrxDotMatrixExport [image] aus dem Komponentensatz von “FastReport 4.0” gelegt werden. Der Standarddialog zum Drucken ändert sich dabei:

Screenshot - 18.05.2009 , 18_11_47

Das Fenster sieht dem Standardfenster ähnlich, es enthält jedoch auch Spezifikationen für Nadeldrucker. Vor dem Drucken muss der ESC-Befehl gewählt werden. Folgende Befehle sind vorhanden:

Screenshot - 18.05.2009 , 18_12_29

Auch können folgende Optionen des Druckens eingegeben werden:

- Speichern in Datei – bestimmt ob die Daten auf der Festplatte gespeichert werden sollen. Setzt man das Häkchen, wird vor dem Drucken eine Anfrage der Datei erfolgen;

- Seitenbruch – bestimmt ob der Befehl «Seitenbruch» erteilt wird, wenn das Ende der Seite erreicht wird. Setzt man das Häkchen nicht, wird auf Rollenpapier gedruckt;

- OEM Codierung – bestimmt wie die vertikalen bzw. horizontalen Linien gezeichnet werden. Ist das Häkchen nicht gesetzt, werden die Linien mithilfe der Symbole -, |, + gezeichnet.


"Dot-matrix Befehlsobjekt"

Wie wir vorhin beschrieben haben, können Sie folgende Eigenschaften für Dot-Matrix Reporte einstellen:

Screenshot - 18.05.2009 , 18_08_54

Dies ist die Standardauswahl, welche von allen Modellen der Nadeldrucker verstanden wird. Außerdem kann ein konkretes Druckermodell Befehle unterstützen, die nicht in der Standardauswahl vorhanden sind z.B. erhöhen auf 20 Zeichen pro Zoll. Um diesen Befehl einzugeben nutzen Sie das «Dot-matrix Befehlsobjekt» .

Man fügt das Objekt auf die gewünschte Stelle der Seite (z.B. oben links oder vor die Objektgruppe, die diese Einstellungen haben sollen). Um den Befehl einzugeben, editieren Sie die Eigenschaft des Objektes im Objektinspektor:

Sie können den Befehl auf zwei Arten erteilen: dezimal (z. B. #27#40) oder hexadezimal (1B28).


Dialogformen

Im Report können neben den Reportseiten, Dialogformen enthalten sein. Um diese zu erstellen verwenden Sie denselben Designer wie den der Seiten. Um eine neue Dialogseite zu erstellen, klicken Sie auf den Button [image] auf der Instrumentenleiste. Eine neue Seite wird dann in den Report eingefügt. Wenn Sie nun auf die Dialogseite wechseln, ändert sich die Arbeitsfläche. Hier können nun Objekte eingefügt werden, die die Steuerungselemente darstellen:

Screenshot - 18.05.2009 , 18_18_51


Steuerungselemente

Die Steuerungselemente der Dialogseiten werden durch die Verwendung der Komponente TfrxDialogControls [image] verknüpft aus dem Komponentenset FastReport. Es reicht aus die Komponente auf eine beliebige Seite des Projektes zu legen oder in die Liste uses frxDCtrl einzufügen. Es werden dann folgende Steuerungslemente hinzugefügt:

Element | Bezeichnung | Beschreibung
 | TfrxLabelControl | Dieses Steuerungselement wird verwendet um Hilfstexte auf der Dialogform anzuzeigen.
 | TfrxEditControl | Mit Hilfe des Steuerungselementes wird eine Textzeile mithilfe der Tastatur eingefügt.
 | TfrxMemoControl | Mit Hilfe des Steuerungselementes werden mehrere Textzeilen mit Hilfe der Tastatur eingefügt.
 | TfrxButtonControl | Dieses Element stellt einen Button dar.
 | TfrxCheckBoxControl | Dieses Element stellt ein Häkchen dar im aktivierten/deaktivierten Zustand. Neben dem Häkchen wird ein Hilfstext angezeigt.
 | TfrxRadioButtonControl | Dieses Element stellt einen Umschalter mit einer abhängigen Fixierung dar. Deswegen wird es nicht alleine verwendet.
 | TfrxListBoxControl | Dieses Element stellt eine Liste mit Zeilen dar und der Möglichkeit eine auszuwählen.
 | TfrxComboBoxControl | Dieses Element stellt eine Drop-Down-Liste mit Zeilen dar und der Möglichkeit eine auszuwählen.
 | TfrxDateEditControl | Dieses Element stellt ein Datumeingabefeld dar, mit einem ausfahrbaren Kalender.
 | TfrxGroupBoxControl | Dieses Element stellt ein Panell mit einem Hilfstext dar, und dient dem Vereinigen mehrerer Steuerungselemente.
 | TfrxPanelControl | Dieses Element stellt ein Panell dar und dient dem Vereinigen mehrerer Steuerungselemente.
 | TfrxBitBtnControl | Dieses Element stellt einen Button mit einer Grafik dar.
 | TfrxSpeedButtonControl | Dieses Element stellt einen Button mit einer Grafik dar.
 | TfrxMaskEditControl | Dieses Element stellt ein Feld zum Einfügen von Informationen in eine Maske dar.
 | TfrxCheckListBoxControl | Dieses Element stellt eine Liste mit Kontrollkästchen dar.
 | TfrxBevelControl | Dieses Element wird zum designen der Dialogform verwendet.
 | TfrxImageControl | Dieses Element stellt eine Grafik in den Formaten BMP, ICO, WMF, EMF dar.

Wie man sieht sind die Steuerungselemente denen in Delphi ähnlich. Hilfe zu den Eigenschaften, Ereignissen und Methoden eines jeden Elementes, erhält man in der FastReport-Hilfe


Report "Hello, World!"

Diesmal erstellen wir einen Report, der uns vor dem eigentlichen Report eine Begrüßung anzeigt indem wir eine Dialogform verwenden. Starten wir ein neues Projekt in Delphi und legen folgende Komponenten auf die Seite: TfrxReport, TfrxDialogControls. Durch einen Doppelklick auf die Komponente TfrxReport rufen wir den FastReport Designer auf und fügen in den Report eine Dialogform ein. In die Form fügen wir die Objekte TfrxLabelControl, TfrxButtonControl ein:

Die Objekteigenschaften werden folgendermaßen eingestellt:

TfrxLabelControl:

Caption = 'Hello, World!'

TfrxButtonControl:

Caption = 'OK'

Default = True

ModalResult = mrOk

Jetzt stellen wir die Eigenschaft der Dialogform BorderStyle = bsDialog ein. Wie man sehen kann haben die Steuerungselemente und die Dialogform denselben Satz der Eigenschaften wie auch die entsprechenden Elemente in Delphi.

Nachdem wir die Einstellungen eingestellt haben, kehren wir auf die Reportseite zurück und fügen dort ein Objekt „Text“ ein mit einem beliebigen Satz. Starten wir nun den Report und sehen unsere Dialogform:

Wenn man auf OK geht, wird der Report erstellt und angezeigt. Schließt man das Fenster mit X, so wird der Report nicht erstellt. So arbeitet der Algorithmus von FastReport, ein Report wird nur durch klick auf OK erstellt. Deshalb haben wir am Anfang die Eigenschaft ModalResult des Buttons gleich mrOk gestellt.


Einfügen von Parametern und deren Transfer in den Report

Einfugen von Parametern und deren Transfer in den Report

Machen wir unser Beispiel komplizierter um zu zeigen auf welche Weise die in der Dialogform enthaltenen Werte in den Report übertragen werden. Dazu verändern wir unsere Dialogform folgendermaßen:

Auf der Reportseite fügen wir das Objekt „Text“ mit folgendem Text ein:

You've entered:

[Edit1.Text]

Starten wir den Report und vergewissern uns, dass der eingefügte Parameter im Report angezeigt wird. Analog können auch andere Elemente der Dialogform bearbeitet werden. Jedes Objekt besitzt einen einzigartigen Namen innerhalb des Reports und kann deshalb an einer beliebigen Stelle im Report verwendet werden.


Interaktion der Steuerungselemente

Wenn man Scripte verwendet kann man die Logik der Arbeitsweise der Dialogform leicht nachvollziehen z. B. die Interaktion der Steuerungselemente. Schauen wir uns ein Beispiel an. Modifizieren wir die Dialogform auf folgende Weise:

Nun klicken wir doppelt auf das Objekt "CheckBox", dabei wird ein Bearbeiter des Ereignisses OnClick erstellt und schreiben folgenden Script:

PascalScript:

procedure CheckBox1OnClick(Sender: TfrxComponent);

begin

Button1.Enabled := not CheckBox1.Checked;

end;

C++ Script:

void CheckBox1OnClick(TfrxComponent Sender)

{

Button1.Enabled = !CheckBox1.Checked;

}

Wie man sieht, unterscheidet sich der Code nicht von dem in Delphi verwendeten. Starten wir den Report und sehen, dass der Button darauf reagiert, ob das Häkchen da ist oder nicht.


Verschiedene Dialogformen

Schauen wir uns an wie ein Report mit zwei Dialogformen arbeitet. Erstellen wir einen Report mit zwei Dialogformen und einer Seite:

Wir stellen die Eigenschaften ModalResult (mrOk und mrCancel entsprechend) der Buttons OK und Cancel ein. Jetzt starten wir den Report. Zuerst sollen wir die Fragen des ersten Dialoges beantworten (Name, Kinder ja/nein), danach (nach dem klick auf OK) die des zweiten (Namen der Kinder). Klicken wir auf OK des zweiten Dialoges so wird der Report erstellt. Dies ist die Arbeitsweise des Kerns von FastReport. Die Dialoge werden in der Reihenfolge der Erstellung angezeigt. Der folgende Dialog erscheint dabei nur, wenn man den vorherigen (mit der Eigenschaft ModalResult = mrOk) mit OK schließt. Wird einer der Dialoge abgelehnt (Button Cancel oder mit dem Kreuz oben rechts) so wird die Erstellung des Reports beendet.


Steuerung der Reportformen

Im vorherigen Beispiel werden die Dialogformen angezeigt. Unabhängig davon, ob wir ein Häkchen bei "Have children" gesetzt haben oder nicht. Schauen wir uns an, wie man den zweiten Dialog verbergen kann, falls kein Häkchen gesetzt worden ist. Hierfür erstellen wir einen Bearbeiter OnClick beim Button OK im ersten Dialog (führen Sie einen Doppelklick auf den Button aus, um den Bearbeiter zu erstellen):

PascalScript:

procedure Button1OnClick(Sender: TfrxComponent);

begin

DialogPage2.Visible := CheckBox1.Checked;

end;

C++Script:

void Button1OnClick(TfrxComponent Sender)

{

DialogPage2.Visible = CheckBox1.Checked;

}

Dieser Code verbirgt den zweiten Dialog (DialogPage2), falls man kein Häkchen gesetzt hat. Wenn wir den Report nun starten, sehen wir, dass der Report einwandfrei funktioniert.

Eine andere Möglichkeit der Steuerung der Dialogformen, ist die Verwendung des Ereignisses OnRunDialogs. Um den Bearbeiter dieses Ereignisses zu erstellen, wählen sie das Objekt Report im Reporttree oder im Objektinspektor aus und gehen auf den Tab "Ereignis" im Inspektor. Der Doppelklick auf das Ereignis OnRunDialogs erstellt nun den Bearbeiter:

Im Bearbeiter schreiben wir folgenden Code:

PascalScript:

procedure frxReport1OnRunDialogs(var Result: Boolean);

begin

Result := DialogPage1.ShowModal = mrOk;

if Result then

begin

   if CheckBox1.Checked then

     Result := DialogPage2.ShowModal = mrOk;

end;

end;

C++Script:

void frxReport1OnRunDialogs(bool &Result);

{

Result = DialogPage1.ShowModal == mrOk;

if (Result)

{

   if (CheckBox1.Checked)

     Result = DialogPage2.ShowModal == mrOk;

}

}

Der Bearbeiter arbeitet folgendermaßen: wir zeigen den ersten Dialog. Wird dieser mit OK geschlossen, schauen wir uns das Kontrollkästchen CheckBox1 an und zeigen den zweiten Dialog, falls nötig. Gibt der Bearbeiter Result = True wieder, so wird der Report erstellt. Ist Result = False, so wird der Report gestoppt.


Zugangskomponenten zu den Daten

Die meisten Reporte basieren in der Regel auf den Daten einer Datenbank. Für den Zugang zu diesen Daten hat Delphi effektive Mechanismen, die auch in FastReport verwendet werden. Wir reden hier über die Komponenten TTable und Tquery. Diese können als Datenquellen für den Report fungieren. Man kann eigentlich alle Komponenten mit diesem Ziel verwenden, die Nachfolger von TdataSet sind.

Außer dem Zugang zu den Daten die im Report verwendet werden, erlaubt FastReport neue Komponenten in run-time zu erstellen. Im FastReport ist das Prinzip der Erstellung der Zugangskomponenten, dem in Delphi ähnlich. Wie in Delphi wird auf die Form die Komponente gelegt und dessen Eigenschaften werden im Objektinspektor eingestellt. Die Komponentideologie ist sehr flexibel, man kann relativ leicht neue Komponenten für verschiedene Zugangs-Engines zu den Daten erstellen.

Screenshot - 18.05.2009 , 18_28_27


Beschreibung der Komponenten

In diesem Kapitel betrachten wir die Verwendung der Zugangskomponenten zu den Daten mit Hilfe von ADO. Genauso können die Komponenten BDE, IBX, DBX, FIB und viele andere verwendet werden, für die Arbeit des FastReport mit den Engines der Datenbanken.

Die Komponente ADO wird hinzugefügt, bei der Verwendung der Komponente TfrxADOComponents [image] aus der Palette von FastReport. Dabei erscheinen im Objektenpanell folgende Objekte: TfrxDBLookupComboBox, TfrxADOTable, TfrxADOQuery, TfrxADODataBase. Diese Objekte erfüllen dieselben Aufgaben wie die entsprechenden Komponenten in Delphi (TDBLookupComboBox, TADOTable, TADOQuery, TADOConnection).

Icon | Bezeichnung | Beschreibung
 | TfrxDBLookupComboBox | Steuerungselement zur Auswahl eines Wertes aus einem Verzeichnis.
 | TfrxBDETable | Steuerungselement des Zuganges zur DB-Tabelle.
 | TfrxBDEQuery | Steuerungselement zur Ausführung von SQL-Anfragen.
 | TfrxBDEDataBase | Steuerungselement der Verknüpfung zur Datenbank.

Let us examine each component.


TfrxDBLookupComboBox

Dieses Steuerungselement ist für die Auswahl eines Wertes aus der Verzeichnisstabelle vorgesehen. Dabei wird statt des ausgewählten Wertes, sein Identifikator im Verzeichnis eingefügt.

Das Element hat folgende Eigenschaften:

Eigenschaft | Beschreibung
DataSet | Datenquelle, die mit dem Steuerungselement verbunden ist.
ListField | Feldname in der Datenbank, welcher im Steuerungselement angezeigt wird.
KeyField | Name des Schlüsselfeldes in der Datenbank, welcher den ausgewählten Eintrag identifiziert.
KeyValue | Wert des Schlüsselfeldes, das in der Liste ausgewählt worden ist.
Text | Wert des DB-Feldes, welcher in der Liste angezeigt wird.
AutoOpenDataSet | Ist die Eigenschaft gleich True, so wird die verknüpfte Datenquelle automatisch geöffnet nach dem Ereignis OnActivate des Dialoges.

Um das Steuerungselement mit dem Verzeichnis zu verknüpfen, müssen Werte in die drei Eigenschaften DataSet, ListField und KeyField eingefügt werden. Der ausgewählte Wert ist über die Eigenschaften Text oder KeyValue erreichbar. Mit Hilfe von KeyValue kann man die Anfangsposition des Cursors in der Liste angeben.


TfrxADOTable

Die Komponente ist für die Organisation des Zuganges zu der DB-Tabelle vorgesehen und enthält folgende Eigenschaften:

Eigenschaft | Beschreibung
Database | Name der Verbindung zu Datenbank (Komponentenname TfrxADODatabase).
FieldAliases | Erlaubt die Eingabe eigener Feldnamen.
Filter | Ausdruck zum Filtern der Daten.
Filtered | Bestimmt ob der Filter verwendet werden soll.
IndexFieldNames | Namen der Indexfelder.
IndexName | Name des sekundären Index.
MasterFields | Felder, die mit dem Master-Dateset verbunden sind.
Master | Master-Datenset.
TableName | Name der DB-Tabelle.
UserName | Benutzerdefinierter Name des Datensets.

Die Komponenteneigenschaften sind denen in Delphi TADOTable ähnlich. Um die Komponente mit der DB-Tabelle zu verknüpfen, reicht es aus die Eigenschaften Database und TableName auszufüllen. Die Tabelle wird mit Hilfe der Einstellung Active := True oder der Methode Open geöffnet.

Der Editor der Eigenschaft FieldAliases erlaubt die Auswahl der Felder, welche in der Tabelle zugänglich sein werden und man kann die Namen der einzelnen Felder oder der gesamten Tabelle eingeben.

Screenshot - 18.05.2009 , 18_31_58

Der Editor der Eigenschaft MasterFields wird für die Erstellung der master-detail Verbindungen zwischen zwei Tabellen verwendet. Um zwei Tabellen auf diese Weise zu verknüpfen, muss bei der untergeordneten Tabelle in der Eigenschaft Master die Haupttabelle angegeben werden und der Editor der Eigenschaft MasterFields muss aufgerufen werden. Besitzt die Tabelle sekundäre Indexe, die unbedingt verwendet werden sollen, so muss vorsichtshalber die Eigenschaft IndexName eingestellt werden.

Screenshot - 18.05.2009 , 18_32_15

Hier kann man visuell die Felder der „Master-Datensets“ und „Detail-Datensets“ verbinden. Wenn die Datensets über Master-Detail verbunden sind, wird beim Verschieben innerhalb des Master-Datensets der Inhalt des Detail-Datensets so gefiltert, dass dieser nur Daten enthält, die in Verbindung mit dem aktuellen Master-Datenset stehen.

Um die Felder zu verbinden, wählen Sie ein Feld in der Liste links (Detail-Datenset), ein Feld aus aus der Liste rechts (Master-Datenset) und klicken auf „Hinzufügen“. Die Verknüpfung erscheint nun im unteren Fenster. Um den Inhalt des Fensters zu löschen, verwenden Sie den Button „Löschen“. Die verbundenen Felder müssen den gleichen Typ haben und Schlüssel besitzen.


TfrxADOQuery

Die Komponente ist für SQL-Anfragen an der Datenbank bestimmt und besitzt folgende Eigenschaften:

Eigenschaft | Beschreibung
Database | Name der Verbindung zu Datenbank (Komponentenname TfrxADODatabase).
FieldAliases | Erlaubt die Eingabe eigener Feldnamen.
Filter | Ausdruck zum Filtern der Daten.
Filtered | Bestimmt ob der Filter verwendet werden soll.
Master | Master-Datenset.
Params | Liste der Abfrageparameter.
SQL | Abfrage
UserName | Benutzerdefinierter Name des Datensets.
IgnoreDupParams | Wenn True, so werden die Namen der Abfrageparameter nicht im Editor der Parameter verdoppelt.

Die Eigenschaften Database, FieldAliases, Filter, Filtered, Master sind den oben beschriebenen Komponenteneigenschaften TfrxADOTable ähnlich. Die Eigenschaft SQL besitzt einen eigenen Editor um SQL-Anfragen zu starten.

Die Eigenschaft Params besitzt ebenfalls einen eigenen Editor. Sie ist zugänglich, wenn der Text die Anfrage folgender Parameter enthält.

Screenshot - 18.05.2009 , 18_34_14

Der Parameter dem Master-Datenset zugeteilt sein oder einen konkreten Wert haben. Als Wert kann sowohl eine Konstante, als auch einen Link zur Variablen oder Objekteigenschaft haben.

Sollte der Parameter aus dem Master-Datenset stammen, so muss die Eigenschaft TfrxADOQuery.Master eingestellt werden. Das Datenset muss ein Feld mit einem Namen enthalten, welches mit dem Namen des Parameters übereinstimmt. Die Eingabe des Typs des Parameters und dessen Wert sind nicht zwingend.


TfrxADODataBase

Diese Komponente dient der Verknüpfung mit der Datenquelle und die Funktion ist der Komponente Delphi TADOConnection ähnlich. Die Komponente besitzt folgende Eigenschaften:

Eigenschaft | Beschreibung
Connected | Wenn True, dann wird die verbindung aktiviert.
DatabaseName | Verbindungszeile zur Datenbank.
LoginPrompt | Bestimmt ob eine Passwortanfrage erfolgen soll, vor der Verbindung zur Datenbank.

Bestimmt ob eine Passwortanfrage erfolgen soll, vor der Verbindung zur Datenbank. Ist LoginPromt = False so muss der Benutzername und das Passwort eingegeben werden.


Reporterstellung

Betrachten wir das Erstellen eines einfachen Reportes, der Zugangskomponenten zu den Daten enthält. Als Daten verwenden wir die Demonstrationsdaten die in FastReport enthalten sind - {FR}\Demos\Main\demo.mdb.

Am Anfang erstellen wir ein Projekt, mit dem wir experimentieren werden. Wir starten ein neues Projekt in Delphi und fügen die Komponenten TfrxReport, TfrxDesigner, TfrxDialogControls, TfrxADOComponents, TADOConnection ein.

Schließen Sie danach das Fenster mit OK stellen die Eigenschaften der folgenden Komponenten ein:

ADOConnection1:

LoginPrompt = False

frxADOComponents1:

DefaultDatabase = ADOConnection1

Für den Button "Design" bestimmen Sie folgenden Bearbeiter:

procedure TForm1.Button1Click(Sender: TObject);

begin

frxReport1.DesignReport;

end;

Danach kompilieren und starten Sie das Projekt. Das ist alles um End-User Reportdesigner zu erstellen.

Beim Klick auf den Button Design öffnet sich der Designer, welcher einen leeren Report enthält. Betrachten wir nun die Erstellung einfacher Reporte.


Erstellen wir einen Report des Typs "Liste"

Dieser Report wird Daten aus einer DB-Tabelle enthalten. Um den Report zu erstellen führen Sie folgende Schritte aus. Klicken Sie auf den Button „NeuerReport“ [image] auf der Instrumentenleiste. FastReport erstellt nun eine leere Reportseite, die „Code“, „Data“ und „Page1“ enthält. Gehen Sie auf den Tab „Data“ und legen auf die Seite die Komponente „Tabelle ADO“:

Beachten Sie, dass bei der Komponente die Eigenschaft Database gefüllt ist, diese zeigt unsere Datenquelle an. Das passiert, weil wir diese angegeben haben in der Eigenschaft DefaultDatabase der Komponente TfrxADOComponents. Jetzt müssen wir nur noch die Tabelle wählen:

TableName = 'Customer'

Um das Band „Daten 1 Ebene“ mit der Tabelle zu verknüpfen, klicken Sie doppelt darauf und wählen, indem sich öffnenden Fenster unsere Tabelle. Ziehen Sie die benötigten Felder aus dem Fenster „Datentree“ auf die Seite. Unser Report müsste danach ungefähr so aussehen:

Um den erhaltenen Report betrachten zu können klicken Sie auf den Button „Vorschau“ [image] auf der Instrumentenleiste.


Report mit Parameterabfragen

Betrachten wir die Erstellung eines Reports, bei welchem, vor dem start, eine Parameterabfrage im Dialogfenster erfolgt. Dazu machen Sie folgendes.

Erstellen Sie einen neuen Report. Gehen auf die Seite 2Saten“ und fügen dort ein neues Objekt „Anfrage ADO“. Rufen Sie dessen Editor auf und fügen folgenden Text der Anfrage hinzu:

select * from Customer where CustNo > :p1

Fügen sie in den Report eine neuen Dialog hinzu. Legen auf die Form die Komoponenten Label, Edit, Button:

Stellen Sie die Eigenschaften der Komponente wie folgt ein:

Label1:

Caption = 'Auswählen wenn CustNo größer als'

Edit1:

Text = '2000'

Button1:

Caption = 'OK'

ModalResult = mrOk

Button2:

Caption = 'Abbruch'

ModalResult = mrCancel

Öffnen Sie den Editor der Eigenschaft Params der Komponente Query und stellen den Parameter ein:

Screenshot - 18.05.2009 , 18_40_27

Jetzt wechseln Sie auf die Seite mit der Reportseite und erstellen folgenden Report:

Beim Start des Reports erscheint auf den Bildschirm ein Dialog in den Sie einen Wert eintragen sollen. Nach dem Eintragen des benötigten Wertes klicken Sie auf OK. Der Report wird nun ausgeführt und zeigt die Kunden, deren Nummer größer als die eingegebene ist.


Weitere nützliche Möglichkeiten

Auf dem Tab „Data“ können auch andere Komponenten, außer den Zugangskomponenten, eingefügt werden. Mit Hilfe der Objekte „Text“ und „Grafik“ können hier auch Hilfstexte und einfache Diagramme eingefügt werden (s.h. Grafik):


Reportnachfolge

Bei der Arbeit mit Reporten fällt auf, dass in den Reporten immer wieder dieselben Daten auftauchen z. B. Angaben zum Unternehmen, Warenzeichen usw. Stellen Sie sich jetzt vor es kommt zu einer Änderung (z.B. die E-mail Adresse ändert sich), man müsste nun jeden Report einzeln öffnen und die E-mail Adresse korrigieren. Um solche Situationen zu vermeiden, verwenden wir die Reportnachfolge. Was genau ist das?

Gehen wir davon aus, dass wir in all unseren Reporten bestimmte Elemente immer verwenden. Dies können der Firmenname, das Firmenlogo usw. sein und sind in jedem Report enthalten. Solche gemeinsamen Elemente kann man in einem Basisreport zusammenfassen. FastReport gibt Ihnen die Möglichkeit Reporte auf Grundlage des Basisreports zu erstellen. Dabei wird der neue Report alle Elemente des Basisreports enthalten und zusätzlich die eigenen.

Der Vorteil ist, Sie ändern in Zukunft nur den Basisreport. Alle anderen Reporte die sich darauf beziehen, werden automatisch die Änderungen übernehmen. Dieses Verhalten wird durch die Nachfolge bestimmt, d.h. beim Start des Nachfolgreports wird zuerst der Basisreport geladen.


Erstellung des Reports

Erstellen wir einen einfachen Report, welcher sich auf einen Basisreport bezieht. Unser Report soll wie folgt aussehen:

Zuerst wird der Basisreport erstellt. Dieser soll im Reportkopf das Firmenlogo und die Unternehmensdaten enthalten. Nun erstellen wir den neuen Report und fügen dort die Objekte ein:

Speichern wir den Report unter den Namen "base.fr3". In welchem Ordner? Das hängt davon ab welche Einstellungen Sie vorgenommen haben. Standardmäßig wird die Schablone in dem Ordner gespeichert, der auch die ausführende Datei enthält. Den Ordner für das Speichern der Schablonen kann man in der Komponente TfrxDesigner eingeben, über die Eigenschaft TemplateDir.

Jetzt erstellen wir den Nachfolgereport. Dazu wählen Sie im Menü "Datei|Neu..." und gehen im sich öffnenden Fenster auf den Tab „Vorlagen“. Wir suchen unsere Datei base.fr3 in der Liste, wählen diese aus und setzen ein Häkchen bei "Report erben":

Screenshot - 18.05.2009 , 18_46_34

FastReport erstellt einen neuen Report der alle Elemente des Basisreports enthält. Diese sind mit einem Schloss markiert:

Was bedeutet dies? Diese Objekte können nicht entfernt oder verändert werden. Ebenfalls können sie auch nicht auf ein anderes Band verschoben werden. Alles andere kann bearbeitet werden (Text, Farbe, Maße). Beachten Sie jedoch, wenn man eine Änderung vornimmt (z.B. Schriftfarbe) bei einem Objekt mit einem Schloß, so wird die Änderung in diesem Report gespeichert. Weitere Änderungen im Basisreport werden nicht mehr für das Objekt übernommen! Wenn z.B. ein Objekt im Basisreport weiß ist und Sie ändern die Farbe im Nachfolgereport in rot, so wird bei einer Änderung der Farbe im Basisreport in grün, der Nachfolgereport trotzdem ein rotes Objekt enthalten. Hätten Sie die Farbe im Nachfolgereport nicht verändert, so wäre die Änderung im Basisreport übernommen worden. Dies gilt auch für Änderungen des Textes, der Maße und all der anderen Eigenschaften des Objektes.

Kehren wir nun wieder zu unserem Report zurück. Was wir noch machen müssen ist den Seitekopf hinzufügen und das Band mit den Daten:

Der Report ist nun fertig.


Änderungen des Basisreports

Betrachten wir die Situation, wenn Änderungen im Basisreport vorgenommen werden sollen. Öffnen Sie dazu den Basisreport (in unserem Beispiel - base.fr3) und ändern die benötigten Felder. Es soll z.B. die E-mail Adresse geändert werden:

Speichern Sie den Report. Wir öffnen jetzt den Nachfolgereport und vergewissern uns, dass die Änderung übernommen wurde:

Was wenn wir in den Basisreport Objekte hinzufügen müssen? Dies ist einfach, vergessen Sie jedoch nicht, dass im Basisreport und im Nachfolgereport keine zwei Objekte mit demselben Namen enthalten sein dürfen. Da wir uns im Basisreport befinden, wissen wir nicht wieviel Reporte von ihm ererbt sind und welche Objektnamen darin verwendet werden. Eine Regel demnach ist: fügen Sie ein Objekt in den Basisreport hinzu, so geben Sie den Namen folgenderweise an „Name_Report_Name_Objekt“. Fügen Sie z.B. in den Basisreport das Objekt „Text“ ein und geben die Namen "BaseMemo3" dafür ein.

Zum Entfernen oder Verschieben der Objekte gibt es keine Beschränkungen.


Steuern der Vererbung

Vorhin haben wir die Erstellung des Nachfolgereports von Anfang an betrachtet. Was jedoch wenn wir schon einen Report haben und dieser sich auf den Basisreport beziehen soll? Dazu laden wir den Report der zum Nachfolgereport werden soll und gehen ins Menü "Report|Optionen...". Im Tab "Vererbung" befinden sich die Steuerungselemente der Vererbung:

Screenshot - 18.05.2009 , 14_57_31

Wir müssen die Option "Von Basisreport erben" wählen und den Report aus der Liste aussuchen. So kann man auch den Weg zu den Reportvorlagen eingeben. Sie müssen jedoch vorsichtig sein, denn die Vorlagen, die einen anderen Weg verwendet haben, werden vielleicht nicht geladen. Nach dem Klick auf OK wird FastReport die beiden Reporte nun verbinden. Dabei kann folgende Warnmeldung auftauchen:

Screenshot - 18.05.2009 , 18_49_27

Dies passiert, wenn in den Reporten Objekte mit gleichen Namen enthalten sind. Diese können entweder aus dem Nachfolgereport entfernt oder umbenannt werden.


Assistenten

Das Komplekt von FastReport enthält einige Assistenten die die Erstellung der Reporte vereinfachen sollen. Die Assistenten sind über das Menü "Datei|Neu..." erreichbar.

Screenshot - 18.05.2009 , 18_55_03


Assistenten neuer Reporte

Es gibt 4 Assistenten neuer Reporte:

- Standard Report Assistent

- Dot-Matrix Report Assistent

- Standard Report

- Dot-Matrix Report

Die Assistenten "Standard Report" und "Dot-Matrix Report" erstellen einen leeren Report (für Standarddrucker oder Nadeldrucker – über Matrixreporte s.h. nächstes Kapitel), welcher eine Seite enthält.

Die Assistenten "Standard Report Assistent" und "Dot-Matrix Report Assistent" erlauben die Auswahl der Felder, der Gruppen, des Layouts usw. im Report. Betrachten wir die Erstellung eines Reportes mit Hilfe des "Standard Report Assistent" genauer.

Wählen Sie im Menü "Datei|Neu..." und in dem sich öffnendem Fenster den Punkt "Standard Report Assistent" aus. Wir sehen nun das Fenster des Assistenten:

Screenshot - 18.05.2009 , 18_51_03

Wie man sieht, besitzt das Fenster mehrere Tabs. Auf dem ersten Tab wählen wir die Datenquelle aus, auf der der Report erstellt werden soll. Hier befinden sich alle uns zur Verfügung stehenden Datenquellen (Komponenten TfrxDBDataSet). Wir können ebenfalls eine neue Datenquelle erstellen (Tabelle oder Abfrage) indem wir die Buttons "Neue Tabelle" oder "Neue Abfrage" anklicken. Es wird der Assistent der neuen Tabelle/Abfrage aufgerufen (dazu später im Kapitel mehr). Wählen wir nun die Datenquelle und klicken den Button "Weiter >>".

Im folgenden Tab müssen wir die Felder auswählen, die im Report erscheinen sollen:

Screenshot - 18.05.2009 , 18_52_52

In der Liste links befinden sich die verfügbaren Felder, in der Liste rechts die ausgewählten. Die Felder kann man verschieben, indem man die Pfeile dazwischen verwendet. Mithilfe der Buttons [image] kann die Reinfolge der Felder verändert werden. Fügen wir nun die Felder Company, Contact, Phone, FAX hinzu und klicken auf "Weiter >>".

Im nächsten Tab können Gruppen gebildet werden. Dabei werden in den Report die Bänder Group header, Group footer eingefügt.

Screenshot - 18.05.2009 , 18_53_18

Die Bildung der Gruppen ist jedoch nicht notwendig. Klicken wir auf "Weiter >>".

Beim nächsten Tab wählen wir die Ausrichtung der Seite und das Layout:

Screenshot - 18.05.2009 , 18_53_49

Das Layout kann in der Tabellen- oder Spaltenform erfolgen. In der Tabellenform bedeutet das, die Felder gehen von links nach rechts. In Spalten bedeutet, die Felder liegen untereinander. Je nach Auswahl des Layouts verändert sich das Bild auf der rechten Seite. Die Option "Felder an Seitenbreite anpassen" verändert die Breite der ausgewählten Felder so, dass alle Felder auf die Seite passen.

Im letzten Tab kann der Stil des Reports ausgesucht werden. Es stehen verschiedene Farbenpaletten der Reportelemente zur Auswahl.

Screenshot - 18.05.2009 , 18_54_18

Nach dem Klick auf den Button "Fertig" erstellt der Assistent folgenden Report:

Der Report kann auch gleich im Vorschaufenster betrachtet werden.


Assistent für neue Verbindung

Dieser Assistent erlaubt, in den schon bestehenden Report, ein neue Verbindung zur Datenbank hinzuzufügen. Dies kann nötig sein, wenn Sie im Report Daten aus zwei oder mehr Datenquellen anzeigen möchten. Der Assistent fügt in den Report ein Komponente des Types "ADO Datenbank" hinzu.

Screenshot - 18.05.2009 , 19_00_47

Sie müssen die Verbindungszeile hinzufügen ( [image] ). Es öffnet sich ein Standardfenster Windows, wo Sie die Art der Verbindung und die Parameter auswählen können. Danach geben Sie den Benutzernamen und das Passwort ein, falls nötig.

Eine neue Verbindung kann ebenfalls erstellt werden, indem man auf das Tab „Data“ geht und in den Report die Komponente "ADO Datenbank" hinzufügt.


Assistent für neue Tabellen

Dieser Assistent erlaubt in einen bestehenden Report eine neue Datenquelle einzufügen und zwar eine Tabelle. Achtung: zuerst muss eine Verknüpfung zur Datenbank im Menü "Report|Daten..." hergestellt werden!

Screenshot - 18.05.2009 , 19_02_05

Im Fenster des Assistenten müssen Sie den Namen der Tabelle auswählen. Ebenfalls können Bedingungen für das Filtern eingegeben werden z.B.:

(CustNo > 2000) and (CustNo < 3000)

Eine neue Tabelle kann ebenfalls erstellt werden, indem man auf das Tab "Data" geht und die Komponente "ADO Tabelle" in den Report einfügt.


Assistent für neue Abfragen

Dieser Assistent erlaubt in einen bestehenden Report eine neue Datenquelle einzufügen und zwar eine SQL-Abfrage. Achtung: zuerst muss eine Verknüpfung zur Datenbank im Menü "Report|Daten..." hergestellt werden!

Screenshot - 18.05.2009 , 19_03_49

Im Fenster des Assistenten tragen Sie die SQL-Abfrage ein. Sie könne ebenfalls die Abfrage mit dem visuellen Query Builder erstellen, indem Sie auf den Button [image] klicken. Der visuelle Query Builder wird später im Kapitel beschrieben.

Eine neue Abfrage kann ebenfalls erstellt werden, indem man auf das Tab "Data" geht und die Komponente "ADO Abfrage" in den Report einfügt.


Query construction

FastReport (Versionen Professional, Enterprise) enthält einen visuellen Query Builder. Dazu verwendet man den FastQueryBuilder, welcher auch als separates Produkt in Ihren Anwendungen verwendet werden kann. Den Query Builder nutzt man um visuelle Textabfragen in SQL zu erstellen. Der Query Builder sieht wie folgt aus:

Die Zahlen bedeuten:

1 - Instrumentenleiste

2 – Arbeitsfläche des Designers

3 – Liste der verwendbaren Tabellen

4 – Parameter der ausgewählten Tabellenfelder

Instrumentenleiste:

- Öffnen SQL Datei

- Speichern der Abfrage (das Schema wird ebenfalls gespeichert)

- leeren der Arbeitsfläche des Designers

- Button Îę. Schließen des Designers mit anschließendem Speichern

- Schließen des Designers ohne zu speichern

Die Arbeitsfläche des Query Builders und die Liste der Tabellen unterstützen Drag&Drop, d.h. um eine Tabelle auf die Arbeitsfläche zu legen, zieht man diese einfach mit der Maus rüber. Die andere Möglichkeit ist die benötigte Tabelle in der Liste doppelt anzuklicken.

Um ein Feld in die Abfrage miteinzubeziehen, reicht es aus, dieses zu markieren:

Markierte Felder erscheinen in der Parametertabelle:

- Visibility – bestimmt, ob das Feld später angezeigt werden soll

- Where – die Bedingung, ob das Feld ausgewählt werden soll z.B. '> 5'

- Sort – Art der Sortierung

- Function – bestimmt die Funktion, die angewendet werden soll

- Group – die Gruppierung des Feldes

Durch das „Rüberziehen“ der Felder zwischen den Tabellen, werden Verbindungen geknüpft (join). Bevor die Verbindungen erstellt werden, wird überprüft, ob die Arten der Felder zusammenpassen. Ist das nicht der Fall können diese nicht verknüpft werden. Um die Einstellungen der Verknüpfungen bearbeiten zu können, muss man auf die Verbindungslinie klicken und den Punkt Link options auswählen. Es erscheint das Fenster der Verbindungsparameter:


Die Verwendung des Query Builders

Erstellen wir einen einfachen Report unter Verwendung des Query Builders.

Wählen Sie in der Instrumentenleiste "Neuer Report" [image] aus. Es wird eine Seite erstellt, die die Bänder "ReportTitel", "MasterData1" und den "Seitenfuß" enthält.

Auf die Seite "Data" legen Sie die Komponente "ADO Abfrage" und klicken darauf doppelt, um den Editor aufzurufen.

Klicken Sie nun auf den Button [image] im Editor und es erscheint der Query Builder. Wählen Sie die Tabelle Customer aus und ziehen diese auf die Arbeitsfläche (man kann diese auch durch den Doppelklick auswählen). Als nächstes werden nun Häkchen an die Felder CustNo, Company und Phone gesetzt:

Mehr braucht man nicht um ein Abfrage zu erstellen. Der Text der Abfrage wird im Tab SQL angezeigt und die Daten, die die Abfrage liefert, im Tab Result. Klicken Sie auf [image] um den Query Builder zu schließen. Wir kehren zurück zum Editor der Abfrage und sehen den generierten Text dieser:

Achtung! Falls Sie den Text der Abfrage verändern, so verlieren sie das Schema (die Anordnung der Tabellen im Query Builder und die Verbindungen zwischen diesen). Wird der Text der Abfrage nicht manuell verändert, so können Sie immer im Query Builder das Schema visuell verändern. Klicken Sie auf OK im Editor und kehren in den Reportdesigner zurück. Jetzt müssen nur noch das Band "MasterData1" mit der Datenquelle verknüpft und die Felder auf dem Band verteilt werden.


Erstellen einer komplexen Abfrage

Im vorherigen Beispiel haben wir einen Report auf den Daten einer Tabelle aufgebaut. Betrachten wir nun einen Report der die Daten zweier Tabellen enthält.

Früher haben wir die Arbeit des Reports mit Gruppen (Kapitel "Report mit Gruppen") betrachtet. Erstellen wir nun eine Abfrage für diesen Report mit Hilfe des Query Builders. Wir müssen die Abfrage in SQL verfassen. Dieser soll die Daten beider Tabellen anzeigen, welche auf bestimmte Weise sortiert sind. In unserem Fall durch die Verknüpfung der Felder CustNo in beiden Tabellen.

Wie im Beispiel vorhin, erstellen wir einen neuen Report und legen auf die Seite die Komponente "ADO Abfrage". Im Editor starten wir nun den Query Builder.

Nun werden zwei Tabellen auf die Arbeitsfläche gezogen – Customers und Orders. Beide Tabellen besitzen das Feld CustNo über welches sie verbunden werden. Durch das Rüberziehen des Feldes CustNo von der einen Tabelle in die andere erstellen wir die Verknüpfung:

Jetzt müssen die Felder markiert werden, die die Abfrage enthalten sollen. Diese sollen anhand des Feldes CustNo sortiert werden. Setzen Sie dazu Häkchen an die Felder "*" in beide Tabellen und auch das Feld Custno in der Tabelle Customer. Im Fenster unten erscheinen nun die von uns ausgewählten Felder und es muss die Art der Sortierung für das Feld CustNo ausgewählt werden:

Die Abfrage ist nun fertig und sieht wie folgt aus:


Betrachten, Drucken, Export des Reports

Der fertige Report kann auf dem Bildschirm betrachtet, über einen Drucker gedruckt oder in ein unterstützendes Format exportiert werden. Das alles kann im Vorschaufenster machen.

Die Zahlen bedeuten:

1 – Seiten des fertigen Reportes;

2 – Instrumentenleiste ;

3 – Statusleiste;

4 – Seitenpanell. Hier wird entweder der Reporttree angezeigt (wie in der Grafik) oder Vorschau der Seiten.

Die Instrumentenleiste besitzt folgende Buttons:

Icon | Bezeichnung | Beschreibung
 | Drucken | Druckt den Report. Tastaturbefehl Strg – P.
 | Öffnen | Öffnet einen Report (*.fp3).
 | Speichern | Speichert einen Report (*.fp3).
 | Export | Export des Reportes in ein unterstütztes Format.
 | Export nach PDF | Exportiert den Report in eine pdf-Datei. Dieser Button wird angezeigt, wenn der entsprechende Exportfilter installiert worden ist.
 | Als E-Mail senden | Export in ein unterstützendes Format und Versand per E-Mail als Anhang. Dieser Button wird angezeigt, wenn der entsprechende Exportfilter installiert worden ist.
 | Suchen | Textsuche im Report. Tastaturbefehl Strg – F.
 | Vergrößern | Vergrößert den Maßstab.
 | Zoom | Auswahl des Maßstabes.
206 | Verkleinern | Verkleinert den Maßstab.
 | Vollbild | Zeigt den Report auf dem ganzen Bildschirm an. Um zur Standardansicht zu wechseln, klicken Sie doppelt auf die Seite.
 | Baumansicht | Zeigt und verbirgt den Reporttree.
 | Miniaturansicht | Zeigt/Verbirgt die Miniaturansicht der Seiten.
 | Seiteneinstellungen | Ruft einen Dialog mit den Seiteneigenschaften auf.
 | Seite bearbeiten | Editiert die aktuelle Seite.
 | Erste Seite | Springt zur ersten Seite des Reportes.
 | Vorige Seite | Geht zur vorherigen Seite im Report.
 | Seitennummer | Geht zur angegebenen Seitennummer im Report. Fügen Sie die Nummer ein und klicken auf Enter.
 | Nächste Seite | Geht zur nächsten Seite im Report.
 | Letzte Seite | Springt zur letzten Seite im Report.
Schließen | Schließen | Schließt das Vorschaufenster.


Tastatursteuerung

Tasten | Beschreibung
Strg+S | Speichert den Report *.fp3.
Strg+P | Druckt den Report.
Strg+F | Textsuche.
F3 | Weiterführen der Suche.
Pfeile | Flüssiges Scrollen des Dokumentes.
Bild hoch, Bild runter | Scrollen hoch/runter.
Strg+Bild hoch, Bild runter | Scrollen hoch/runter zur nächsten Seite.
Pos 1 | Springt zum Anfang des Dokumentes.
Ende | Springt zum Ende des Dokumentes.


Maussteuerung

Aktion | Beschreibung
Linke Maustaste | Klick auf ausgewählte Objekte (im interaktiven Report); Scrollen im Modus «Hand» (Taste festhalten und Maus bewegen); im Modus «Zoom» - heranzoomen.
Rechte Maustaste | Kontextmenü; im Modus «Zoom» - herauszoomen.
Doppelklick | Bei Anzeige des Reports auf dem ganzen Bildschirm, Rückkehr zur Standardansicht.
Mausrad | Scrollen der Seite.


Druck des Reports

Um den Report auszudrucken, klicken Sie auf den Button [image] (oder die Tasten Strg+P). Es erscheint folgendes Fenster:

Screenshot - 18.05.2009 , 19_22_33

Schauen wir uns die vorhandenen Einstellungen an.

In der Gruppe "Drucker" kann man den Drucker aussuchen, dessen Einstellungen bearbeiten und „In Datei drucken“ auswählen.

Screenshot - 18.05.2009 , 19_23_14

In der Gruppe "Seite" können die zum Druck bestimmten Seiten ausgewählt werden (alle, aktuelle oder bestimmte).

Screenshot - 18.05.2009 , 19_23_37

Gruppe "Kopien": hier geben wir die Anzahl der Kopien an und wählen die Sortierung der Seiten aus ("Sortieren"):

Screenshot - 18.05.2009 , 19_24_02

Gruppe "Druckoptionen": hier wählen wir welche Seiten gedruckt werden sollen (alle, gerade, ungerade), die Reihenfolge (ab erster Seite oder ab der letzten) und geben die Einstellungen für doppelseitigen Druck ein ("Duplex" – falls Ihr Drucker das unterstützt).

Screenshot - 18.05.2009 , 19_24_21

In der Gruppe "Druckmodus" kann einer der Modi ausgewählt werden.

Screenshot - 18.05.2009 , 19_24_47

- Standarddruck. Der Drucker druckt das, in dem Report angegebene Format. Eine Seite des Reports entspricht einer gedruckten Seite

- Aufteilen. Dies wird verwendet um Seiten im DIN A3 Format als DIN A4 zu drucken. Aus einer Reportseite werden zwei gedruckte. Wählen Sie diesen Modus, müssen Sie auch das gewünschte Papierformat aus der Liste "Papierformat" auswählen.

- Zusammenfügen. Will man den Report DIN A4 im Format DIN A3 drucken so wählt man zusammenfügen aus. Auf einer gedruckten Seite werden zwei Reportseiten dargestellt. Auch hier muss man das gewünschte Papierformat aus der Liste "Papierformat" auswählen.

- Anpassen. Druckt den Report im gewünschten Format. Dabei wird das Erscheinungsbild gezoomt (größer/kleiner) abhängig vom Format des Reports und der Seite. Eine Reportseite erscheint dann auf einer Blattseite. Hier muss ebenfalls das gewünschte Papierformat aus der Liste "Papierformat" auswählt werden.

Klickt man auf OK, startet der Druck. Ist das Kontrollkästchen «In Datei drucken» ausgewählt, so erfolgt eine Anfrage nach dem Dateinamen und die Speicherung in dieser (die Datei mit der Endung *.prn enthält die Kopie der Informationen, die an den Drucker gesendet worden sind).


Textsuche im Report

Mit FastReport kann man im Vorschaufenster eine Textsuche durchführen. Dazu klicken Sie auf den Button [image] auf der Instrumentenleiste (Tastaturbefehl Strg+F). Es erscheint das Fenster der Suche:

Screenshot - 18.05.2009 , 19_30_42

Hier kann der Text eingegeben werden und die Optionen der Suche:

- Ab Anfang – die Suche wird vom Anfang des Dokumentes an durchgeführt, ansonsten auf der aktuellen Seite.

- Groß-/Kleinschreibung – wählt man es aus, so wird die Groß-/Kleinsschreibung bei der Suche beachtet.

Klicken Sie nun auf OK wird die Textsuche durchgeführt und das erste gefundene Element angezeigt:

Um die Suche fortzuführen, drücken Sie auf F3. Es wird das nächste Element angezeigt.


Export der Reporte

FastReport erlaubt den Export des fertigen Reports in verschiedene Formate zur weiteren Bearbeitung, Archivierung, dem Versand per E-mail usw.

Im Moment werden 13 Formate unterstützt: PDF, ODS, ODT, Excel, XML, RTF, HTML, text, CSV, BMP, Jpeg, Tiff und Gif. Es besteht die Möglichkeit den Report in all diesen Formaten per E-mail zu versenden. Um den Export auszuwählen klicken Sie auf 103.6 auf der Instrumentenleiste:

Screenshot - 18.05.2009 , 19_33_09

Für den Export verwendet FastReport eine der 3 Möglichkeiten:

- Schicht-für-Schicht – die Objekte im Bericht werden nacheinander in die Datei übertragen. Der Export ist dem Original ähnlich.

- Tabellarisch – beim Übertragen der Objekte wird eine Zwischenmatrix verwendet, in der die Objekte untergebracht werden. Das Aussehen entspricht im hohen Maße dem Original, falls die Regeln der Erstellung der Maske beachtet worden sind (Kapitel «Vorschläge zur Reporterstellung»);

- Rendering – es werden die sich auf der Seite befindenden Objekte gerendert. Die Kopie entspricht dem Original. Wird angewendet für den Export grafischer Formate.


Export ins Format PDF

PDF (Portable Document Format) ist ein plattformunabhängiges Format der Firma Adobe Systems. Es wird das kostenlose Paket Acrobat Reader verwendet. Dieses Format ist recht flexibel. Es können die Schriftart, Vektoren und Raster eingefügt werden. Es eignet sich sehr gut zum Versand und der Speicherung der Dokumente, welche angezeigt und gedruckt werden sollen.

Art des Exportes - Schicht für Schicht.

Beim Export in das Format PDF, wird ein Fenster mit den Einstellungen der zu exportierenden Datei angezeigt.

Screenshot - 18.05.2009 , 19_35_09

Einstellungen:

- Komprimiert – komprimiert die Datei, erhöht jedoch die Zeit des Exportes;

- Schriften einbetten – alle Schriften die im Report verwendet werden, sind später auch in der PDF Datei vorhanden, damit diese korrekt angezeigt wird. Wo es diese Schriften nicht gibt, erhöht sich die Größe der ausgehenden Datei enorm.

- Hintergrund – der Export der Grafiken die die Seite in PDF enthält, erhöht die Größe der Datei erheblich;

- Druckoptimiert – die Grafiken werden in hoher Auflösung dargestellt, um beim Druck korrekt angezeigt zu werden. Diese Option ist sinnvoll, wenn das Dokument Grafiken enthält und deren Druck unbedingt notwendig ist. Die Größe der ausgehenden Datei wird auch hier erhöht;

- Lesezeichen – diese Option ist aktiv, wenn der Report den Reporttree enthält. Beinhaltet die Möglichkeit des Exportes des Trees in das PDF-Dokument;

- Nach Export öffnen – die PDF-Datei wird gleich nach dem Export mit dem Programm der Betrachtung der PDF-Dateien (z.B. Adobe Acrobat Reader) geöffnet.

Besonderheit des Exportes: RichText-Objekte werden wie Grafiken exportiert.


Export in das Format Open Dokument

OpenDocument Format (ODF Abkürzung für OASIS Open Document Format for Office Application) – ist ein offenes Dateienformat zur Speicherung und den Austausch von Office-Dokumenten, einschließlich von Textdokumenten (z.B. Notizen, Berichten oder Büchern), elektronischen Tabellen, Grafiken, Datenbanken, Präsentationen. Dieser Standard wurde im Unternehmen OASIS entwickelt und basiert auf dem XML-Format. Dieser Format wurde als erstes durch OpenOffice.org entwickelt und am 1. Mai 2006 als internationaler Standard ISO/IEC 26300 übernommen.

FastReport unterstützt den Export in Tabellen ( .ods Datei) und Text ( .odt Datei) OpenDocument. Diese Dateien können mit Hilfe des kostenlosen Paketes OpenOffice geöffnet werden.

Art des Exportes – Tabellarisch.

Beim Export erscheint ein Dialog mit den Einstellungen der Parameter der ausgehenden Datei.

Screenshot - 18.05.2009 , 19_39_04

Exporteinstellungen:

- Weiter – ununterbrochener Export. Die Seiten und Tabellen werden exportiert ohne unterbrochen zu werden und der Ausblendung der Spaltenbezeichnungen (diese werden nur auf der ersten und letzten Seite angezeigt). Die Option ist sinnvoll bei großen Dokumenten, die zur weiteren Bearbeitung vorgesehen sind;

- WYSIWYG – eine hundertprozentige Übereinstimmung des Äußeren der Datei beim Export. Wird die Option deaktiviert, so wird eine Optimierung durchgeführt, bei welcher die Anzahl der Spalten und Zeilen in der resultierenden Datei reduziert wird;

- Hintergrund - der Export der gewählten Hintergrundfarbe;

- Seitenumbrüche – aktiviert die Seitenumbrüche in der resultierenden Datei;

- Nach dem Export öffnen – die Datei wird gleich nach dem Export geöffnet.

Besonderheit des Exportes: RichText-Objekte werden wie einfacher Text exportiert, die Weiterleitung von Grafiken wird unterstützt.


Export in das Format RTF

RTF (Rich Text Format) wurde als Standardformat zum Austausch von Textdokumenten entwickelt. Heutzutage werden RTF-Dokumente von den meisten aktuellen Texteditoren und Operationssystemen unterstützt.

Art des Exportes – Tabellarisch.

Beim Export in das Format RTF, wird ein Fenster mit den Einstellungen der zu exportierenden Datei angezeigt.

Screenshot - 18.05.2009 , 19_35_41

Exporteinstellungen:

- Bilder – aktiviert die Möglichkeit des Exportes von Grafiken in die RTF-Datei;

- Seitenumbrüche – aktiviert Seitenumbrüche in der RTF-Datei;

- WYSIWYG – eine hundertprozentige Übereinstimmung des Äußeren der Datei beim Export. Wird die Option deaktiviert, so wird eine Optimierung durchgeführt, bei welcher die Anzahl der Spalten und Zeilen in der resultierenden Datei reduziert wird;

- Weiter – ununterbrochener Export. Die Seiten und Tabellen werden exportiert ohne unterbrochen zu werden und der Ausblendung der Spaltenbezeichnungen (diese werden nur auf der ersten und letzten Seite angezeigt). Die Option ist sinnvoll bei großen Dokumenten, die zur weiteren Bearbeitung vorgesehen sind;

- Seiten Kopf/Fuß – Ausführungsweisen: Text – wird wie gewöhnlicher Text behandelt, Kopf/Fuß – im RTF-Dokument werden diese gebildet, Nichts - Kopf/Fuß werden ignoriert;

- Nach Export öffnen – die Datei wird gleich nach dem Export mit dem voreingestellten Programm (z.B. Microsoft WordPad) geöffnet.

Besonderheit des Exportes: RichText Objekte werden komplett ins Format RTF übertragen, das Aussehen und die Größe der Datei sind stark von der Maske des Reports abhänging (Kapitel «Vorschläge zur Reporterstellung»);


Export in Excell

Excell – eine Anwendung zur Arbeit mit Tabellen. Enthalten im Microsoft Office System.

Art des Exportes – Tabellarisch.

Beim Export in Excell, wird ein Fenster mit den Einstellungen der zu exportierenden Datei angezeigt.

Screenshot - 18.05.2009 , 19_35_56

Exporteinstellungen:

- Weiter – ununterbrochener Export. Die Seiten und Tabellen werden exportiert ohne unterbrochen zu werden und der Ausblendung der Spaltenbezeichnungen (diese werden nur auf der ersten und letzten Seite angezeigt). Die Option ist sinnvoll bei großen Dokumenten, die zur weiteren Bearbeitung vorgesehen sind;

- Bilder – aktiviert die Möglichkeit des Exportes von Grafiken in die Tabelle;

- Als Text – alle Objekte werden in die Tabelle als Textobjekte übertragen. Diese Option ist nützlich beim übertragen von nummerischen Feldern mit komplexen Formatierungen;

- Fast Export – dabei wird die Übertragung der Daten optimiert und somit beschleunigt. Das Deaktivieren der Option verlangsamt die Übertragung, steigert jedoch die Vereinbarkeit beim Export, sollten Fehler dabei entstehen;

- Zellen verbinden – das Verbinden der Zellen in der entstehenden Tabelle um die maximale Ähnlichkeit mit dem Original zu erreichen. Das Deaktivieren beschleunigt den Export, das Aussehen wird jedoch schlechter.

- WYSIWYG – eine hundertprozentige Übereinstimmung des Äußeren der Datei beim Export. Wird die Option deaktiviert, so wird eine Optimierung durchgeführt, bei welcher die Anzahl der Spalten und Zeilen in der resultierenden Datei reduziert wird;

- Hintergrund - der Export der gewählten Hintergrundfarbe;

- Seitenumbrüche – aktiviert Seitenumbrüche in der Excell-Datei;

- Excell nach Export öffnen – die Datei wird gleich nach dem Export mit Excell geöffnet.

Besonderheit des Exportes: damit der Export einwandfrei funktionieren kann, ist das Vorhandensein von Excell auf dem PC unbedingt notwendig! RichText-Objekte werden wie einfacher Text exportiert, die Übertragung von Grafiken wird unterstützt.


Export in das XML-Format

XML (Extensible Markup Language). XML ist für die Aufbewahrung von strukturierten Daten vorgesehen, aber auch zum Austausch der Daten zwischen verschiedenen Programmen. FastReport verwendet das Format XML zum Übertragen der Daten in den Tabelleneditor Excell `03 und älterer Versionen.

Art des Exportes – Tabellarisch.

Beim Export in das Format XML, wird ein Fenster mit den Einstellungen der zu exportierenden Datei angezeigt.

Screenshot - 18.05.2009 , 19_36_13

Exporteinstellungen:

- Weiter – ununterbrochener Export. Die Seiten und Tabellen werden exportiert ohne unterbrochen zu werden und der Ausblendung der Spaltenbezeichnungen (diese werden nur auf der ersten und letzten Seite angezeigt). Die Option ist sinnvoll bei großen Dokumenten, die zur weiteren Bearbeitung vorgesehen sind;

- Seitenumbrüche – aktiviert Seitenumbrüche in der Excell-Datei;

- WYSIWYG – eine hundertprozentige Übereinstimmung des Äußeren der Datei beim Export. Wird die Option deaktiviert, so wird eine Optimierung durchgeführt, bei welcher die Anzahl der Spalten und Zeilen in der resultierenden Datei reduziert wird;

- Hintergrund - der Export der gewählten Hintergrundfarbe;

- Excell nach Export öffnen – die Datei wird gleich nach dem Export mit Excell geöffnet.

Besonderheit des Exportes: RichText-Objekte werden wie einfacher Text exportiert, die Übertragung von Grafiken wird nicht unterstützt.


Export ins CSV-Format

Die CSV-Datei enthält Werte in Form von Tabellen und diese sind so angeordnet, dass jeder Wert in der Spalte vom Wert der folgenden Spalte durch Trennzeichen getrennt ist und jede neue Reihe beginnt in einer neuen Zeile. Dieses Format kann in verschiedene Tabelleneditoren importiert werden.

Art des Exportes – Tabellarisch.

Beim Export in das Format CSV, wird ein Fenster mit den Einstellungen der zu exportierenden Datei angezeigt.

Screenshot - 18.05.2009 , 19_38_01

Exporteinstellungen:

- OEM Zeichensatz – Auswahl des OEM Zeichensatzes der CSV-Datei;

- Trennzeichen – Trennzeichen der Werte;

- Nach Export öffnen – die Datei wird gleich nach dem Export mit dem voreingestellten Programm geöffnet.

Besonderheit des Exportes: Das Reportdesign wird beim Export in dieses Format nicht gespeichert. Grafiken werden nicht unterstützt.


Export in das HTML-Format

HTML (Hypertext Markup Language) – gilt als die Standardsprache im Internet. HTML wurde entwickelt um wissenschaftliche und technische Dokumentationen auszutauschen, welche von Leuten verwendet werden sollten, die nicht Spezialisten auf dem Gebiet der Verschachtelungen sind. Es dient der Erstellung von einfachen aber optisch guten Dokumenten. Um die Dokumentenstruktur zu vereinfachen, wird Hypertext unterstützt.

Art des Exportes – Tabellarisch.

Beim Export in das HTML-Format, wird ein Fenster mit den Einstellungen der zu exportierenden Datei angezeigt.

Screenshot - 18.05.2009 , 19_35_28

Exporteinstellungen:

- Stile – Export der Stile der Textobjekte. Das Deaktivieren beschleunigt den Prozess des Exportes, das Aussehen wird jedoch verschlechtert;

- Alles in einen Ordner – alle zusätzlichen Dateien werden im selben Ordner aufbewahrt wie die Hauptdatei;

- Seitennavigator – ein spezieller Navigator wird erstellt zur schnelleren Navigation über die Seiten;

- Feste Breite – die automatische Änderung der Tabellenbreite bei Änderung der Größe des Fensters wird blockiert;

- Mehrfachseite – jede Seite wird in einer separaten Datei gespeichert;

- Hintergrund – Export grafischer Attribute, die auf der Seite vorhanden sind;

- Bilder – aktiviert die Möglichkeit der Darstellung von Grafiken;

- Nach Export öffnen – die Datei wird gleich nach dem Export mit dem voreingestellten Programm geöffnet.

Besonderheit des Exportes: der Export kann aus mehreren Dateien bestehen, Grafiken werden unterstützt und jede separat in einer eigenen Datei gespeichert. RichText Objekte werden als einfacher Text exportiert, das Aussehen und die Größe der Datei sind stark von der verwendeten Maske des Reportes abhängig (Kapitel «Vorschläge zur Reporterstellung»).


Export in ein Textformat

Standard Textdatei – enthält Informationen aus dem Report, diese ist maximal optimiert und umgewandelt in Zusammenhang mit der Besonderheit des gegebenen Formates.

Art des Exportes – Tabellarisch.

Beim Export in Text, wird ein Fenster mit den Einstellungen der zu exportierenden Datei angezeigt.

Screenshot - 18.05.2009 , 19_38_33

Exporteinstellungen:

- Seitenumbrüche – aktiviert Seitenumbrüche in der ausgehenden Datei;

- Leerzeilen – Export leerer Zeilen;

- Rahmen – Export von Rahmen der Textobjekte;

- OEM Zeichensatz – die Auswahl des OEM Zeichensatzes in der entstehenden Datei;

- Nach Export öffnen – die Datei wird gleich nach dem Export mit dem voreingestellten Programm geöffnet.

Besonderheit des Exportes: die Formatierung des Reporte wird beim Export in dieses Format nicht beibehalten. Grafiken werden nicht unterstützt und die Seitenbreite ist von den enthaltenen Textobjekten abhängig.


Export in Formate Jpeg, BMP, Gif, Tiff

FastReport erlaubt den Export in folgende grafische Formate.

- JPEG (Joint Photographic Experts Group) – das Format basiert auf dem Komprimierungsalgorithmus. Dieses sucht nicht die gleichen Elemente, sondern betrachtet den Abstand zwischen den Pixeln. Es hebt sich durch einen hohen Stand der Kompression hervor, jedoch auf Kosten eines Teilverlustes von grafischen Informationen.

- BMP (Windows Device Independent Bitmap) – wird zur Speicherung von Rasterdarstellungen verwendet, die zur Verwendung in Windows vorgesehen sind. Es ist das Standardformat der Dateien für Computer die Windows besitzen.

- GIF (Graphics Interchange Format) – Unabhängig von der Hardware, unterstützt das GIF-Format den Transfer von Bitmap-Dateien in Netzwerken. Dies erlaubt die hohe Komprimierung der Dateien, welche viele gleichartige Inhalte besitzen (Logos, Aufschriften, Pläne)

- TIFF, TIF (Target Image File Format) – ein unabhängiges Format. Eines der am weitverbreitesteten und zuverlässigsten Formate in Polygrafie und im Faksimile-Übertragung von Informationen

Art des Exportes – Rendering.

Beim Export in eines der oben genannten Grafikformate, wird ein Fenster mit den Optionen der Darstellung geöffnet.

Screenshot - 18.05.2009 , 19_36_30

Exporteinstellungen:

- Einzelne Dateien – ist die Option aktiviert, so wird jede Seite des Reports in eine separate Datei exportiert. Der Name der Datei wird der gewünschte sein, mit dem Zusatz der Unterstreichung und Seitenzahl;

- Schwarz/Weiss – die Darstellung in Schwarz/Weiss;

- Seiten zuschneiden – nach dem Export wird die freie Fläche an den Seiten abgeschnitten;

- JPEG Qualität – die Ebene der Komprimierung der JPEG-Datei. Die Option ist nur aktiv beim Export in das JPEG-Format;

- Auflösung (dpi) – die Auflösung der ausgehenden grafischen Darstellung;

Besonderheit des Exportes: beim Export einiger Seiten in eine Datei (deaktivierte Option "Einzelne Dateien" muss die hohe Ressourcennutzung des Exportes beachtet werden.


Versand des Reportes über E-Mail

Versand des Reportes uber E-Mail

FastReport erlaubt den Versand des fertigen Reportes über E-Mail in dem benötigten Format. Es braucht keine unterstützenden Programme.

Bei Auswahl des Exportes über E-Mail, wird ein Dialog aufgerufen, in dem die Optionen der E-Mail und des zu exportierenden Formates eingestellt werden.

Vor der Erstellung des Exportes und dessen Versand über E-Mail, ist es wichtig die Benutzerparameter des E-Mail Fachs einzustellen. Diese Einstellungen befinden sich im Tab "eMail Konto":

Screenshot - 18.05.2009 , 19_37_44

- Absender Name – Name des Absenders;

- Absender Adresse – E-Mail Adresse des Absenders;

- Organisation – das Unternehmen des Absenders;

- Signatur – Signatur des Briefes. Diese kann automatisch erstellt werden, beim Klicken auf "Erstellen", wenn die vorherigen Felder ausgefüllt worden sind;

- Server - Adresse des SMTP Servers;

- Port - des SMPT Servers;

- Login – Login des Zuganges zu dem SMPT Server, wenn dies notwendig ist;

- Kennwort – Kennwort der Autorisierung;

- Eigenschaften speichern – diese werden für weitere Benutzung gespeichert.

Nachdem die Einstellungen zum Versand der E-Mail festgelegt worden sind (dies muss nur einmal gemacht werden), müssen die Eigenschaften des E-Mail selbst festgelegt werden im Tab «eMail»:

Screenshot - 18.05.2009 , 19_37_20

- Adresse – die E-Mail Adresse des Empfängers. Die früher gewählten Adressen können aus der Drop-Down-Liste ausgewählt werden;

- Betreff – Betreff der E-Mail. Die früher gewählten Betreffe können aus der Drop-Down-Liste ausgewählt werden;

- Text – Text der E-Mail;

- Format – das Format des Anhangs. Kann aus den oben erwähnten Formaten ausgewählt werden, aber auch das Format des fertigen Reportes kann ausgesucht werden (.FP3);

- Erweiterte Export Einstellungen – ist diese Option aktiviert, so wird nach dem Klicken auf «OK» ein Fenster mit den Einstellungen des gewählten Formates aufgerufen. Ansonsten werden die standardmäßig verwendeten Einstellungen benutzt.

Besonderheit des Exportes über E-Mail: es wird nur der plain der Autentifizierng auf SMTP Servern unterstützt. Wird die Authentifizierung nicht verlangt, so müssen die Felder «Login» und «Kennwort» in den Einstellungen nicht ausgefüllt werden.


Vorschläge zur Reporterstellung

Vorschlage zur Reporterstellung

 Top Previous

Es ist wichtig zu erwähnen, dass die Qualität des Exportes sehr stark von der Art der Erstellung der Maske abhängig ist. FastReport besitzt umfangreiche Möglichkeiten zur Manipulation der Objekte bei der Herstellung der Reportmaske. Dadurch besitzt man viele Vorteile bei der schnellen Generierung der Reporte und dem Druck dieser. Das gedruckte Dokument wird genauso aussehen wie auf dem Monitor, was auch das eigentliche Ziel des Reportgenerators FastReport ist. Auf der anderen Seite dieser Freiheit bei der Erstellung, ist das komplizierte Exportieren des erhaltenen Dokumentes in verschiedene Formate. Diese besitzen eigene, oftmals große Beschränkungen in der Darstellung der Daten. In diesem Kapitel werden Vorschläge gegeben bei der Erstellung der Reporte, welche zum Export vorgesehen sind.

Viele Formate verwenden tabellarische Darstellungen der Daten. Vor allem sind es die Formate HTML, XLS, XML, RTF und CSV. Die Überschneidungen und Schichtung der Zellen sind in diesen Formaten nicht zulässig (insbesondere HTML und RTF). Im Gegensatz zu den Freiheiten beim Prozess der Maskenerstellung im Designer FastReport. Die Exportfilter beachten diese Anforderungen beim Transfer der Objekte in das benötigte Format. Dies wird durch spezielle Algorithmen der Übertragung und der optimalen Anordnung ermöglicht. An Stellen wo sich die Objekte überschneiden werden neue Spalten und Zeilen in der neuen Tabelle gebildet. Dies ist notwendig zur genaueren Positionierung der übertragenden Objekte in FastReport zu erhalten und die größtmögliche Übereinstimmung zwischen der ursprünglichen und der gedruckten Datei zu erreichen. Viele, sich überschneidende Objekte im Report führen dazu, das sich die Anzahl der Spalten und Zeilen in der Tabelle erhöht. Dies erschwert die weitere Verwendung der Datei und verlangsamt den Export dieser.

Zum Beispiel ist im Report eine geringfügige Überschneidung von zwei Objekten vorhanden. Diese befinden sich auf einem Band und überschneiden sich. Die Zahl der Einträge bei der Erstellung des Reportes beträgt 150. Beim Export in das Format RTF werden 450 Zeilen in der Tabelle erstellt (150 für jedes Objekt und 150 für die Überschneidung). Wird die Überschneidung behoben, wird die Zahl auf 300 reduziert. Bei großen Reporten und und hoher Anzahl der Objekte wird der Unterschied enorm sein, auch in der Größe der ausgehenden Datei.

Objekte auf der Reportseite Objekte nach dem Export in Excell

Sie müssen dies beachten bei der Erstellung der Maske, falls Sie vorhaben diese später in verschiedene Formate zu exportieren.

Bei der Erstellung der Tabellen in den Reporten, achten Sie darauf, dass die Ränder der Zellen aneinanderliegen. Es ist wichtig, dass sich die Zellen nicht überschneiden und nicht übereinanderliegen. Der Algorithmus des Exportfilters wird die Zellen anpassen, aber das Resultat des Exportes kann von dem gewünschten abweichen (sprich man sieht nicht das, was man erwartet hat). Plazieren Sie die Objekte so, dass diese auf einer Linie liegen; vertikal und horizontal. Dabei helfen die Hilfslinien:

Um die Hilfslinien verwenden zu können, klicken Sie auf das Lineal oben bzw. links und bei festgehaltener Maustaste ziehen Sie die Linie auf die Seite. Dort legen Sie sie auf dem gewünschten Platz ab. Sie können nun die Objekte entlang der vertikalen/horizontalen Linie anordnen.

Überlappungen der Zellen können ebenfalls durch die Ausrichtung der Textobjekte an den Gitterlinien vermieden werden. Achten Sie darauf das diese Option im Designer aktiviert ist. Um die Ausrichtung zu vereinfachen, kann der Abstand der Gitterlinien erhöht werden. Die Abstände und die Ausrichtung kann man im Menü des Designers unter «Ansicht|Optionen...» einstellen:

Screenshot - 18.05.2009 , 19_45_16

Für die Rahmenlinien der Textobjekte ist es besser die integrierten Möglichkeiten der Textobjekte und nicht die grafischen Objekte wie Linien, Rechtecke und weitere zu verwenden. Versuchen Sie nicht Hintergrundobjekte unter durchsichtige Textobjekte zu legen.

Die Anwendung dieser einfachen Regeln, erlaubt die Erstellung von Reporten, die nach dem Export in ein Format welches tabellarisch ist, ein professionelles Aussehen besitzen.

Die unten aufgeführten Beispiele zeigen einmal die falsche und einmal die richtige Anordnung der Objektanordnung bei der Erstellung der Reportmaske.

falsch richtig

Die Objekte sind horizontal ausgerichtet. Wenn möglich sollte bei der Ausrichtung auf die hervorgehobenen Linien geachtet werden. Dadurch erhalten die Objekte eine gleichmäßige horizontale Ausrichtung.

falsch

richtig

Die Objekte überschneiden sich. In einem solchem Fall werden bei einem Export in ein Tabellenformat zusätzliche, nutzlose Spalten und Zeilen gebildet. Auch entstehen drei zusätzliche Zellen im Bereich der Überschneidung.

Um die Grundlagen der optimalen Reporterstellung zu erlernen, empfehlen wir, sich mit den Beispielen (welche im Set FastReport enthalten sind) vertraut zu machen.