Você está na página 1de 6

Tutorial: IReport usando Custom JRDatasource

Neste tutorial ser explicado passo a passo como gerar relatrios com o IReport / Jasper Reports usando uma Custom JRDatasource.

Custom JRDatasource?
Datasource, ou em portugus, fonte de dados, uma espcie de repositrio de onde o Jasper ir recuperar os dados ue ser!o impressos no relatrio. "m #anco de dados pode ser usado para essa fun$!o, usando a classe respons%el pela gera$!o do relatrio acessar diretamente o #anco. &orm essa n!o a solu$!o mais prtica nem a mais elegante. &ara escre%er no relatrio usaremos uma interface c'amada JRData(ource.

A Interface JRDataSource
) interface JRData(ource uma a#stra$!o para ual uer fonte de dados para um relatrio *asper. &ossui apenas dois mtodos ue %eremos a seguir+ public interface JRDataSource{ public Object getFieldValue(JRField jrFiels); public boolean next(); } Descre%eremos mel'or os dois mtodos+ public Object getFieldValue(JRField jrField); Nesse mtodo o JRData(ource retorna um ,#*eto ue o %alor correspondente ao campo -JR.ield/ passado como par0metro. 1eralmente %erificado o nome desse campo para sa#er ue o#*eto retornar. public boolean next(); Nesse mtodo o JRData(ource alm de retornar se existe um prximo o#*eto na cole$!o da fonte de dados, caso exista ele posiciona o cursor nesse prximo elemento, para se recuperar as informa$2es dessa fonte de dados.

Nosso exemplo
3ostraremos agora uma aplica$!o exemplo apresentados acima. ue far uso dos recursos ue foram

1. Implementando as classes
Digamos ue uma empresa ual uer ten'a seu cadastro de clientes, do ual em cada cliente se arma4ena o nome, cpf e um cdigo interno referente a esse cliente. (upon'amos tam#m ue se dese*a um relatrio com todos os clientes e as informa$2es relati%as aos mesmos dessa forma+

Nome+ Cdigo+ C&.+

Jos da (il%a )556 666.666.666766

Inicialmente definiremos a classe Cliente+


public class Cliente { private String codigoControle; private String codigo; private String nome; public String getCodigoControle() { return codigoControle; } public void setCodigoControle(String codigoControle) { this.codigoControle = codigoControle; } /** * Construtor */ public Cliente() { } /** * Construtor */ public Cliente(String nome, String codigo, String codigoControle) { this.nome = nome; this.codigo = codigo; this.codigoControle = codigoControle;

public String getCodigo() { return codigo; } public void setCodigo(String codigo) { this.codigo = codigo; } public String get ome() { return nome; }

public void set ome(String nome) { this.nome = nome; }

} Definida a classe cliente, iremos definir a classe ClienteJRData(ource, ue ser nossa fonte de dados+
import !ava.util."terator; import !ava.util.#ector; import net.s$.!asperreports.engine.%&'ataSource; import net.s$.!asperreports.engine.%&()ception; import net.s$.!asperreports.engine.%&*ield; public class Cliente%&'ataSource implements %&'ataSource {

private "terator+Cliente, iterator; private Cliente cursor; public Cliente%&'ataSource(#ector+Cliente, cliente) { super(); iterator = cliente.iterator(); } public boolean ne)t() thro-s %&()ception { boolean retorno = iterator.has e)t(); i$(retorno){ cursor=iterator.ne)t(); } return retorno; } public .b!ect get*ield#alue(%&*ield nome) thro-s %&()ception { Cliente cliente = cursor; i$ (nome.get ame().e/uals(0 .1(0)) { return cliente.get ome(); } i$ (nome.get ame().e/uals(0C.'"2.0)) { return cliente.getCodigoControle(); } i$ (nome.get ame().e/uals(0C3*0)) { return cliente.getCodigo(); } return null; } }

Como explicado anteriormente, teremos apenas dois mtodos, o primeiro retorna se existem mais dados a serem lidos e o segundo retorna o o#*eto dese*ado. &ara se #uscar o o#*eto, feita uma compara$!o com o nome do campo, at ue encontre o o#*eto certo. Caso n!o exista um campo com o nome dado ser retornado null.

2. Configurando o IReport
No menu Datasource 8 Connections / Datasources a#ra uma no%a conex!o -Ne9/ :m ;<pe of connection / datasource selecione Custom JRData(ource :scol'a um nome para a conex!o.

:scol'a um nome para a .actor< class e para o mtodo esttico ue ser c'amado na .actor< Classe. &ara esse tutorial, preenc'i do modo indicado na figura.

, prximo passo ser implementar a classe .actor<, no nosso caso ela se c'ama ClienteJRData(ource.actor<. :la de%e ter um mtodo esttico ue retorna a fonte de dados c'amdo createDatasource-/. (egue o cdigo ue usamos para esse exemplo+
import !ava.util.#ector; import net.s$.!asperreports.engine.%&'ataSource; public class Cliente%&'ataSource*actor4 { private static %&'ataSource data; public static %&'ataSource create'atasource() { i$ (data == null) { Cliente c=ne- Cliente(); c=ne- Cliente(01aria Chi/uinha0,0567.89:.;<=>?50,0@??50); #ector+Cliente, cliente=ne- #ector+Cliente,(); cliente.add(c); c=ne- Cliente(0%oAo 3aulo0, 0555.555.555>550, 0@??60); cliente.add(c); c=ne- Cliente(0%osB da Silva0, 0666.666.666>660, 0@??70); cliente.add(c); data = ne- Cliente%&'ataSource(cliente); } return data; }

No nosso caso, a fonte de dados ser!o trs clientes fict=cios de onde ser gerado o relatrio.

3. Elaborando o relatrio
N!o entrarei em detal'es de como ela#orar o relatrio, pois n!o o o#*eti%o deste tutorial. :nt!o temos o modelo do relatrio pronto+

Importante+ os nomes entre c'a%es nos campos de textos de%em ser escritos da mesma forma ue no mtodo get.ield>alue da classe ue implementa JRData(ource -lem#rando ue Ja%a case sensiti%e/. ;am#m de%e ser adicionado os campos com os nomes no frame situado ? direita da tela. ;erminado esse processo, compile o relatrio apertando no #ot!o ocorreu #em de%e ser gerado o ar ui%o .*asper. . (e tudo

. !erando o relatrio na aplica"#o


&ara finali4ar o tutorial iremos gerar o relatrio na aplica$!o. )ntes de tudo necessrio copiar o ar ui%o .*asper gerado pelo IReport para sua aplica$!o. ;am#m necessrio adicionar algumas #i#liotecas ue est!o na pasta li# do IReport. &or seguran$a adicionaremos todos os ue come$am por common -commoncollections por exemplo/ mais a #i#lioteca i;ext. , @ltimo passo ser implementar a classe ue gera o relatrio+

import !ava.util.Cash1ap; import !ava.util.1ap; import import import import net.s$.!asperreports.engine.%&'ataSource; net.s$.!asperreports.engine.%&()ception; net.s$.!asperreports.engine.%asper*ill1anager; net.s$.!asperreports.vie-.%asper#ie-er;

public class 2erar&elatorio { public static void gerar&elatorio(%&'ataSource source) thro-s %&()ception { 1ap map = ne- Cash1ap(); %asper*ill1anager.$ill&eportDo*ile(0cliente.!asper0, map, source); %asper#ie-er.vie-&eport(0cliente.!rprint0, $alse); } public static void main(StringEF args) { tr4 { 2erar&elatorio.gerar&elatorio(Cliente%&'ataSource*actor4 .create'atasource()); } catch (%&()ception e) { e.printStacGDrace(); } } }

, funcionamento do mtodo simples+ c'amado o mtodo createDatasource para iniciali4ar os dados, e o mtodo Jasper.ill3anager.fillReport;o.ile se encarrega de preenc'er o relatrio. )pesar de n!o usarmos o mapa ele de%e ser iniciali4ado e passado na c'amada do mtodo. (e tudo ocorreu da forma correta, como resultado da aplica$!o teremos o relatrio a#aixo+

.ontes+ &gina do Jasper Reports A 'ttp+//*asperreports.sourceforge.net/ &gina do IReport A 'ttp+//ireport.sourceforge.net/ 1era$!o de Relatrio com JasperReports e iReport -por Carlos .eli4 &aix!o/ A 'ttp+//ireport.sourceforge.net/

Você também pode gostar