In diesem Artikel möchte ich Ihnen eine leistungsstarke FastReport-Funktion wie „Berichte mit mehreren Ebenen“ vorstellen. Sie können ihre Struktur mit einem Baum vergleichen: “Stamm, dickere Äste, dünnere Äste, und so weiter bis zu den Blättern” oder mit der Struktur eines Unternehmens “Abteilungen, Unterabteilungen, Mitarbeiter”. Sie werden oft “Master-Detail” oder “Master-Slave” genannt und solche Berichte werden aus mehreren Tabellen erstellt. Eine Tabelle enthält eine Liste der Hauptentitäten, eine andere, die mit der ersten Tabelle verknüpft ist, enthält eine Liste der untergeordneten Entitäten mit einer Verknüpfung zur ersten Tabelle. Eine bestimmte Entität aus der ersten Tabelle ist einer bestimmten Entität aus der untergeordneten Tabelle untergeordnet usw.
FastReport unterstützt die Einschachtelung von bis zu 6 Ebenen (mehr kann mit dem "Unterbericht"-Objekt gemacht werden, aber dazu später mehr). In der Praxis ist es nur selten notwendig, Berichte mit umfangreichen Datenschachtelungen zu drucken; in der Regel ist dies auf eine bis drei Ebenen beschränkt.
Betrachten wir als Beispiel die Erstellung eines Berichtes mit zwei Ebenen. Er enthält Daten aus den Tabellen „Customer“ und „Orders“. Die erste Tabelle ist eine Liste der Kunden und die zweite ist eine Liste der Bestellungen von Kunden. Die Tabellen enthalten Daten der folgenden Art:
Customer:
CustNo Company
1221 Kauai Dive Shoppe
1231 Unisco
1351 Sight Diver
Orders:
OrderNo CustNo SaleDate
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 Sie sehen können, enthält die zweite Tabelle eine Liste aller Bestellungen aller Kunden. Um eine Liste der Bestellungen eines bestimmten Kunden zu erstellen, wählen Sie aus der Tabelle die Datensätze aus, deren Feld CustNo = Nummer des ausgewählten Kunden ist. Der auf diesen Daten basierende Bericht wird wie folgt aussehen:
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
Beginnen wir mit der Berichterstellung. Erstellen Sie ein neues Projekt in Delphi, fügen Sie in das Formular zwei TTable-Komponenten, eine TDataSource-Komponente, zwei TfrxDBDataSet-Komponenten und eine TfrxReport- Komponente ein.
Konfigurieren Sie die Komponente wie folgt:
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'
Verknüpfen Sie im Berichtsdesigner unsere Datenquellen im Fenster "Bericht|Daten…".
Fügen Sie der Seite die Bänder "Daten der Ebene 1" (master) und " Daten der Ebene 2" (detail) hinzu. Und aus dem Daten-Panel (rechts) ziehen Sie die Felder der Tabellen (Master und Slave) zu den entsprechenden Bändern. Es wird etwa so aussehen:
Bitte beachten Sie, dass das Band "Daten der Ebene1" oben platziert werden sollte! Wenn Sie unter das Band "Daten der Ebene2" platzieren, meldet FastReport beim Starten des Berichtes einen Fehler.
Beim Starten sehen wir jetzt, dass die Bestellliste für jeden Kunden gleich ist und alle Einträge aus der Tabelle „Orders“ enthält. Dies geschah, weil wir die Filterung der Einträge in der Tabelle „Orders“ nicht aktiviert hatten.
Zurück zu unseren Datenquellen. Für die Komponente Table2 setzen Sie die Eigenschaft MasterSource = DataSource1. Somit haben wir eine Master-Slave-Beziehung aufgebaut. Nun müssen Sie die Bedingung zum Filtern von Datensätzen in der Slave-Quelle festlegen. Rufen Sie dazu den Editor der MasterFields-Eigenschaft der Table2-Komponente auf:
Wir müssen die beiden CustNo-Felder in beiden Quellen verknüpfen. Wählen Sie dazu den Index CustNo aus der oberen Liste aus, markieren Sie die Felder und klicken Sie auf "Add". Die verknüpften Felder werden in das untere Fenster verschoben. Schließen Sie dann den Editor mit ОК.
Beim Starten des Berichtes führt FastReport folgende Schritte aus. Nach der Auswahl des nächsten Datensatzes in der Haupttabelle (Customer) wird der Filter für die die Untertabelle (Orders) gesetzt. Nur die Datensätze, die die Bedingung Orders.CustNo = Customer.CustNo erfüllen, bleiben in der Tabelle, d.h. für jeden Kunden werden nur seine Bestellungen angezeigt:
Ebenso können Berichte mit bis zu 6 Datenebenen erstellt werden.