Esse artigo faz parte da revista Java Magazine edição 38. Clique aqui para ler todos os artigos desta edição

 

img

 

Clique aqui para ler todos os artigos desta ediçãoimagem_pdf.jpg

 

Mais relatórios Passo a Passo

Totalizações e gráficos com iReport e JasperReports

Aprenda como definir agrupamento e calcular totais em vários níveis em um relatório mestre-detalhe, e veja como criar um gráfico de resumo no final do relatório

 

No artigo “Relatórios na Web Passo a Passo”, na edição anterior, apresentamos o JasperReports e o iReport e mostramos como criar um relatório mestre-detalhe completo, que lista detalhes dos pedidos de clientes. Neste artigo, vamos incrementar o relatório definindo grupos e acrescentando diversas totalizações. Também vamos mostrar como criar e configurar gráficos no relatório

Sobre o projeto de exemplo

O projeto utilizado neste artigo permite a execução de um relatório a partir de uma aplicação web. Ele é baseado em quatro entidades principais: pedidos, itens de pedido, clientes e produtos. Os dados do relatório são obtidos a partir de um banco MySQL, e o modelo de dados é mostrado na Figura 1.

 

img

Figura 1. Modelo de dados do projeto de exemplo.

 

A Figura 2 representa o resultado final desse relatório. O quadro “Como criar o relatório inicial” resume os passos para a criação. O projeto completo, com todas as classes necessárias, os templates de relatório .jrxml e o script para criação do banco de dados, está disponível no site da Java Magazine. Os leitores que não acompanharam o artigo na edição anterior poderão obter esse exemplo pronto, e partir dele para realizar as mudanças detalhadas aqui. Será disponibilizado no download tanto o projeto inicial, como o projeto final, resultado das alterações feitas neste artigo.

 

img

RelatorioPedidos.jrxml

img

RelatorioItens.jrxml

img

Figura 2. Relatório e sub-relatório iniciais (como criados na edição anterior), e resultado da execução do relatório

 

Agrupando pedidos por cliente

Repare na Figura 2 que, quando um cliente tem diversos pedidos, os dados do cliente (no caso, o nome) aparecem repetidos para cada pedido. Vamos melhorar o relatório, agrupando todos os pedidos de um cliente e imprimindo somente uma vez os seus dados. Para isso precismos definir um grupo para fazer quebra de pedidos por cliente.

Quando um grupo é criado no JasperReports, automaticamente são criadas duas novas bandas: nomegrupoHeader e nomegrupoFooter (por exemplo, clienteHeader e clienteFooter para um grupo com nome cliente). Colocamos nestas bandas as informações associadas ao grupo, que neste caso são o nome do cliente e o valor total do cliente; já os dados de cada item do grupo permanecem na banda detail, que são os pedidos e itens de pedido do cliente.

Também é preciso definir uma expressão de agrupamento utilizada pelo JasperReports para fazer a quebra do grupo. Usamos o nome do cliente. Para que os grupos sejam apresentados da maneira esperada, é preciso que a fonte de dados também esteja ordenada corretamente, ou seja, a consulta SQL deve ter a cláusula “order by” (ou se for usado um datasource de JavaBeans, deve-se passar uma coleção com os objetos já ordenados de forma compatível com os grupos desejados, neste caso o nome do cliente). 

Pode haver vários grupos “aninhados”; por exemplo um grupo Região, que engloba todos os clientes de uma determinada região; dentro deste um grupo Estado, e assim por diante. Quando o grupo mais “externo” for reinicializado, todos os grupos contidos nele também o serão.

Os passos para a criação do grupo são os seguintes:

1. No iReport, abra o arquivo do relatório, RelatorioPedidos.jrxml.

2. Clique no ícone de grupos (img) na barra de ferramentas, e depois em New. Na janela que aparece, configure o grupo conforme a Figura 3 e clique em OK.

 

img

Figura 3. Tela de configuração do grupo de quebra de pedidos por cliente.

 

3. Mova o textfield que mostra o nome do cliente da banda detail para a banda clienteHeader, que acabou de ser criada. Na aba Text Field das propriedades do textfield, altere a Textfield expression para:

...

Quer ler esse conteúdo completo? Tenha acesso completo