11 de maio de 2011

JasperReports 4.0.1: Utilizando JavaBean datasource

Observação: essa postagem tem por finalidade mostrar como construir relatórios utilizando de classes Java. O método utilizado é o JavaBean datasource, o que será feito aqui funciona tanto em Java desktop ou Java EE.
Antes de começarmos, vamos entender algumas coisas: para usar esse método de criar relatórios nós precisamos de um .jar que contenha as classes que desejamos usar no relatório. Vale lembrar que para gerar um .jar nós precisamos de um projeto Java Desktop (se seu projeto já for Desktop, está perfeito... não precisa se preocupar em criar um outro projeto, use o jar do seu próprio projeto). Caso sua aplicação seja web, será necessário criar um projeto Desktop com a mesma estrutura das classes que deseja nos seus relatórios, não é necessário ter nesse .jar suas classes de controle ou DAO, apenas o que seria o model ou os pojos.
Outro detalhe importante é que os pacotes devem ser os mesmos, se por um acaso as classes que deseja usar nos relatórios se encontrem em pacotes assim: br.com.javasemcafe.model.NomeDaClasse ... será necessário criar essa mesma estrutura de pacotes no .jar. Mas chega de enrolação e vamos lá!

Começando...
Continuando a postagem anterior sobre JasperReport (Veja aqui) vamos continuar essa postagem utilizando o mesmo relatório da postagem anterior (link acima), nele a band Column Header tem três static text: CODIGO, NOME e VALOR, então eu vou precisar de uma classe com esses atributos. 

No NetBeans vamos criar um novo Aplicativo Java (Desktop) com o nome de PrimeiroRelatorio, dentro dele criamos a estrutura de pacotes, nesse caso precisamos apenas do pacote controle, que deve ser criado dentro do pacote primeirorelatorio, e dentro dele, uma classe Java com o nome de Produto. A estrutura é essa:



Nossa classe Produto será assim:
public class Produto {
    private int codigo;
    private String nome;
    private BigDecimal valor;

    //gerar getters e setters
}

Para criar o .jar, clique com o botão direito no projeto e mande Limpar e Construir, o .jar pode ser encontrado dentro da pasta dist que tem dentro do projeto, no meu caso, o projeto está na própria pasta do NetBeans, ficando assim:
/home/andii/NetBeansProjects/PrimeiroRelatorio/dist/PrimeiroRelatorio.jar

Classpath...
No iReport precisamos setar esse .jar no classpath do programa, para isso já em Ferramentas - Opções... e abrirá a seguinte janela, nisso vá na aba Classpath:


Para setarmos o jar no classpath, basta clicar no botão Add JAR e encontrar o jar gerado no projeto acima, que no meu caso é o caminho que eu mostrei alí... caso deseje, pode-se copiar o jar para outra localização também sem problemas nenhum, mas eu aconselho a deixar na própria pasta dist do projeto, pois quando precisar recompilar o projeto por causa de alterações o classpath sempre estará atualizado, caso contrário, tem que lembrar toda vez de atualizá-lo. Depois disso basta dar um OK.

Buscando os fields...
Os fields são os campos que devem ser mostrados no relatório, pra ficar mais claro, são os atributos da nossa classe, para usá-los precisamos seleciona-los na classe Produto, para isso, abra o Report Query, clicando no botão que não tem nome... mas é o da imagem abaixo:
 

Ao abrir a janela, vamos na aba JavaBean datasource, no campo Class name, digitamos o caminho da classe, lembrando dos pacotes, e depois clique no botão Read Attributes assim como na imagem abaixo:


Caso tenha feito corretamente os atributos irão aparecer, basta usar o CRTL para selecioná-los e logo em seguida clique em Add selected field(s), assim:


Ao final de OK, nessa janela.
Para confirmar se os fields foram selecionados, no lado esquerdo do iReport tem uma paleta com o nome de Report Inspector, procure os fields:


Acrescentando os fields ao relatório
Agora no relatório arraste três elementos text field, para dentro da band Detail 1 e os alinhe de acordo com os static text acima deles:


Depois altere-os para os nomes dos fields que selecionamos, ficando assim:


Antes de finalizarmos precisamos ajeitar algumas coisas no relatório, por padrão os relatórios se utilizam da linguagem Groovy, como neste estamos usando classes Java como base, precisamos alterar a linguagem para Java, para isso clique na margem do relatório para que possamos alterar as propriedades do relatório e não de algum elemento, na paleta de propriedades, procure por Language:


Para compilar o relatório use o seguinte botão:


Depois de tentar compilar o relatório vamos obter alguns erros:


As descrições dos erros são claras, ele diz que não consegue converter o nosso field codigo (Integer) para String e nem valor (BigDecimal) para String. Primeiramente vamos resolver o codigo para isso clique no text fiel referente a ele, e vá nas propriedades e procure por Expression Class e altere para o tipo correto dele que é java.lang.Integer:


O mesmo deve ser feito para o field valor, mas no caso dele vamos alterar uma outra propriedade também, que é o Pattern, pois por padrão um BigDecimal separa as casas decimais com ponto, mas no Brasil, usamos a vírgula, para alterar, basta clicar em ... e ver as opções disponíveis para números:


Depois de ter feito as devidas correções, compile o relatório novamente, desta vez deverá aparecer a seguinte mensagem:


Ou seja... o relatório foi compilado com sucesso! Na mesma localização de onde está o arquivo .jrxml (padrão do iReport) poderá ser encontrado o .jasper que é o relatório compilado, corresponde ao .class do Java.

EDITANDO: Depois de ter postado essa postagem é que eu fui lembrar que esquecemos do valor total! Por isso vamos voltar ao iReport...
Para fazer cálculos nós precisamos de variáveis do JasperReport e não field... por isso, no Report Inspector, procure por Variables, ao encontrar clique com o botão direito em cima dele em Adicionar Variable, ficando assim:


Selecione a nova variável, e vá nas propriedades, altere as propriedades de acordo com a imagem abaixo:



Depois de alterado, volte no Report Inspector, e de lá arraste a variável que agora se chama somaValor, para a band Summary deixando-o ao lado do static Text VALOR TOTAL:


E por fim... compile novamente o relatório!!

Para utilizar esse relatório, irei disponibilizar duas formas:
* Utilizar em projetos Web: Veja aqui
* Utilizar em projetos Desktop: Veja aqui

OBS: Essa postagem estava pronta e postada a uns dias já, até que o Blogger resolveu fazer uma manutenção e ao remover algumas postagens, acabou não voltando outras, que foi o caso dessa... pois é... tive que reescrever novamente, pois a inteligente aqui (eu), confiava tanto no Blogger, que não tinha nada salvo sobre as postagens, além dos projetos feitos... 
Resultado: no mesmo dia que isso aconteceu, fiz questão de salvar o código html de todas as postagens!!! :P

7 comentários:

  1. Valeu pelo artigo, muito útil. Mas como é a primeira vez que faço um relatório em Java estou meio perdido. Como chamo este relatório dentro de uma aplicação java?

    ResponderExcluir
  2. Olá Jeff! Veja que ao final da postagem eu coloco dois links, um é para "Utilizar em projetos Web" e o outro é "Utilizar em projetos Desktop"

    ResponderExcluir
  3. Parabéns pelo artigo andii, graças há vc conseguir resolver um problema que eu estava tendo ao fazer o compiler do relatorio, onde precisava-se, mudar a language utilizada para gerar o relatório. Obrigado!

    ResponderExcluir
  4. Obrigada! Me deixa feliz saber que minhas postagens podem ajudar alguém! :)

    ResponderExcluir
  5. Cara adorei o artigo, mas será que você poderia me ajudar com um problema meu, Tenho um projeto web quase pronto, faltando os relátorios, ele utiliza Spring+JSF+Hibernate, to precisando criar um relatorio de Ordem de Serviço. so que essa entidade tem outra relacionada com ela com Cliente, Tecnico , essas por um lado ate que eu poderia passar por parametro, mas o problema esta com os dados dos itens de serviço que estara num subform que irei passar com um List num parametro nessa entidade há uma outra entidade relacionada que o serviço não sei como envia-la para o relatorio.

    ResponderExcluir
    Respostas
    1. Você vai precisar usar subreport, segue o link: http://javasemcafe.blogspot.com.br/2011/06/jasperreports-401-utilizando-subreports.html

      Excluir
  6. Boa tarde, gostei bastante do seu post. Você sabe como configuro pelo eclipse, ou melhor, pelo Spring Tool Suite. Segui todos os passos, copiei o jar que foi criado, fui no classpath e nada. Se puder me ajudar eu agradeço

    ResponderExcluir

Deixe seu comentário... ;)