Bericht mit zwei Datenebenen (master-detail) in Delphi/Lazarus am Beispiel von FastReport VCL / FMX

Bericht mit zwei Datenebenen (master-detail) in Delphi/Lazarus am Beispiel von FastReport VCL / FMX

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.

Beispiel für die Entwicklung eines Berichts mit mehreren Ebenen

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. 

Formular mit Komponenten

Verbinden Sie Daten aus der Datenbank mit Berichtsobjekten 

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…". 

Verknüpfen mit Datenquellen

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:

Berichtsvorlage

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:

MasterFields-Eigenschaftseditor

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:

Endbericht

Ebenso können Berichte mit bis zu 6 Datenebenen erstellt werden.

Fast Reports
  • 800-985-8986 (Englisch, die USA)
  • +4930568373928 (Deutsch)
  • +55 19 98147-8148 (Portugiesisch)
  • info@fast-report.com
  • 901 N Pitt Str #325 Alexandria VA 22314

© 1998-2024 Fast Reports Inc.
Trustpilot