JRBeanCollectionDataSource - como usar?

560 views
Skip to first unread message

Samer

unread,
Mar 23, 2010, 11:26:54 AM3/23/10
to javasf: JavaServer Faces Group
Dae pessoal, tranquilo?

Tenho que fazer alguns relatórios no meu sistema e decidi usau o
Ireport.
Apanhei feio pra tentar fazer uma conexão EJBQL, coloquei no
*classpath* do Ireport o .jar da minha app e o diretório que contém
meus beans e o persistence.xml e mesmo assim não houve conexão. Tentei
com 2 versões do Ireport (3.0.0 e 3.7.1) e finalmente desisti.

Pesquisando, vi que posso usar outra abordagem, com o
JRBeanCollectionDataSource, entendi que devo enviar uma lista para o
Ireport, mas não entendi direito como o Ireport enxerga essa lista.

Minhas dúvidas:
1 - Devo criar um relatório com datasource vazio?
2 - Caso utilize um relatório com conexão vazia, como o Ireport vai
entender que "determinado campo Text Field do Ireport = atributo da
classe"?
3 - Enviar a lista *clients = em.createQuery("select c from Client
c").getResultList()* já funcionaria ou teria que iterar e utilizar um
add() em outra lista?
4 - Qual o melhor local dentro da app. para deixar os arquivos do
relatório?

Valeu pessoal !!

thiago moraes

unread,
Mar 23, 2010, 12:10:45 PM3/23/10
to jav...@googlegroups.com
ds = new JRBeanCollectionDataSource(lista de beans);
JasperFillManager.fillReport(pathRelativo, parametros, ds);


Eu tenho um package dos relatorios.

Sugiro que você procure um pouco mais no google que achará um exemplo legal :)



2010/3/23 Samer <samer...@gmail.com>

--
http://groups.google.com/group/javasf

You received this message because you are subscribed to the Google
Groups "javasf: JavaServer Faces Group" group.
To post to this group, send email to jav...@googlegroups.com

To unsubscribe from this group, send email to javasf+unsubscribegooglegroups.com or reply to this email with the words "REMOVE ME" as the subject.



--
Thiago Alves de Moraes
thiag...@gmail.com

Samer

unread,
Mar 23, 2010, 12:19:58 PM3/23/10
to javasf: JavaServer Faces Group
Obrigado pela resposta Tiago, mas como eu já havia dito "entendi que

devo enviar uma lista para o Ireport, mas não entendi direito como o
Ireport enxerga essa lista", portanto, continuo com as mesmas dúvidas
listadas ;)

Procurei no google sim, só recorro à lista quando o resultado da busca
é insatisfatório, talvez por não saber como procurar, talvez porque os
exemplos não focam em explicar detalhadamente.

Valeu!

On 23 mar, 13:10, thiago moraes <thiagoa...@gmail.com> wrote:
> ds = new JRBeanCollectionDataSource(lista de beans);
> JasperFillManager.fillReport(pathRelativo, parametros, ds);
>
> Eu tenho um package dos relatorios.
>
> Sugiro que você procure um pouco mais no google que achará um exemplo legal
> :)
>

> 2010/3/23 Samer <samer.ja...@gmail.com>

> thiagoa...@gmail.com

Tiago Augusto Nogueira Coelho

unread,
Mar 23, 2010, 12:44:23 PM3/23/10
to jav...@googlegroups.com
Samer, tenta procurar então uma video aula de ireport que deve ficar mais claro para você.

thiago moraes

unread,
Mar 23, 2010, 12:46:05 PM3/23/10
to jav...@googlegroups.com

O Jasper precisa de algum tipo de dataSource.

Você pode escolher usar o JPA,JDBC, JRBeanDataSource entre outros.


Com o JRBeanCollection, no iReport vc deve escolher esta opção.
Aí você deve adicionar no classpath do iReport o jar com a sua classe do bean.

Então você deverá fazer a sua query.

Selecionar JavaBeanDataSource e coloque o nome da sua classe que será passada como parametro dentro da lista (ds = new JRBeanCollectionDataSource(lista de beans);)

O Ireporte irá mostrar os campos que vc poderá utilizar .... vc os seleciona e da ok.


No seu relatorio seus campos estarão lá. Só vc colocá-los como se fossem os campos de resultado de uma Query normal.


On Tue, Mar 23, 2010 at 1:44 PM, Tiago Augusto Nogueira Coelho <tiagoa...@gmail.com> wrote:
Samer, tenta procurar então uma video aula de ireport que deve ficar mais claro para você.

--
http://groups.google.com/group/javasf
 
You received this message because you are subscribed to the Google
Groups "javasf: JavaServer Faces Group" group.
To post to this group, send email to jav...@googlegroups.com
 
To unsubscribe from this group, send email to javasf+unsubscribegooglegroups.com or reply to this email with the words "REMOVE ME" as the subject.



--
Thiago Alves de Moraes
thiag...@gmail.com

thiago moraes

unread,
Mar 23, 2010, 12:51:01 PM3/23/10
to jav...@googlegroups.com
Então você deverá fazer a sua query.

   Clique no botao de query e

1 Selecione JavaBeanDataSource.

2 Coloque o nome da sua classe que será passada como parametro dentro da lista (ds = new JRBeanCollectionDataSource(
lista de beans);)

3 Selecione os campos a mostrar no relatorio.

4 finalize

5 dentro do detail band coloque os campos listados. 

6 adicione o JRBean datasource da maneira como te mostrei anteriormente.

e teste


2010/3/23 thiago moraes <thiag...@gmail.com>

Samer

unread,
Mar 23, 2010, 2:06:36 PM3/23/10
to javasf: JavaServer Faces Group
Fiz o seguinte: no Ireport (versão 3.7.1) escolhi o
JRDataSourceProvider ao inves do mencionado JRBeanDataSource (não
tinha essa opção).

Mas acho que to fazendo merda na hora de adicionar as classes no
classpath do Ireport, não tá lendo a classe quando tento carregar os
atributos.

Tentei apontar para meu diretório entity (que fica em src\main\org
\domain\minhaApp\entity) e nada...
Tentei exportar para .jar esse mesmo entity e adicionar no classpath e
nada também, o Ireport diz que a classe não está no classpath!!

O que estou fazendo de errado?

Valeu por enquanto!!


On 23 mar, 13:51, thiago moraes <thiagoa...@gmail.com> wrote:
> Então você deverá fazer a sua query.
>
>    Clique no botao de query e
>
> 1 Selecione JavaBeanDataSource.
>
> 2 Coloque o nome da sua classe que será passada como parametro dentro da
> lista (ds = new JRBeanCollectionDataSource(
>
>
>
> > lista de beans);)
>
> 3 Selecione os campos a mostrar no relatorio.
>
> 4 finalize
>
> 5 dentro do detail band coloque os campos listados.
>
> 6 adicione o JRBean datasource da maneira como te mostrei anteriormente.
>
> e teste
>

> 2010/3/23 thiago moraes <thiagoa...@gmail.com>

> > thiagoa...@gmail.com


>
> --
> Thiago Alves de Moraes

> thiagoa...@gmail.com

thiago moraes

unread,
Mar 23, 2010, 2:13:51 PM3/23/10
to jav...@googlegroups.com
Adiciona no classpath ... fecha e abre o iReport. Acho que vai funfar :)

2010/3/23 Samer <samer...@gmail.com>
To unsubscribe from this group, send email to javasf+unsubscribegooglegroups.com or reply to this email with the words "REMOVE ME" as the subject.



--
Thiago Alves de Moraes
thiag...@gmail.com

Samer

unread,
Mar 23, 2010, 2:19:31 PM3/23/10
to javasf: JavaServer Faces Group
Fiz isso 10x e nada!

On 23 mar, 15:13, thiago moraes <thiagoa...@gmail.com> wrote:
> Adiciona no classpath ... fecha e abre o iReport. Acho que vai funfar :)
>

> 2010/3/23 Samer <samer.ja...@gmail.com>

rondinelle pessoa

unread,
Mar 23, 2010, 2:46:16 PM3/23/10
to jav...@googlegroups.com
Cara,
Tuas dúvidas:

1 - Devo criar um relatório com datasource vazio?
Sim.

2 - Caso utilize um relatório com conexão vazia, como o Ireport vai
entender que "determinado campo Text Field do Ireport = atributo da
classe"?
Tu cria os campos no irreport com mesmo nome que tem os teus atributos na classe java.

3 - Enviar a lista *clients = em.createQuery("select c from Client
c").getResultList()* já funcionaria ou teria que iterar e utilizar um
add() em outra lista?
Funcionaria, ele entederia que os campos criados no relatorio estão associados ao ejbql que tu criou no java pra trazer a lista
Põe teus .jrxml e jasper em uma mesma pasta e caso tu queira gerar o .pdf põe em outra pasta e as pastas criadas põe tudo dentro do webcontent, vou te mandar uma classe para o relatorio,
 

public

class DadosServidorRelatorioMBean {

private String saida;

private DadosServidorDaoImpl dao = new DadosServidorDaoImpl();

private DadosServidor dadosServidor = new DadosServidor();

private CargoComissionado cargoComissionado = new CargoComissionado();

public String getSaida() {

return saida;

}

public void setSaida(String saida) {

this.saida = saida;

}

/**

* @return the cargoComissionado

*/

public CargoComissionado getCargoComissionado() {

return cargoComissionado;

}

/**

* @param cargoComissionado

* the cargoComissionado to set

*/

public void setCargoComissionado(CargoComissionado cargoComissionado) {

this.cargoComissionado = cargoComissionado;

}

@SuppressWarnings("unused")

public String gerarRelatorioCargoComissionadoPdf() throws IOException,

JRException {

JasperReport report = (JasperReport) JRLoader

.loadObject(getDiretorioReal(

"/relatorios/cargoComissionado.jasper"));

HashMap<String, Object> map =

new HashMap<String, Object>();

DadosServidor dadosServidorAux =

new DadosServidor();

dadosServidorAux.getCargoComissionado().setDsSimbolo(

dadosServidor.getCargoComissionado().getDsSimbolo());

List<DadosServidor> lista =

dao.gerarRelatorioPdf(dadosServidorAux

.getCargoComissionado().getDsSimbolo());

JRBeanCollectionDataSource ds =

new JRBeanCollectionDataSource(lista);

JasperPrint jp = JasperFillManager.fillReport(report,

null, ds);

preenchePdf(jp);

/*

* byte[] bytes = JasperExportManager.exportReportToPdf(jp);

*

* HttpServletResponse response = (HttpServletResponse)

* FacesContext.getCurrentInstance().getExternalContext().getResponse();

*

* response.setContentType("application/pdf");

* response.setHeader("Content-disposition", "attachment;filename=" +

* report.getName() + ".pdf"); response.getOutputStream().write(bytes);

*/

// FacesContext.getCurrentInstance().responseComplete();

return "cargoComissionadoRelatorio";

}

/**

* Método para preencher o PDF do relatório

*

* @param print

* JasperPrint

* @throws JRException

*/

private void preenchePdf(JasperPrint print) throws JRException {

// Pego o caminho completo do PDF desde a raiz

saida = getDiretorioReal("/pdf/cargoComissionado.pdf");

// Exporto para PDF

JasperExportManager.exportReportToPdfFile(print,

saida);

/*

* Jogo na variável saída o nome da aplicação mais o caminho para o PDF.

* Essa variável será utilizada pela view

*/

saida = getContextPath() + "/pdf/cargoComissionado.pdf";

}

/**

* Método para retornar o caminho completo do diretório onde se encontra o

* arquivo 'jasper' e o arquivo 'pdf'

*

* @param diretorio

* String diretório a ser localizado na aplicação

* @return String caminho completo

*/

private String getDiretorioReal(String diretorio) {

HttpSession session = (HttpSession) FacesContext.getCurrentInstance()

.getExternalContext().getSession(

false);

return session.getServletContext().getRealPath(diretorio);

}

/**

* Método para retornar o nome da aplicação

*

* @return String nome da aplicacao

*/

private String getContextPath() {

HttpSession session = (HttpSession) FacesContext.getCurrentInstance()

.getExternalContext().getSession(

false);

return session.getServletContext().getContextPath();

}

}

tenta isso que da certo.
 
--
http://groups.google.com/group/javasf

You received this message because you are subscribed to the Google
Groups "javasf: JavaServer Faces Group" group.
To post to this group, send email to jav...@googlegroups.com

To unsubscribe from this group, send email to javasf+unsubscribegooglegroups.com or reply to this email with the words "REMOVE ME" as the subject.

rondinelle pessoa

unread,
Mar 23, 2010, 2:53:03 PM3/23/10
to jav...@googlegroups.com
Qual o framework tu tá usando pra mapeamento objeto relacional?

To unsubscribe from this group, send email to javasf+unsubscribegooglegroups.com or reply to this email with the words "REMOVE ME" as the subject.

Samer

unread,
Mar 23, 2010, 3:09:34 PM3/23/10
to javasf: JavaServer Faces Group
E aí Rondinelle, blz? Eu uso Jboss Seam + JPA...

Obrigado pela explicação!

On 23 mar, 15:53, rondinelle pessoa <rondinellepes...@gmail.com>
wrote:


> Qual o framework tu tá usando pra mapeamento objeto relacional?
>

rondinelle pessoa

unread,
Mar 23, 2010, 3:12:37 PM3/23/10
to jav...@googlegroups.com
Beleza cara, é o hibernate, toplink, eclipselink ou´um outro?

To unsubscribe from this group, send email to javasf+unsubscribegooglegroups.com or reply to this email with the words "REMOVE ME" as the subject.

rondinelle pessoa

unread,
Mar 23, 2010, 3:14:27 PM3/23/10
to jav...@googlegroups.com
Na persistencia dos dados ta usando jdbc ou algum desses framework que eu citei anteriormente?

Samer

unread,
Mar 23, 2010, 3:15:46 PM3/23/10
to javasf: JavaServer Faces Group
Putz, esqueci de mencionar anteriormante, foi mal...é o Hibernate!

On 23 mar, 16:12, rondinelle pessoa <rondinellepes...@gmail.com>
wrote:


> Beleza cara, é o hibernate, toplink, eclipselink ou´um outro?
>

rondinelle pessoa

unread,
Mar 23, 2010, 3:48:53 PM3/23/10
to jav...@googlegroups.com
Cara tu tem que passar uma lista com os objetos e jogar o resultado da lista dentro do JRBeanCollectionDataSource como tá na classe que te passei. Dá algum erro quando tu faz isso? Caso de me passa pra eu da uma olhada.

To unsubscribe from this group, send email to javasf+unsubscribegooglegroups.com or reply to this email with the words "REMOVE ME" as the subject.

Samer

unread,
Mar 23, 2010, 5:13:13 PM3/23/10
to javasf: JavaServer Faces Group
Cara, nem cheguei nessa parte ainda pois não tava conseguindo carregar
os campos, mas agora deu certo, eu tava digitando o nome da classe
apenas e na verdade tem que digitar todo o diretório
(org.domain.app.Classe)...

Vou tentar me virar agora com os exemplos, agradeço a todos a ajuda!

Abraços

On 23 mar, 16:48, rondinelle pessoa <rondinellepes...@gmail.com>
wrote:


> Cara tu tem que passar uma lista com os objetos e jogar o resultado da lista
> dentro do JRBeanCollectionDataSource como tá na classe que te passei. Dá
> algum erro quando tu faz isso? Caso de me passa pra eu da uma olhada.
>

Samer

unread,
Mar 23, 2010, 5:49:08 PM3/23/10
to javasf: JavaServer Faces Group
Só pra ficar registrado caso alguém apanhe com isso também: pra
funcionar eu tive que colocar o arquivo .jar com minhas classes no
diretório libs do Ireport (no meu caso fica em iReport-3.7.1\ireport
\libs), além de adicionar o mesmo .jar no classpath do Ireport.

thiago moraes

unread,
Mar 23, 2010, 7:18:59 PM3/23/10
to jav...@googlegroups.com
Isso aí !

Eu apanhei bastante com IReport tb. Mas no final o resultado é satisfatório :)

Acho a IReport uma bosta. Você arrasta alguma coisa e a imagem do relatório some. Então você salva o arquivo e volta ao normal hehehehehe.

2010/3/23 Samer <samer...@gmail.com>

--
http://groups.google.com/group/javasf

You received this message because you are subscribed to the Google
Groups "javasf: JavaServer Faces Group" group.
To post to this group, send email to jav...@googlegroups.com

To unsubscribe from this group, send email to javasf+unsubscribegooglegroups.com or reply to this email with the words "REMOVE ME" as the subject.



--
Thiago Alves de Moraes
thiag...@gmail.com

Samer

unread,
Mar 26, 2010, 9:22:27 AM3/26/10
to javasf: JavaServer Faces Group
Vou postar minha solução completa caso alguém passe pelos mesmos
problemas:

public void generateReport() throws JRException, IOException {
String reportPath = ("/WEB-INF/relatorios/report1.jasper");

FacesContext facesContext = FacesContext.getCurrentInstance();
ServletContext servletContext = (ServletContext)
facesContext.getExternalContext().getContext();
String pathRel = servletContext.getRealPath(reportPath);
HttpServletResponse response = (HttpServletResponse)
facesContext.getExternalContext().getResponse();
ServletOutputStream outputStream = response.getOutputStream();

clients = clientDAO.listClientDAO();
JRBeanCollectionDataSource ds = new
JRBeanCollectionDataSource(clients);
try {
JasperPrint print = JasperFillManager.fillReport(pathRel, null, ds);

ByteArrayOutputStream output = new ByteArrayOutputStream();
JasperExportManager.exportReportToPdfStream(print, output);
response.setContentType("application/pdf");
response.addHeader("Content-
Disposition","attachment;filename=report1.pdf");
response.setContentLength(output.size());

outputStream.write(output.toByteArray(), 0, output.size());
outputStream.flush();
outputStream.close();
facesContext.responseComplete();
} catch (JRException e) {
System.out.println(e.getMessage());
}
}

Pra chamar o método no JSF, tem que usar o <h:commandButton
action="#{bean.generateReport}" />
Não esquecer de colocar o jar iText-2.1.0 no seu projeto.

Reply all
Reply to author
Forward
0 new messages