Como passar a consulta dinamicamente para o JasperReports / iReport

Essa semana me deparei com um problema no trabalho que levei alguns minutos estudando a melhor solução. Eu tinha um relatório que deveria ser gerado com o JarperReports cuja consulta a ser realizada no banco poderia mudar constantemente, de acordo com o filtro que o usuário selecionasse na tela. Uma solução me veio à cabeça imediatamente: mandar um ArrayList para o JasperReports com o resultado da minha consulta para que ele preencha os dados. Essa solução é prática e fácil de implementar, mas esse ArrayList poderia ficar muito grande, visto que meu banco possuía muitas informações.

A melhor solução que encontrei foi passar a consulta inteira como parâmetro para o JasperReports fazer a consulta no banco. Para ilustrar como fazer isso, vamos aos passos abaixo:

Leia mais

Client-side X Server-side em JSF. Onde salvar o estado?

Um das decisões mais debatidas em JSF ou Seam e que os desenvolvedores dão pouca importância é onde salvar a árvore de componentes da view. Há duas opções disponíveis: do lado do cliente (client-side) e do lado do servidor (server-side), cada uma com suas vantagens e desvantagens.

Para entender melhor, vamos ver o ciclo de vida do JSF, entender em que contexto se encontra a criação da árvore de componentes, e porque ela existe:

Leia mais

Implementando converter e validator de CNPJ

Dando continuidade ao assunto anterior, vou agora mostrar como criar converter e validator de CNPJ. Lembrando que a lógica de validação/conversão vai estar completamente inserida dentro das classes que implementam javax.faces.convert.Converter e javax.faces.validator.Validator. Aqui no meu trabalho colocamos essa lógica em classes Java separadas. Geramos um jar com essas classes e então colocamos esse jar no classpath da aplicação, evitando replicação de código.

Outro detalhe é que a classe de validação lança uma exception chamada FormatoCNPJException que é uma classe que extende Exception quando o CNPJ é inválido apenas para o código ficar mais claro. Não vou colocar o código dessa classe aqui no post para o artigo não ficar muito grande, portanto será necessário implementar essa classe caso você queira testar meu exemplo de validação.

Se você deseja entender melhor o que é um converter ou um validator, ou como eles funcionam, consulte meu post anterior aqui.

Leia mais

Implementando converter e validator de CPF

Recentemente me deparei no trabalho com alguns sistemas que exigiam a validação/formatação de CPF e de CNPJ. Achei que poderia solucionar o problema com javascript, mas considerei melhor criar validator e converter para cada um dos casos.

Nessa primeira etapa, vou mostrar a conversão e validação de CPF. Ressalto que a lógica de validação/conversão vai estar completamente inserida dentro das classes que implementam javax.faces.convert.Converter e javax.faces.validator.Validator. Aqui no meu trabalho colocamos essa lógica em classes Java separadas. Geramos um jar com essas classes e então colocamos esse jar no classpath da aplicação, evitando replicação de código.

Outro detalhe é que a classe de validação lança uma exception chamada FormatoCPFException que é uma classe que extende Exception quando o CPF é inválido apenas para o código ficar mais claro. Não vou colocar o código dessa classe aqui no post para o artigo não ficar muito grande, portanto será necessário implementar essa classe caso você queira testar meu exemplo de validação.

Leia mais

Dicas de banco de dados

Logo Postgres

Logo Postgres

Estou fazendo um curso de PostgreSQL e meu instrutor tem dado algumas dicas que venho utilizando em situações práticas nas aplicações que desenvolvo para melhorar a performance do banco e diminuir o tempo de retorno das requisições realizadas.

Através de estudos realizados ficou constatado que os problemas mais comuns encontrados em bancos de dados são:

  • 60% relacionados ao mau uso da linguagem SQL;
  • 20% relacionados a má modelagem do banco de dados;
  • 10% relacionados à má configuração do SGDB;
  • 10% relacionados a má configuração do SO.

Seguem algumas dicas que venho utilizando e configurações que podem ser feitas no Postgres para melhorar a interação entre o sistema e o SGBD:

Leia mais

Como forçar download de arquivo em JSF / Struts

Estou implementando uma aplicação em JSF que gera um arquivo texto em uma pasta da aplicação. Esse arquivo deve ser baixado para a máquina do usuário para que ele faça sua importação no servidor.

Para forçar o usuário a baixar o arquivo – e não deixar que o conteúdo dele aparecesse na tela do browser – desenvolvi uma solução muito simples que gira em torno de uma única JSP. O legal da solução é que ela serve para JSF, Struts e Servlets (acredito que com o Seam também funcione), a extensão do arquivo pode ser qualquer uma e o arquivo pode inclusive estar em qualquer pasta do servidor (dentro ou não do contexto web).

Clique aqui para baixar o PDF.

Tutorial: Técnicas de Geração de Relatórios com JasperReports / iReport

Uma abordagem utilizando a ferramenta de design iReport

Por diversas vezes tenho me deparado com pessoas no CEJUG e em diversos fóruns Java com dificuldades na geração de relatórios com o JasperReports ou na utilização do iReport como ferramenta visual de diagramação dos documentos.

Foi então que tive a idéia de disponibilizar esse tutorial no meu blog que mostra como criar relatórios no iReport através de três técnicas: passando uma conexão com o banco de dados, passando um ResultSet (encapsulado na classe JRResultSetDataSource) e passando uma lista de objetos (encapsulada na classe JRBeanCollectionDataSource).

Além da demostração de como gerar os relatórios, mostro também o código Java correspondente de cada método, dou algumas dicas para modificar os textFields dos relatórios e outras de utilização do próprio iReport.

Resolvi também disponibilizar a aplicação que criei em JSF no formato zip e war. Bom proveito a todos.

Clique aqui para baixar o PDF do tutorial.

Clique aqui para baixar o projeto do Eclipse compactado (zip).
Clique aqui para baixar o projeto no formato war.