Relatório com grupos
No exemplo anterior criamos um relatório de dois níveis baseado nos dados de duas tabelas. É possível construir outro relatório com o mesmo aspecto no FastReport, que desta vez é baseado em um conjunto de dados obtido de uma consulta conjunta.
Para fazer isso é necessário uma consulta SQL que retorna dados de ambas as tabelas ordenado de maneira específica. Em nosso exemplo, as tabelas serão unidas nos campos "CustNo", que estão presentes em ambas as tabelas. A consulta pode ser:
select * from customer, orders
where orders.CustNo = customer.CustNo
order by customer.CustNo
A linha "order by" é necessária para ordenar os registros no campo "CustNo". Esta consulta retorna um conjunto de dados parecido com isto:
CustNo Company OrderNo SaleDate
1221 Kauai Dive Shoppe 1023 01.07.1988
1221 Kauai Dive Shoppe 1123 24.08.1993
1231 Unisco 1060 28.02.1989
1351 Sight Diver 1003 12.04.1988
1351 Sight Diver 1052 06.01.1989
1351 Sight Diver 1055 04.02.1989
Como é possível fazer o design de um relatório de vários níveis usando estes dados? No FastReport há uma banda especial, o "Cabeçalho de Grupo". Uma condição (um campo de BD ou uma expressão) é especificada para a banda; a banda é exibida sempre que o valor da condição for alterado. O exemplo a seguir ilustra isso.
Crie um relatório novo no designer do FastReport. Coloque um componente "Consulta ADO" na página e configure suas propriedades:
SQL =
select * from customer, orders
where orders.CustNo = customer.CustNo
order by customer.CustNo
UserName = 'Group'
Depois adicione uma banda "Cabeçalho de Grupo" ao relatório. Defina uma condição (neste caso o campo de dados "Group.CustNo") no editor da banda "Cabeçalho de Grupo":
Também vincule a banda de dados à fonte de dados "Group" e arranje alguns objetos como mostrado abaixo (observe que o cabeçalho do grupo deve ser colocado acima da banda de dados):
Ao visualizar o relatório, obtemos uma saída similar a isto:
Como você pode ver, a banda "Cabeçalho de Grupo" é exibida somente quando o valor do campo ao qual é vinculada é alterado. Caso contrário, a banda de dados conectada ao conjunto de dados "Group" é exibida. Se compararmos este relatório ao relatório mestre-detalhe criado anteriormente, é óbvio que os números de pedidos não são ordenados. Isso pode ser corrigido com facilidade ao alterar a cláusula 'order by' da consulta SQL:
select * from customer, orders
where orders.CustNo = customer.CustNo
order by customer.CustNo, orders.OrderNo
É possível fazer o design de relatórios que possuam grupos aninhados de maneira similar. A profundidade de grupos aninhados é ilimitada. Relatórios que usam grupos têm algumas vantagens sobre relatórios do tipo mestre-detalhe:
todo o relatório precisa de somente um conjunto de dados (consulta)
o número de níveis de agrupamento de dados é ilimitado
é possível ordenar os dados
uso mais otimizado dos recursos de BD (a consulta retorna apenas um conjunto de dados para saída e a filtragem é executada pela consulta).
A única desvantagem é a necessidade de escrever consultas na linguagem SQL. No entanto, o conhecimento básico de SQL é praticamente obrigatório para qualquer programador que trabalhe com bancos de dados.