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.