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


49 comentários

  1. #
    Everton
    março 16th, 2009 at 17:46

    E ae blz? para melhorar um pouco mais o seu tutorial vc poderia setar o classpath do iReport com os seus .class dos beans assim vc nao precira criar os fields na mao basta carregar os campos e chamá-los sem se preocupar e dar os nomes iguais e sem precisar declará-los na sua classe controller. Ou isso, deixa o iReport independente do java, pois ele soh irá cuidar do layout. Veja com mais detalhes na url abaixo no ultimo post.
    http://javafree.uol.com.br/topic-870555-RelatorioHibernate+Annotations+JSF+iReportindex

    Me add ae no talk para trocarmos umas ideias, e parabéns pelo tutorial, flw!

    Responda a esse comentário
  2. #
    Paulo
    abril 17th, 2009 at 6:08

    Olá,

    estou tentando usar JasperViewer mas sua saida é somente na maquina do servidor e não sai no cliente .

    Tem como fazer pra sair no cliente se puder me ajudar agradeceria…

    abs

    Responda a esse comentário
  3. #
    Alessandro Moreira
    abril 27th, 2009 at 17:18

    Caro Roberto,
    No seu exemplo como você retorna uma List o mapeamento com os fields do JasperReport se dá pelos nomes das propriedades. propriedade=textFields, ouja, autor=$F{autor}. Como faria o mapeamento no caso de uma List? Estou usado o JPA para fazer consultas ao banco. Por exemplo: List listaNome = em.createQuery(“select p.id as id, p.nome as nome from Pessoa p”).getResultList();
    Se eu usar: JRBeanCollectionDataSource sourcePessoa = new JRBeanCollectionDataSource(listaNome); ou
    JRBeanArrayDataSource sourcePessoa = new JRBeanArrayDataSource(listaNome.toArray());
    e no relatório tentar obter os campos $F{id} e $F{nome} obtenho a exception: net.sf.jasperreports.engine.JRException: Error retrieving field value from bean : id, devido: Caused by: java.lang.NoSuchMethodException: Unknown property ‘id’.

    Agradeço pela ajuda! Isto está atrasando minha tarefa.

    Responda a esse comentário
    • #
      Roberto Furutani
      abril 27th, 2009 at 17:52

      Olá
      Nunca trabalhei apenas com uma List de Long ou Integer, sempre usei com uma classe Entidade (Pessoa.id por exemplo). No seu problema é melhor retornar uma List de Pessoas ai no relatório você usa $F{pessoa.id} ao invés de $F{id}

      Responda a esse comentário
    • #
      Henrique S.
      setembro 10th, 2010 at 16:43

      Olá, tive o mesmo problema com:
      “java.lang.NoSuchMethodException: Unknown property ””
      No relatório eu estava utilizando um field do tipo Integer e tinha aplicado uma formatação utilizando a opção FieldPattern para #####0.
      Apesar de não ter nenhum registro null, estava tomando o erro…
      Tirei o pattern e funcionou!
      Felizmente este campo realmente não precisava de formatação…

      Responda a esse comentário
  4. #
    Alessandro Moreira
    abril 28th, 2009 at 8:16

    Roberto, no caso da query:
    List listaNome = em.createQuery(”select p.id as id, p.nome as nome from Pessoa p”).getResultList();
    Como faço o mapeamento já que cada linha(row) é um array de objetos e não uma propriedade de uma entidade??

    Olhando o JRJpaDataSource existe uma padrão:
    Fields are mapped to values in the result following these rules:
    * if the query returns a single object/bean (e.g. SELECT m FROM Movie m or SELECT NEW MovieDescription(m.title, m.genre) FROM Movie m), then the fields are mapped to bean property names.
    * if the query returns multiple objects per row (e.g. SELECT m.title, m.gender FROM Movie m), the fields are mapped using the following syntax: COLUMN_index[.property], with the indexes starting from 1. Example mappings: COLUMN_1, COLUMN_2, COLUMN_2.title, COLUMN_2.movie.title.

    O mesmo existe para o JRBean[Collection|Array]DataSource ? Seria possível resolver o me problema usando JRJpaDataSource ? Tenho procurado exemplos de como o usar mas apenas exemplos passando a conexão para o Jasper.

    Agradeço muito a ajuda!

    Responda a esse comentário
  5. #
    Alessandro Moreira
    abril 28th, 2009 at 16:36

    Caro Roberto, estou lhe enviando a solução que implementei. Obrigado pela ajuda!

    Criei uma especialização do JRDataSource. Veja o código abaixo.

    public class JRArrayDataSource implements JRDataSource {

    private Iterator iterator;
    private Object[] cursor;
    private int indice;

    public JRArrayDataSource(List array) {
    super();
    iterator = array.iterator();
    }

    public Object getFieldValue(JRField jrField) throws JRException {
    indice++;
    if (indice < cursor.length) {
    return cursor[indice];
    }
    return null;
    }

    public boolean next() throws JRException {
    boolean retorno = iterator.hasNext();
    if (retorno) {
    cursor = iterator.next();
    indice = -1;
    }
    return retorno;
    }
    }

    O que faço aki é iterar a Lista e depois passar ir lendo o array e retornando o valor.
    O importante é observar a sequencia dos campos no relatório. A ordem de criação deve bater com a ordem dos elementos no array, aí o mapeamente é feito sem problemas.

    Veja o código da geração do relatório abaixo:

    public static void gerarRelatorio() throws JRException {
    List array = new ArrayList();
    array.add(new Object[]{new Integer(1), “Alessandro Moreira”, “Caldeirão Furado, 13”, “32321010”});
    array.add(new Object[]{new Integer(2), “Wolverine”, “Escola Xavier, X”, “55551234”});

    JRArrayDataSource arrayDataSource = new JRArrayDataSource(array);

    JasperPrint print = JasperFillManager.fillReport(“relatorio/relatorioCliente.jasper”, new HashMap(), arrayDataSource);

    JasperViewer view = new JasperViewer(print);
    view.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    view.setSize(500, 600);

    view.setLocationRelativeTo(null);
    view.setVisible(true);
    }

    Responda a esse comentário
  6. #
    Roberto Furutani
    abril 28th, 2009 at 19:01

    Obrigado Alessandro pela contribuição.

    Responda a esse comentário
  7. #
    cintia
    maio 21st, 2009 at 14:37

    Quando tento executar sua classe inicio ela esta gerando a excecao:

    Error loading object from InputStream
    net.sf.jasperreports.engine.JRException: Error loading object from InputStream
    at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:200)
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:580)
    at Inicio.exibirRelatorio(Inicio.java:46)
    at Inicio.main(Inicio.java:99)
    Caused by: java.io.InvalidClassException: net.sf.jasperreports.engine.base.JRBaseReport; local class incompatible: stream classdesc serialVersionUID = 10101, local class serialVersionUID = 10200
    at java.io.ObjectStreamClass.initNonProxy(Unknown Source)
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
    at java.io.ObjectInputStream.readClassDesc(Unknown Source)
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
    at java.io.ObjectInputStream.readClassDesc(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:196)

    Responda a esse comentário
  8. #
    cintia
    maio 24th, 2009 at 23:10

    Não é o caminho, já testei isso… Tem alguma outra ideia??

    Responda a esse comentário
  9. #
    Bruno Sales
    junho 30th, 2009 at 10:13

    Olá Roberto Furutani,
    o seu tutorial realmente eh muito bom,
    porém nao consegui fazer o que eu estava querendo realmente,
    me deram uma missao de eu usar o ireport e fazer um select pela aplicação e representar num relatorio.

    o método que gera ta assim:

    public JasperPrint gerar() throws ExcRepositorio{

    JasperPrint rel = null;
    try {
    System.out.println(“Entrou no jasper”);
    Connection con = gConexao.getConnection();
    System.out.println(“abriu conexao de novo”);
    HashMap map = new HashMap();
    String descricao = (String) map.get(“descricao”);

    String arquivoJasper = “C:/java/Relatorio/src/tujura.jasper”;
    System.out.println(“A String que ta passando: \n” + arquivoJasper);

    rel = JasperFillManager.fillReport(arquivoJasper, map, con);
    System.out.println(“Passou aki eh beleza, o jasper recebeu”);

    JasperExportManager.exportReportToPdfFile( “tujura.jrprint” );

    } catch (JRException e) {
    System.out.println(“passou aqui significa erro”);
    JOptionPane.showMessageDialog(null,e.getMessage());
    }
    return rel;
    }

    e retorna isso de erro:

    Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/commons/digester/Rule
    at net.sf.jasperreports.components.ComponentsExtensionsRegistryFactory.(ComponentsExtensionsRegistryFactory.java:87)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)

    Alguma ideia ?
    obrigado!

    Responda a esse comentário
  10. #
    Jeremias Araújo
    julho 3rd, 2009 at 17:18

    Cintia, também estou com o mesmo problema e não consigo identificar o erro. Você pode me dizer se conseguiu resolver e como eu posso resolver o meu problema.

    Furutani, você pode dar alguma sugestão para a solução do problema.

    Grato,
    Jeremias Araujo

    Responda a esse comentário
  11. #
    Luis C
    julho 13th, 2009 at 22:02

    Excelente, esto resolvió mi problema

    Muchas Gracias !!!!!!!!!!!!!!

    Responda a esse comentário
  12. #
    Introdução a relatórios crosstab com iReport/JasperReports » Roberto Furutani
    julho 15th, 2009 at 0:06

    […] exemplo foi usado uma fonte de dados ODBC, mas nada impede usar uma Collection de beans para alimentar o […]

    Responda a esse comentário
  13. #
    Cristina
    julho 15th, 2009 at 8:33

    Bom dia,

    precisava de repetir a impressão de um report N vezes com a mesma informação, isto é, imprimir 1 de N, 2 de N, … N de N etiquetas com os mesmos dados.

    Alguém sabe como posso fazê-lo no ireport?

    Obrigada

    Responda a esse comentário
    • #
      Roberto Furutani
      julho 16th, 2009 at 11:50

      Bom dia Cristina, uma forma que vejo de fazer isso é popular o DataSource com N vezes a mesma informação. Não vi nada que facilite a criação de etiquetas no ireport.

      Responda a esse comentário
  14. #
    Luciano
    julho 19th, 2009 at 21:12

    Caro Roberto,
    Tentei compilar o seu codigo pra testar, mas está dando o seguintre erro:
    run:
    Exception in thread “main” java.lang.NullPointerException
    at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2266)
    at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2279)
    at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2750)
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:780)
    at java.io.ObjectInputStream.(ObjectInputStream.java:280)
    at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:191)
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:580)
    at Inicio.exibirRelatorio(Inicio.java:38)
    at Inicio.main(Inicio.java:90)
    Java Result: 1

    Não sei mais o que fazer.
    Já tentei verificar o caminho, mas não é. Ná hora que ele chama a impressão está dando erro.
    Aguardo soluções para este caso.

    Responda a esse comentário
    • #
      Roberto Furutani
      julho 19th, 2009 at 21:21

      Ele não encontra o arquivo jasper. Faça um debug e se ele está buscando no caminho certo, se estiver trabalhando com diretórios diferentes para os fontes e binários, verifique se o arquivo está no diretório dos binários.

      Responda a esse comentário
  15. #
    Cristina
    julho 21st, 2009 at 6:42

    Correcto, obrigada!

    Responda a esse comentário
  16. #
    Reginaldo
    julho 27th, 2009 at 19:02

    Bom noite, lhe desejo os parabéns pelo tutorial.
    Tentei adaptar as classes java para gerar em ambiente web, sendo visualizado em pdf, mas ocorreu o seguinte erro:

    java.lang.NullPointerException
    net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:138)
    net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:83)
    net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:601)
    net.sf.jasperreports.engine.JasperRunManager.runReportToPdf(JasperRunManager.java:419)
    rInicio.doGet(rInicio.java:103)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    org.apache.catalina.servlets.InvokerServlet.serveRequest(InvokerServlet.java:419)
    org.apache.catalina.servlets.InvokerServlet.doGet(InvokerServlet.java:133)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

    O arquivo jasper é o que baixei junto com as classes java.

    Obrigado pela atenção

    Responda a esse comentário
  17. #
    Italo
    setembro 30th, 2009 at 10:08

    Olá,
    Primeiro: parabéns pelo tutorial.
    Segundo: Meu relatório tem vários datasets com origem “JavaBean DataSource”. Como faço o .java para chamar o relatório?

    Sei que se fosse apenas um DataSet deveria chamar assim:

    jasperPrint = JasperFillManager.fillReport(stream, params, new JRBeanCollectionDataSource(data));

    Meu problema é quando tem vários CoolectionBeanDataSource

    Responda a esse comentário
    • #
      Roberto Furutani
      setembro 30th, 2009 at 20:22

      Olá

      O data source é um por relatório. O que vc pode tentar fazer é passar os outros data sources dentro de outro data source.
      Fica meio bagunçado.

      Responda a esse comentário
  18. #
    digÃo
    outubro 20th, 2009 at 15:10

    Cara, valeu pelo tutorial.
    Me ajudou muito aki.

    abraço

    Responda a esse comentário
  19. #
    Marcio
    dezembro 31st, 2009 at 12:43

    Muito obrigado, me ajudou bastante.

    Responda a esse comentário
  20. #
    Marcos de Sousa
    janeiro 18th, 2010 at 12:18

    Pegando o teu exemplo, como mostrar os registos agrupados?

    E sobre JRXmlDataSource?

    Abraço?

    Responda a esse comentário
  21. #
    Rafael Albani
    junho 9th, 2010 at 8:53

    Bom dia, parabéns pelo tutorial me auxiliou muito, tenho a seguinte dúvida quanto a disponibilização pelo JRBeanCollectionDataSource, quando tenho uma lista com objetos que contém outros objetos dentro dela, como faço para retornar os valores desses “sub-objetos” para o relatório, agradeço desde já.

    Responda a esse comentário
  22. #
    Harly Carreiro
    outubro 20th, 2010 at 20:01

    Os meus fields de uma lista de Matrículas estão desta forma:

    Nenhum dos dois aparece no relatório! tenho que mencionar Matrículas em algum lugar para que o .jrxml entenda que são campos de uma matrícula?

    Valeu!

    Responda a esse comentário
    • #
      Roberto Furutani
      outubro 20th, 2010 at 20:29

      Se a lista de Matrículas servir de datasource para o relatório basta criar um JRBeanCollectionDataSource com ela e passar pro relatório, não precisa referenciá-lo no ireport

      Responda a esse comentário
  23. #
    vanderlei Augustinho
    outubro 24th, 2010 at 23:53

    Boa noite, estou usando o netbeans 6.8 com ireport 3.7.5, ja consegui criar os relatorios, mas nao sei como chama-los de dentro da minha aplicação, copiei alguns modelos mas não funcionou.

    ele pede para criar a classe
    JRResultSetDataSource e JasperPrint no pacote

    Responda a esse comentário
  24. #
    Fernando
    outubro 4th, 2011 at 18:47

    Boa noite Roberto, estou montando um relatorio, mais a saida só esta no servidor e não no cliente. Segue abaixo o codigo.
    Ver se tem como me ajudar.

    public JasperPrint doGerarRelatorio() throws ExcRepositorio, JRException, SQLException{

    String query = “”;
    JasperPrint impressao = null;
    Connection conn;

    try {

    query = “SELECT diasfa.`DATAMOVTO` AS diasfa_DATAMOVTO, “;
    query = query + “diasfa.`HRFINAL` AS diasfa_HRFINAL, “;
    query = query + “diasfa.`HRINICIAL` AS diasfa_HRINICIAL, “;
    query = query + “diasfa.`HRINTERVALO` AS diasfa_HRINTERVALO, “;
    query = query + “diasfa.`HRTOTAL` AS diasfa_HRTOTAL, “;
    query = query + “atividade.`VLCLIENTE` AS atividade_VLCLIENTE, “;
    query = query + “participante.`NOMEFANTASIA` AS participante_NOMEFANTASIA, “;
    query = query + “usuario.`APELIDO` AS usuario_APELIDO “;
    query = query + “FROM `atividade` atividade INNER JOIN `diasfa` diasfa ON atividade.`id` = diasfa.`ATIVIDADE_id` “;
    query = query + “INNER JOIN `fichaaprop` fichaaprop ON diasfa.`FICHAAPROP_id` = fichaaprop.`id` “;
    query = query + “INNER JOIN `projeto` projeto ON fichaaprop.`PROJETO_id` = projeto.`id` “;
    query = query + “INNER JOIN `usuario` usuario ON fichaaprop.`USUARIO_id` = usuario.`id` “;
    query = query + “INNER JOIN `participante` participante ON projeto.`PARTICIPANTE_id` = participante.`id` “;
    query = query + “WHERE usuario.`id` = “+idUsuario;
    query = query + “ORDER BY usuario.`APELIDO` ASC, participante.`NOMEFANTASIA` ASC, diasfa.`DATAMOVTO` ASC”;

    // PreparedStatement pstmt = DB.
    conn = ConectaBanco.getConexao();
    InputStream reportStream = this.getServletContext().getResourceAsStream(“/WEB-INF/protected/relatorios/admProjetos/HoraApontadas.jasper”);

    Statement stm = conn.createStatement();
    ResultSet rs = stm.executeQuery(query);
    JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);
    HashMap map = new HashMap();

    JasperReport rel = (JasperReport)JRLoader.loadObject(reportStream);
    impressao = JasperFillManager.fillReport(rel, map, jrRS);

    JasperViewer visualizador = new JasperViewer(impressao, false);
    visualizador.setVisible(true);

    } catch (ExcRepositorio ex) {
    Logger.getLogger(Notasfiscais.class.getName()).log(Level.SEVERE, null, ex);
    }
    return impressao;
    }

    Obrigado.

    Responda a esse comentário
  25. #
    Bruno
    outubro 17th, 2011 at 12:48

    Roberto estou com o mesmo problema q a cintia citou acima;

    net.sf.jasperreports.engine.JRException: Error loading object from InputStream

    ele encontra meu relatorio quando eu dou um :

    viewer.show();

    para ele exibir o relatorio ele exibe…mais nao vai na hora de exibir em pdf.

    Responda a esse comentário
  26. #
    Michel orth
    janeiro 30th, 2012 at 11:01

    olá belo topico, estou com um probleminha, estou tendo que gerar relatorio usando duas listas de objetos diferentes, tentei assim mas não deu certo

    JasperPrint preencher = JasperFillManager.fillReport(pathReport, null,	new JRBeanCollectionDataSource(relatoriosOs));
    			preencher = JasperFillManager.fillReport(pathReport, null,	new JRBeanCollectionDataSource(tiposDeServico));

    como posso fazer?

    Responda a esse comentário
  27. #
    Eduardo Alves
    fevereiro 2nd, 2012 at 23:29

    Roberto Furutani,

    Parabéns pelo Tutorial…

    Estou a dias pesquisando sobre um erro ao gerar o relatório pelo .jasper, e não encontro nada satisfatório a respeito.Peço URGENTEMENTE sua ajuda.
    Meu .jasper gera o relatório perfeito no Ireport 4.5.0, mas quando eu o coloco na projeto na pasta src, ele gera o seguinte erro:

    net.sf.jasperreports.engine.JRException: java.net.MalformedURLException

    Estou fazendo assim:

    FacesContext contexto = FacesContext.getCurrentInstance();

    HttpServletResponse response = (HttpServletResponse) contexto.getExternalContext().getResponse();
    ServletOutputStream responseStream = response.getOutputStream();

    //URL caminho = getClass().getResource(“../RelatorioOmissao.jasper”);

    InputStream caminho = getClass().getResourceAsStream(“../RelatorioOmissao.jasper”);

    JasperReport pathReport = JasperCompileManager.compileReport(caminho);
    @SuppressWarnings(“rawtypes”)
    HashMap map = new HashMap();

    JasperPrint preencher = JasperFillManager.fillReport(pathReport,map,new JRBeanCollectionDataSource(listaObjOmissao));
    JasperExportManager.exportReportToPdfStream(preencher, responseStream);

    System.out.println(“gerou todo pdf”);
    //JasperViewer.viewReport(preencher);
    response.setContentType(“aplication/pdf”);
    response.setHeader(“Content-Disposition”,”attachment;filename=\”RelatorioOmissao.pdf\””);
    responseStream.flush();
    responseStream.close();
    contexto.renderResponse();
    contexto.responseComplete();

    Mesmo tentando vizualiza-lo no proprio navegador ou pelo
    JasperView o erro persiste.

    Please….aguardo respostas….

    Eduardo Alves
    eduardimaa@gmail.com

    Responda a esse comentário
  28. #
    Renato
    setembro 17th, 2012 at 15:10

    Valeu, brigadão! Ajudou bastante aqui… abraço!

    Responda a esse comentário
  29. #
    Moacir
    maio 19th, 2013 at 16:41

    Esse post me sanou muitas dúvidas. Valeu!

    Responda a esse comentário
  30. #
    Felipe Roger
    abril 22nd, 2014 at 18:25

    Ola Roberto, não sei se vc se lembra desse post, mas talvez possa esclarecer mina duvida, eu quero saber como faço para passar o JRBeanCollectionDataSource com um total de dados e filtrar no relatório o que será exibido, EX: tenho um relatório nele mando uma lista com todas as cidades, e no sub relatório quero que mostre as pessoas que moram em cada cidade, só que eu mando a lista completa de pessoas, existe um modo de fazer isso?

    Responda a esse comentário
    • #
      Roberto Furutani
      abril 23rd, 2014 at 22:12

      Olá, eu não sei se é possível fazer isso passando os dados brutos pro jasper e ele filtrar os dados.
      Eu faria o filtro na aplicação e passaria o JRBeanCollectionDataSource só com os dados que eu quero que apareça.

      Responda a esse comentário
  31. #
    Antony
    agosto 18th, 2016 at 22:52

    Boa Noite, estou fazendo tudo igual, está apresentado esse err, Poderia me ajudar!

    Ago 18, 2016 9:33:54 PM net.sf.jasperreports.engine.component.ComponentsEnvironment findBundles
    ADVERTÊNCIA: Found two components for namespace http://jasperreports.sourceforge.net/jasperreports/components
    Ago 18, 2016 9:33:54 PM net.sf.jasperreports.engine.component.ComponentsEnvironment findBundles
    ADVERTÊNCIA: Found two components for namespace http://jasperreports.sourceforge.net/jasperreports/components
    Ago 18, 2016 9:33:55 PM net.sf.jasperreports.engine.component.ComponentsEnvironment findBundles
    ADVERTÊNCIA: Found two components for namespace http://jasperreports.sourceforge.net/jasperreports/components
    Exception in thread “main” net.sf.jasperreports.engine.JRException: java.net.MalformedURLException
    at net.sf.jasperreports.engine.xml.JRXmlLoader.loadXML(JRXmlLoader.java:305)
    at net.sf.jasperreports.engine.xml.JRXmlLoader.loadXML(JRXmlLoader.java:284)
    at net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:273)
    at net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:247)
    at net.sf.jasperreports.engine.JasperCompileManager.compile(JasperCompileManager.java:338)
    at net.sf.jasperreports.engine.JasperCompileManager.compileReport(JasperCompileManager.java:605)
    at relatoriomedicos.RelatorioMedicos.RelatorioComb(RelatorioMedicos.java:113)
    at Model.Conexao.consultaRQ3(Conexao.java:203)
    at Model.Conexao.main(Conexao.java:213)
    Caused by: java.net.MalformedURLException
    at java.net.URL.(URL.java:619)
    at java.net.URL.(URL.java:482)
    at java.net.URL.(URL.java:431)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:616)
    at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:189)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:812)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:648)
    at org.apache.commons.digester.Digester.parse(Digester.java:1892)
    at net.sf.jasperreports.engine.xml.JRXmlLoader.loadXML(JRXmlLoader.java:297)
    … 8 more
    Caused by: java.lang.NullPointerException
    at java.net.URL.(URL.java:524)
    … 19 more
    eu não sei o que é.

    Responda a esse comentário

Deixe um comentário