Olá!

Abaixo uma dica de tutorial sobre JasperReports feito pelo Flávio Araújo.

Hoje trago um tutorial que acabei de elaborar sobre o JasperReports e iReports – plugins para geração de relatórios em Java.

Neste tutorial, a IDE usada foi o NetBeans.

Share

Olá!

Para quem quer saber um pouco mais sobre BPEL e a ferramenta Oracle SOA Suite escrevi um artigo sobre eles.

[download id=”2″]

Disponibilizei o web service utilizado no artigo nesse endereço http://www.furutani.com.br/CalculadoraServices/services/Calculadora?wsdl

Os fontes podem ser baixados clicando em [download id=”1″] e aqui.

Espero que ajude.

Até mais,
Roberto

[download id=”1″]
Share

Usando o JRBeanCollectionDataSource

Recebi vários emails perguntando sobre o Jasper/iReport. Recentemente fui questionado com relação ao JRBeanCollectionDataSource e o seu uso para gerar um relatório utilizando beans.

Mostrarei com um exemplo bem simples (sem sub-relatórios) como gerar um relatório com o Jasper usando o JRBeanCollectionDataSource como fonte de dados, irei fazer um relatório de livros.

OBS:
Em um outro tutorial eu tive o trabalho de criar um DataSource customizado, mas creio que é facilmente adaptado para usar somente o JRBeanCollectionDataSource, dispensando o DataSource customizado.

Na expressão para o sub-relatório teria que usar new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource(${ListaDisciplinas})
O Fábio Miranda foi quem me questionou sobre esse uso do JRBeanCollectionDataSource, quando tiver mais tempo vou adaptar o tutorial com essas dicas. Me cobrem 😉

Foi utilizado o iReport 0.5.3, jdk1.5.0_03 e Windows XP

Primeiro vamos ao bean Livro

package exemplo;
public class Livro {
   private String titulo;
   private String autor;
   private String isbn;
   private String editora;
   private String descricao;
public Livro(){}<br>
// todos getters e setters omitidos} 

O relatório é bem simples de ser desenhado, crie um novo relatório (menu File > new document) e insira os static text para os textos fixos ("Minha Biblioteca", "Titulo", "Autor", "ISBN", " Editora" e "Descricao") e 5 text fields que ficarão em frente aos static text "Titulo", "Autor", etc….

Quando você insere o text field o texto que aparece é $F{Field}, para mudar de um duplo clique sobre ele. Vai ser mostrado uma janela como essa:

Altere $F{Field} para $F{titulo} e faça isso com os outros 4 campos. Note que o texto $F{titulo} vai continuar em azul, isso ocorre porque não foi declarado o field titulo. O próximo passo é deixar $F{titulo} na cor verde. No menu View, selecione Report Fields. Na janela que será mostrada clique em New, preencha Field Name titulo, no Field Class Type selecione java.lang.String e no Field Description não coloque nada, clique em Ok. Repita a operação para autor, isbn, editora e descrição, como mostra a figura abaixo.

Uma relação importante a ser ressaltada é a dos atributos do bean <> Fields <> Text Fields, os nomes devem iguais como mostrado na figura abaixo.

No iReport como no Java maiúscula e minúscula fazem toda a diferença.

Compile o relatório, menu Build > Compile. Se aparecer algo parecido com isso no console o relatório está sem nenhum erro.

 Compiling to file... .Livros.jasper -> C:iReport-0.5.3Livros.java
  it.businesslogic.ireport.ReportClassLoader@1a73d30
  Compilation running time : 260

Um dos erros mais comuns é esse

  Errors compiling .Livros.jasper!
  it.businesslogic.ireport.ReportClassLoader@e05ad6
  net.sf.jasperreports.engine.JRException:
  Report design not valid : 1. Field not found : Titulo

Nesse caso o erro foi causado pelo “T” maiusculo, o certo é “t” minúsculo no TextField expression.

Ou se o "t" está minúsculo mas o erro continua, deve ser porque não foi declarado no Report Fields.
Agora iremos ver a classe que exibi o relatório. O diferencial está em azul, ao invés de utilizarmos uma

Connection vamos usar o JRBeanCollectionDataSource.

package exemplo;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.view.JasperViewer;
public class Inicio {
	public void exibirRelatorio() {
		// Caminho do .jasper do relatorio
		String caminhoRelJasper = "Livros.jasper";
		// Lista com beans
		List listaLivros = getLivros();
		// Stream com o .jasper
		InputStream relJasper = getClass()
				.getResourceAsStream(caminhoRelJasper);
		<font color="#0000FF">// O datasource
		JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(
				listaLivros);</font>
		// Parametros do relatorios
		Map parametros = new HashMap();
		JasperPrint impressao = null;
		try {
			impressao = JasperFillManager.fillReport(relJasper, parametros, ds);
			JasperViewer viewer = new JasperViewer(impressao, true);
			viewer.setVisible(true);
		} catch (JRException e) {
			System.out.println(e.getMessage());
		}
	}
	public List getLivros() {
		List listaLivros = new ArrayList();
		Livro livro = new Livro();
		livro.setTitulo("Use a cabeça! Padrões de Projeto - Design Patterns");
		livro.setAutor("Freeman, Eric / Freeman, Elisabeth");
		livro.setIsbn("8576080869");
		livro.setEditora("Alta Books");
		livro
				.setDescricao("Como você sabe que não quer reinventar a roda (ou, "
						+ "pior, um pneu furado), "
						+ "então você busca padrões de projetos");
		listaLivros.add(livro);
		livro = new Livro();
		livro.setTitulo("Entendendo e Dominando o Linux");
		livro.setAutor("Morimoto, Carlos");
		livro.setIsbn("8589535339");
		livro.setEditora("Digerati");
		livro
				.setDescricao("Como o nome diz, este livro é uma obra destinada a "
						+ "todos aqueles que "
						+ "pretendem conhecer na prática e em detalhes os "
						+ "principais recursos oferecidos pelo Linux");
		listaLivros.add(livro);
		livro = new Livro();
		livro.setTitulo("Guia de Certificação em Java - Exame CX-310-035");
		livro.setAutor("Pereira, Rafael");
		livro.setIsbn("8573934263");
		livro.setEditora("Ciência Moderna");
		livro.setDescricao("Este Guia de Certificação em Java é um livro "
				+ "fundamental para preparar os"
				+ " candidatos ao exame de programador Java da Sun, "
				+ "a primeira e mais "
				+ "requisitada certificação desta tecnologia.");
		listaLivros.add(livro);
		return listaLivros;
	}
	public static void main(String[] args) {
		new Inicio().exibirRelatorio();
	}
}

É isso que eu queria passar… em caso de dúvida me mande um email, assim vou poder melhorar esse tutorial.
Download do código fonte

Veja também meu artigo na Java Magazine sobre iReport.

Share

Olá Javeiros!

Eu estava com uma dificuldade enorme para trabalhar com ArrayList de VOs (Value Objects ) com um atributo ArrayList para alimentar um relatório.
O problema era o seguinte: montar um relatório através de um ArrayList de VOs de Aluno (ver listagem 1) que tem um ArrayList de VOs de Disciplina (ver listagem 2), sendo um aluno por página.

Listagem 1:

package vo;
import java.io.Serializable;
import java.util.ArrayList;
/**
* @author RJFurutani
* @04/05/2005
*/
public class Aluno implements Serializable{
private String nome;
private String curso;
private ArrayList disciplinas;
/**
* @param nome
* @param curso
* @param disciplinas
*/
public Aluno(String nome, String curso, ArrayList
					disciplinas) {
super();
this.nome = nome;
this.curso = curso;
this.disciplinas = disciplinas;
}
/**
* @return Returns the curso.
*/
public String getCurso() {
return curso;
}
/**
* @param curso The curso to set.
*/
public void setCurso(String curso) {
this.curso = curso;
}
/**
* @return Returns the disciplinas.
*/
public ArrayList getDisciplinas() {
return disciplinas;
}
/**
* @param disciplinas The disciplinas to set.
*/
public void setDisciplinas(ArrayList
			disciplinas) {
this.disciplinas = disciplinas;
}
/**
* @return Returns the nome.
*/
public String getNome() {
return nome;
}
/**
* @param nome The nome to set.
*/
public void setNome(String nome) {
this.nome = nome;
}
}

Listagem 2

	package vo;
import java.io.Serializable;
/**
* @author RJFurutani
* @04/05/2005
*/
public class Disciplina implements Serializable{
/**
* @param nome
* @param cargaHoraria
*/
public Disciplina(String nome,String cargaHoraria){
super();
this.nome = nome;
this.cargaHoraria = cargaHoraria;
}
/**
* @return Returns the cargaHoraria.
*/
public String getCargaHoraria() {
return cargaHoraria;
}
/**
* @param cargaHoraria The cargaHoraria to set.
*/
public void setCargaHoraria(String cargaHoraria){
this.cargaHoraria = cargaHoraria;
}
/**
* @return Returns the nome.
*/
public String getNome() {
return nome;
}
/**
* @param nome The nome to set.
*/
public void setNome(String nome) {
this.nome = nome;
}
private String nome;
private String cargaHoraria;
}

Depois de um tempão pesquisando e perguntando no GUJ, JavaFree, na lista
enterprise-list@soujava.dev.java.net e usando o Google achei esse video http://ireport.sourceforge.net/swf/Subreport_viewlet_swf.htm que me deu uma luz e vou tentar passar de forma mais objetiva a solução que eu encontrei.

Eu vou considerar que o leitor já tenha alguma experiência com o iReports e o JasperReports. Não vou entrar em muitos detalhes de design.

Primeiro vamos criar o relatório principal, nele vamos por os fields nome do aluno e o curso que ele faz e abaixo vai ficar o subrelatório.

A ferramenta para adicionar o subrelatório está na barra de ferramentas:

Clique no icone destacado e desenhe ele como na figura anterior.

Agora vamos criar o subrelatório, esse é bem mais simples.

no subrelatório os fields são esses:


Não tem nada de mais.
Agora vamos aos fields do relatório principal.


O field nome e curso são para o próprio relatório principal, o field ListaDisciplinas é o que vai ser passado para o subrelatório, reparem que ele é do tipo Object.

E como parâmetro o relatório principal recebe o caminho do subrelatório compilado (.jasper).

Agora vamos nas propriedades do subrelatório que foi adicionado no relatório principal. Dê um duplo clique nele e vamos as configurações.


Na aba Subreport selecione Use datasource expression e digite $F{ListaDisciplinas} , esse nome deve ser igual ao informado no field.

Clique na aba subreport (other) e configure conforme mostra a figura.

Como estamos trabalhando com VO o nome dos fields deve coincidir com o nome dos atributos das classes VO (Aluno e Disciplina) .

Com layout feito podemos ir para o desenvolvimento da classe DataSource. Eu vou chamar aqui de relatórioAlunosDataSource.
É uma classe que implementa a interface JRDataSource, então devemos implementar obrigatoriamente dois métodos o next() e getFieldValue().
O método next() retorna um boolean, true se houver mais Aluno na ArrayList ou false se não tiver mais.

 valorAtual = itrAlunos.hasNext() ? itrAlunos.next() : null;
 irParaProximoAluno = (valorAtual != null);
 return irParaProximoAluno;

O método getFieldValue() recebe um parâmetro JRField, através desse parâmetro nós podemos saber qual field o JasperReports está pedindo pra por no relatório.

  Object valor = null;
  Aluno aluno = (Aluno) valorAtual;
 if ("nome".equals(campo.getName())) {
   valor = aluno.getNome();
 } else if ("ListaDisciplinas".equals(campo.getName())) {
   valor = new JRBeanCollectionDataSource(
   			aluno.getDisciplinas());
 } else if ("curso".equals(campo.getName())) {
   valor = aluno.getCurso();
 }

Observer que quando é solicitado o field ListaDisciplinas nós devolvemos um JRBeanCollectionDataSource instanciado com a ArrayList de Disciplina do Aluno. Lembra que na configuração dos fields do relatório principal nós colocamos ListaDisciplinas do tipo Object, foi justamente por esse motivo.

Chegou a hora de criar a classe principal

package jasper;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.view.JasperViewer;
public class Gerarelatório {
private static final String rel1 = "RelAlunos.jasper";
private static final String rel2 =
"jasper/RelAlunosDisciplinas.jasper";
public Gerarelatório() throws Exception {
// Lista dos alunos
ArrayList listaAlunos = GerarDadosFicticios.getListaAlunos();
// Cria o data source para o relatório
relatórioAlunosDataSource ds =
	new relatórioAlunosDataSource(
		listaAlunos);
// parâmetros do relatório
Map parâmetros = new HashMap();
parâmetros.put("pathSubRel",rel2);
JasperPrint impressao = JasperFillManager.fillReport(
getClass().getResourceAsStream(rel1), parâmetros, ds);
//exibe o relatório
JasperViewer viewer = new JasperViewer(impressao, true);
viewer.show();
}
public static void main(String[] args) throws Exception {
new Gerarelatório();
}
}

Para criar dados ficticios usados para testar o relatório foi criado a classe GerarDadosFicticios

package jasper;
import java.util.ArrayList;
import vo.Aluno;
import vo.Disciplina;
/**
* @author RJFurutani
* @04/05/2005
*/
public class GerarDadosFicticios {
public static ArrayList getListaAlunos() {
ArrayList listaAlunos = new ArrayList();
ArrayList disciplinas = null;
Disciplina disciplina1 = null;
Disciplina disciplina2 = null;
Disciplina disciplina3 = null;
Disciplina disciplina4 = null;
/*
* Aluno Roberto
*/
disciplina1 =
   new Disciplina("Banco de Dados I", "45Hs");
disciplina2 =
   new Disciplina("Equações Diferenciais I", "50Hs");
disciplina3 =
   new Disciplina("Algoritmos e Estrutura de Dados I",
"60Hs");
disciplinas = new ArrayList();
disciplinas.add(disciplina1);
disciplinas.add(disciplina2);
disciplinas.add(disciplina3);
Aluno roberto =
   new Aluno("Roberto Furutani", "Ciencia da Computacao",
disciplinas);
listaAlunos.add(roberto);
/*
* Aluna Fernanda
*/
disciplina1 = new Disciplina("Biologia", "45Hs");
disciplina2 = new Disciplina("Matematica Elementar II",
"30Hs");
disciplina3 = new Disciplina(
"Instrumentação Cirurgica", "70Hs");
disciplinas = new ArrayList();
disciplinas.add(disciplina1);
disciplinas.add(disciplina2);
disciplinas.add(disciplina3);
Aluno fernanda = new Aluno("Fernanda Fernandes",
"Enfermagem", disciplinas);
listaAlunos.add(fernanda);
/*
* Aluna Silvia
*/
disciplina1 = new Disciplina("Fisica", "45Hs");
disciplina4 = new Disciplina("Quimica", "45Hs");
disciplina2 = new Disciplina("Equações Diferenciais II",
"50Hs");
disciplina3 = new Disciplina(
"Inglês", "60Hs");
disciplinas = new ArrayList();
disciplinas.add(disciplina1);
disciplinas.add(disciplina2);
disciplinas.add(disciplina3);
disciplinas.add(disciplina4);
Aluno silvia = new Aluno("Silvia da Silva", "Matemática",
disciplinas);
listaAlunos.add(silvia);
/*
* Aluno André
*/
disciplina1 = new Disciplina("Banco de Dados II", "65Hs");
disciplina2 = new Disciplina("Calculo Numerico I",
"50Hs");
disciplina3 = new Disciplina(
"Eletronica I", "60Hs");
disciplinas = new ArrayList();
disciplinas.add(disciplina1);
disciplinas.add(disciplina2);
disciplinas.add(disciplina3);
Aluno andre =
   new Aluno("André Oliveira Lima", "Engenharia da Computacao",
disciplinas);
listaAlunos.add(andre);
return listaAlunos;
}}

O relatório vai ficar assim:

É isso ai!!! Espero ter ajudado alguém com esse humilde tutorial.

Referências:

Download dos fontes
GUJ – www.guj.com.br (http://www.guj.com.br/posts/list/23830.java)
JavaFree – www.javafree.com.br
Lista Enterprise – enterprise-list@soujava.dev.java.net
Docs iReport – http://ireport.sourceforge.net/docs.html

Videos iReport – http://ireport.sourceforge.net/swf/
Relatórios com Hibernate – http://www.hibernate.org/79.html

Tutorial Relatórios com JasperReports e iReports – www.furutani.com.br

Atualizado em 24/06/2009

Share

Olá!

Desenvolvi uma aplicação simples com Hibernate Core, Hibernate Annotations e Hibernate EntityManager para passar o tempo.
A aplicação é um leitor de RSS, ele simplismente faz a leitura de URLs cadastradas no banco de tempos em tempos e atualiza os feeds devolvidos pela URL.

O zip é a exportação do projeto feito no Eclipse usando MySQL e Tomcat 6.x, para importar utilize o menu File, Import. Selecione a opção General, Archive File no tree view.

Abra o arquivo persistence.xml para alterar os dados de seu banco de dados e edite as linhas abaixo.

<property name="hibernate.connection.username" value="usuario"/>
<property name="hibernate.connection.password" value="senha"/>
<property name="hibernate.connection.url" value="jdbc:mysql://172.198.74.91/banco_dados"/>

Para criar as tabelas no banco o valor da propriedade hibernate.hbm2ddl.auto deve ser create.

<property name="hibernate.hbm2ddl.auto" value="create" />

Saiba mais sobre as propriedades de configuração neste link.

Como estamos falando de Hibernate nada impede de testarmos com PostgreSQl, Oracle, SQL Server e etc. alterando as linhas abaixo.

<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>

Confira a lista de banco de dados suportado pelo Hibernate.

Para fazer o download do Leitor RSS clique aqui.

Até mais,
Roberto Furutani

Share