Raport cu Grupuri
Raport cu Grupuri
În exemplul anterior, am construit un raport pe două niveluri bazat pe datele din două tabele. Un alt raport care arată la fel poate fi construit în FastReport, de data aceasta bazat pe un set de date obținut dintr-o interogare combinată.
Pentru a face acest lucru, este necesară o interogare SQL care returnează date din ambele tabele și este sortată într-un mod particular .În exemplul nostru, tabelele vor fi unite pe câmpul "acSubject" din clienți și câmpul "acConsignee" din tabelul de comenzi. Interogarea ar putea fi:
select *
from tHE_SetSubj, tHE_Order
where tHE_SetSubj.acSubject = tHE_Order.acConsignee
order by tHE_SetSubj.acSubject
Linia "order by" este necesară pentru a sorta înregistrările pe câmpul “acSubject” (client).
Cum poate fi proiectat un raport multi-nivel folosind aceste date? Există un band special, “Antet Grup”. O condiție (o valoare a câmpului din baza de date sau o expresie) este specificată pentru band; band-ul este generat de fiecare dată când valoarea condiției se schimbă. Exemplul următor ilustrează acest lucru.
Să creăm un nou proiect în Delphi și să plasăm componenta “TfrxDlDBQuery”. Setează proprietățile noii componente numite "DlDBQuery1" așa cum este arătat aici:
SQL =
'select *
from tHE_SetSubj, tHE_Order
where tHE_SetSubj.acSubject = tHE_Order.acConsignee
order by tHE_SetSubj.acSubject'
UserName = 'Group'
Adaugă un band “Antet grup” la raport. Setează o condiție (în acest caz câmpul de date “Group.acSubject”) în editorul band-ului “Antet grup”:

De asemenea, leagă band-ul de date la sursa de date “Group” și aranjează câteva obiecte așa cum este arătat (reține că antetul grupului trebuie plasat deasupra band-ului de date):

Band-ul “Antet grup” este generat doar atunci când câmpul la care este legat își schimbă valoarea. În caz contrar, band-ul de date conectat la setul de date “Group” este afișat. Dacă comparăm acest raport cu raportul master-detail construit anterior, este evident că numerele de ordine nu sunt deloc sortate. Acest lucru poate fi corectat cu ușurință prin schimbarea clauzei 'order by' a interogării SQL:
select *
from tHE_SetSubj, tHE_Order
where tHE_SetSubj.acSubject = tHE_Order.acConsignee
order by tHE_SetSubj.acSubject, tHE_Order.acKey

Rapoartele cu grupuri imbricate pot fi proiectate într-un mod similar. Adâncimea imbricării grupurilor este nelimitată. Rapoartele care folosesc grupuri au unele avantaje față de rapoartele de tip master-detail:
- întregul raport necesită doar un singur set de date (interogare)
- numărul nivelurilor de grupare a datelor este nelimitat
- sortarea datelor devine posibilă
- utilizarea mai optimă a resurselor bazei de date (interogarea returnează doar un singur set de date pentru ieșire, cu filtrarea efectuată de interogare).
Singura dezavantaj este necesitatea de a scrie interogări în limbajul SQL. Cu toate acestea, o cunoaștere de bază a SQL este practic obligatorie pentru orice programator care lucrează cu baze de date.