Pular para o conteúdo

Usando o JRBeanCollectionDataSource

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

[sourcecode language=’java’]package exemplo;
public class Livro {
private String titulo;
private String autor;
private String isbn;
private String editora;
private String descricao;

public Livro(){}
// todos getters e setters omitidos} [/sourcecode]

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.

[sourcecode language=’java’] Compiling to file… .Livros.jasper -> C:iReport-0.5.3Livros.java
it.businesslogic.ireport.ReportClassLoader@1a73d30
Compilation running time : 260[/sourcecode]

Um dos erros mais comuns é esse

[sourcecode language=’java’]
Errors compiling .Livros.jasper!
it.businesslogic.ireport.ReportClassLoader@e05ad6
net.sf.jasperreports.engine.JRException:
Report design not valid : 1. Field not found : Titulo
[/sourcecode]
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.

[sourcecode language=’java’]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);

// O datasource
JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(
listaLivros);

// 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();
}
}

[/sourcecode]

É 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.

49 comentários em “Usando o JRBeanCollectionDataSource”

  1. 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!

  2. 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

  3. 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.

    1. 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}

    2. 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…

  4. 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!

  5. 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);
    }

  6. 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)

  7. 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!

  8. 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

  9. Pingback: Introdução a relatórios crosstab com iReport/JasperReports » Roberto Furutani

  10. 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

  11. 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.

    1. 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.

  12. 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

  13. 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

  14. 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á.

  15. 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!

  16. 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

  17. 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.

  18. 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.

  19. 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

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

    como posso fazer?

  20. 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

  21. 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?

    1. 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.

  22. 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 é.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *