JasperReports 4.0.1: Utilizando Subreports e parâmetros
Autor: andii.brunetta | Publicado: 2011-06-04T22:16:00-04:00


Para esta não ser uma postagem muito extensa, irei utilizar o mesmo projeto e o mesmo relatório criado na postagem: agrupando de dados com JasperReports. Para completar esse projeto, logo abaixo do agrupamento eu vou listar os dados dos cliente, ou seja, terei um relatório de clientes embutido no relatório de pedidos (claro que pode ser feito outras coisas, este é apenas um exemplo)



Começando...

Então lá no projeto Pedidos (link acima), dentro do pacote pedidos.dao, vamos criar uma classe Java como o nome de ClienteDAO, seguindo a mesma linha da classe PedidoDAO, temos:
public class ClienteDAO {

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("PedidosPU");
    EntityManager em = emf.createEntityManager();

    public List&lt;Cliente&gt; listarClientes() {
        List&lt;Cliente&gt; clientes = null;
        try {
            Query query = em.createQuery("Select c from Cliente c order by c.nome");
            clientes = query.getResultList();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            em.close();
        }
        return clientes;
    }
}



No iReport, vamos editar o relatório pedidos.jrxml, criando também no link da postagem acima.

Para começar no relatório vamos adicionar a band Summary:







Precisamos criar um parâmetro que será enviado pelo projeto, para isso no Report Inspector, clique com o botão direito em Parameters, e em Adicionar Parameter:









Selecione o parameter1 e vá nas propriedades para configurá-lo, altere o nome para listaClientes e o Parameter class para java.util.List, pois passaremos por parâmetro uma lista de clientes:









Na paleta procure pelo elemento Subreport, arraste-o para a band Summary, a partir de agora siga as imagens abaixo:









Clique em próximo, na janela abaixo selecione o tipo Blank A4:









Clique em próximo novamente, como estamos usando JavaBean datasource, e não utilizamos datasource, configure como na imagem:








Avance de novo:




Mais uma vez:




Na janela abaixo informe o nome do Subreport, nesse caso será chamado de pedidos_subreport:








No passo 7, habilite a opção "Use a JRDatasource expression", e clique no botão do lado da caixa de texto, a seguinte janela aparecerá, nela nós convertemos a listaClientes em um JRBeanCollectionDataSource :









Ao clicar em Apply voltamos para a seguinte janela:









E aqui basta finalizar...

No relatório que foi criado, deixe apenas as bands - Title, Column Header e Detail 1:







Como será uma lista de clientes, precisamos pegar da classe Cliente os seguintes fields - codigo, nome e limiteCredito... para isso em Report Query, na aba JavaBean Datasource:







Feito isso...

Como visto em postagens anteriores, estruture o relatório para que fique assim:




Ah, lembre-se de nas propriedades do relatório alterar a linguagem para Java, já que estamos usando JavaBean datasource:




Depois disto basta compilar nosso subreport, para poder gerar o pedidos_subreport.jasper&nbsp;

Voltamos ao pedidos.jrxml, e vamos fazer umas ultimas configurações, temos este resultado:





Precisamos criar mais um parâmetro que será uma String com o caminho de onde encontrar o pedidos_subreport.jasper, repita o mesmo passo que foi feito para criar o listaClientes, mas dessa vez use as seguintes propriedades:









Agora precisamos setá-lo no lugar certo... para isso: veja que na band Summary tem um elemento que representa o subreport, clique nele e vá nas propriedades, procure por Subreport Expression, e configure-o assim:









Feito todos esses passos, pode compilar novamente o relatório principal (pedidos)...

Caso não ocorra nenhum erro, voltamos ao projeto Pedidos no NetBeans.



No projeto..

No pacote pedidos,controle.relatorios, substitua o pedidos,jasper pelo que foi compilado agora, e adicione o pedidos_subreport.jasper, ficando assim:







Para finalizar de vez, precisamos fazer algumas alterações no método gerarRelatorio() da classe PedidoControle.java:
public void gerarRelatorio() {
     String arquivo = "src/pedidos/controle/relatorios/pedidos.jasper";

     pedidoDAO = new PedidoDAO();
     clienteDAO = new ClienteDAO();

     Map parametros = new HashMap();
     parametros.put("localizacaoPedidosSubreport", "src/pedidos/controle/relatorios/pedidos_subreport.jasper");
     parametros.put("listaClientes", clienteDAO.listarClientes());

     JRDataSource jrds = new JRBeanCollectionDataSource(pedidoDAO.listarPedidos());
    gerarRelatorioDesktop(jrds, parametros, arquivo);
}



No começo da classe lembre-se de adicionar a declaração do ClienteDAO, assim como foi feito para PedidoDAO...
Vamos ver o que foi alterado no método...
Primeiro, depois de declarado o atributo clienteDAO no inicio da classe, na linha 5 estamos inicializando-o.
Da linha 7 a 9, criamos um Map, com os parâmetros que criamos lá no iReport... e por fim... na linha 12, passávamos o parâmetro como null, agora este é substituído e passamos o Map parametros&nbsp;por parâmetro.

Assim podemos executar nosso projeto e ver o seguinte resultado:






Por aqui ficamos... admito que tive alguns probleminhas ao conseguir utilizar o JavaBean datasource no subreport, o que me levou a pedir um help no Twitter onde o&nbsp;@altitdb me ajudou! por isso deixo os devidos créditos à ele :)


Créditos da postagem: Altieres de Matos, pois ele salvou minha aula sobre Subrepot hehe (pois é, tive problemas ao usar Subreport com JavaBean datasource)