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
orderby customer.CustNo
Die Zeile "order by" benötigt man zur Sortierung anhand von CustNo. Die Anfrage zeigt die Daten so an:
CustNoCompany…OrderNoSaleDate
1221 Kauai Dive Shoppe102301.07.1988
1221 Kauai Dive Shoppe112324.08.1993
1231Unisco106028.02.1989
1351Sight Diver100312.04.1988
1351Sight Diver105206.01.1989
1351Sight Diver105504.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.
Query1:
DatabaseName = 'DBDEMOS'
SQL =
select * from customer, orders
where orders.CustNo = customer.CustNo
order by customer.CustNo
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:
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
orderby 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.