Relatório Ireport + JasperReport com Hibernate

olá Pessoal,

Neste post vou mostrar como gerar um relatório usando Ireport de onde as informações vem do BD. Além disso usaremos o Hibernate para conexão. É bem comum uma aplicação o cliente querer algum tipo de relatório. Para gerar os relatorios vamos usar Ireport e o JasperReport. Fiz uma pesquisa rapida na internet e vi alguns posts eram limitados à criar relatórios sem banco de dados, alguns com banco de dados, porem confusos de entender eu sentir dificuldade de compreender,levando em conta que nunca tivesse visto o assunto. E no “mundo real”, se gera relatório de uma base de dados, que na maioria das vezes é um banco de dados. Bom eu tentarei ser pratico no post e a teorica abordada aqui será o suficiente para saber o que significa se deseja se aprofundar no assunto sugiro usar o velho Google e participar das comunidades ou comprar um livro.

Outro ponto  é que neste post será um Java Project normal, em outro post veremos como fazer isso em JEE em um projeto JSF.

Lets go..

Iniciando

Vou levar em conta, que você já tem um BD e uma tabela de onde deseja extrair a informação. Essa é a minha:

ireportbdus

Requisitos:

Você precisa fazer o download do Ireport. A versão mais recente é 3.7.6 neste momento que escrevo o post.


Configuração

copiar os .jars que estã na pasta ext do Ireport para o projeto Java . Se for JEE, adicionar na pasta lib. Não esquecer do .jar para o banco de dados caso os dados relatório venha de um banco de dados, que é o mais real e comum.

  • commons-beanutils

  • commons-collections

  • commons-digester

  • commons-logging

  • groovy-all

  • iText

  • poi

  • jasperreports


Veja o que é Ireport & JasperReport (de forma simples e direta):

Ireport = é uma especie de IDE para criação do layout do seu relatório, ou seja, que cara vai ter e o que vai ter no seu relatório. E é aqui que fazemos a conexão com o banco de dados e consequentemente as tabelas e onde informamos quais colunas de uma tabela vai aparecer no relatório. Ele gera um arquivo .jrxml que será lido por JasperReport.


JasperReport = É uma API que permite nossa classe Java estabelecer uma “conversa” com o nosso layout-relatório. Isso vem a ser util para que sua aplicação Java, gere relatórios em um único ambiente. O usuário não percebe que foi gerado por algo “fora” Java(isso para aqueles que sabem o que é Java).

Na pratica como acontece:

– o desenvolvedor vai lá e cria o layout do relatório com base no proposito deste e põe logomarca da empresa e os dados que devem aparecer. Não precisa ser um webdesigner para desenhar o layout. E é no Ireport que falamos de onde vem a info se será de um BD ou não.

-No JasperReport apenas setamos onde está o layout .jrxml do Ireport e em seguida informamos e é aqui que informamos para qual tipo vamos exportar o relatório: PDF,XML, HTML, TEXT. Podemos dizer que será gerado um arquivo em um local especifico ou se for um JEE, que vai ser carregado pelo Browser.

Note: os nomes das variaveis da classe devem estar iguais aos nomes dos campos (fields) no layout do relatório.

Mão na massa

Vamos colocar mão na massa por partes:

Parte 1: ir para o Ireport (não vou enumerar porque vai ficar zuado a formatação)

vamos primeiro criar um arquivo no Ireport e seguir as instruções do assistente que é bem simples:

ireportimg1

Na parte de banco de dados basta informar os de conexão do banco.

ireportimg2

Feito isso temos o o relatório na tela e podemos edita-lo. Observe que já foi montando com os dados do banco de dados, ou seja, com os nomes da coluna e nos devidos locais, isso acontece no Ireport mais recente, as vezes antigas não faziam isso.

ireportimg3

Parte 2: No Eclipse

Agora no Eclipse precisamos criar um projeto. Este será um Java Project.

Passos:

-Crie o Bean (os nomes entre o bean e os fields no layout devem ser os mesmos)

-Crie conexão com banco de dados (usamos o Hibernate)

-Crie um método List na classe DAO usando HQL com a query que deseja;

-importar para o projeto do eclipse o arquivo jrxml

-crie a classe main com exportando o relatório


Abaixo veja a estrutura do meu projeto

ireportprojectbdmain

note: é recomendavel colocar o .jrxml em um package para terceiro não ter acesso, mas coloquei fora só para mostrar que é possível rodar fora sem problemas algum.

A classe Bean

  1. @Entity
  2. @Table(name=“tusuario”)
  3. public class Usuario {
  4. @Column
  5. private String nome;
  6. @Column
  7. private String email;
  8. @Id
  9. private int id;
  10. //gets/sets omitidos

Gerando o relatório

Essa é a classe principal que de fato faz gerar o relatório em PDF, pegando o layout definido no Ireport o JasperReport faz a conversão, veja:

  1. public class GerarRelatorio {
  2. public static void main(String[] args) throws JRException,SQLException {
  3. System.out.println(“Gerando relatório…”);
  4. UsuarioDAO usuarioDAO = new UsuarioDAO();
  5. List listaUs = usuarioDAO.listaTodos();
  6. JasperReport pathjrxml = JasperCompileManager.compileReport(“relatorio/reportex.jrxml”);
  7. JasperPrint printReport = JasperFillManager.fillReport(pathjrxml, nullnew JRBeanCollectionDataSource(listaUs));
  8. JasperExportManager.exportReportToPdfFile(printReport, “relatorio/reportex.pdf”);
  9. System.out.println(“Relatorio gerado”);
  10. }

Entendendo o código acima

Minha classe UsuarioDAO: ela retorna todos os usuarios atraves de uma query HQL.

  1. public List listaTodos(){
  2. Query query = getSession().createQuery(“from Usuario”);
  3. List listaUs = query.list();
  4. return listaUs;
  5. }

Note: Informando o JRXML: Link interessante

Na classe relatório precisamos informar onde está o arquivo jrxml(nao esqueca de criar o folder)

  1. JasperReport report = JasperCompileManager.compileReport(“relatorio/reportcamilo.jrxml”);

Dica:

Se o jrxml estiver no mesmo package que a classe que gera o relatório o código acima é valido do contrario, deve ser conforme abaixo:

  1. “../relatorio/reportblog.jrxml”

Passando o DATA SOURCE

O data source nada mais eh que uma lista com os dados que serao inseridos no relatorio.

  1. JasperPrint print = JasperFillManager.fillReport(report, null,new JRBeanCollectionDataSource(listaUS));

obs. No primeiro argumento temos o caminho do layout do relatorio gerado pelo ireport, parametro pode ser null e criamos um data source com o conteudo da lista que tem o resultado HQL

  1. class dao
  2. public List listaUsuario(){
  3. Query query = getSession().createQuery(“from Tusuario”);
  4. List lista = query.list();
  5. return lista;

em outra classe ….
TUsuarioDAO tusuariodao = new TUsuarioDAO();
List listaUS = tusuariodao.listaUsuario();

em outra classe …

  1. TUsuarioDAO tusuariodao = new TUsuarioDAO();
  2. List listaUS = tusuariodao.listaUsuario();

Exportando para um Formato

Para exportar temos metodos para cada formato de exportacao

  1. JasperExportManager.exportReportToPdfFile(print,“relatorio/RelatorioUser.pdf”);

obs. No primeiro argumento temos a variavel que tem o relatorio preenchido e o caminho que deve ser exportado .So rodar a classe main, agora.

Download do Projeto

Vou ficando por aqui espero que tenham gostado do post.

See you next post. 🙂

26 comentários em “Relatório Ireport + JasperReport com Hibernate”

  1. Opa Camilo, quero tirar uma dúvida:
    E se eu tenho uma mapeamento one-to-one e quero trazer os dados de duas tabelas? Meu relatório ta certinho no iReport, masto tentando gerar ele através da minha aplicação e da erro. Tem alguma idéia? Eu criei um DAO Generico:

    public class genericDAO implements InterfacegenericDAO
    {
    private final Session sessao;
    Transaction transacao= null;

    public genericDAO(Object objeto)
    {
    this.sessao = hibernate_util.getSession();
    this.objeto = objeto;

    }
    public void inserir()
    {
    try
    {
    transacao = sessao.beginTransaction();
    sessao.save(objeto);
    transacao.commit();
    }
    catch(HibernateException erro)
    {
    JOptionPane.showMessageDialog(null, erro);
    transacao.rollback();
    }
    }

    public void excluir()
    {
    try
    {
    transacao = sessao.beginTransaction();
    sessao.delete(objeto);
    transacao.commit();
    }
    catch(HibernateException erro)
    {
    JOptionPane.showMessageDialog(null, “Erro ao deletar dados.: “+erro);
    transacao.rollback();
    }

    }

    public void atualizar()
    {
    try
    {
    transacao = sessao.beginTransaction();
    sessao.update(objeto);
    transacao.commit();
    }
    catch(HibernateException erro)
    {
    JOptionPane.showMessageDialog(null, “Erro ao alterar dados.: “+erro);
    transacao.rollback();
    }

    }

    public List listar(String classe)
    {
    List lista = sessao.createQuery(“from “+classe+” order by end_id”).list();
    return lista;
    }

    public List listar_todos(String classe) {
    List lista = sessao.createQuery(“from “+classe).list();
    return lista;
    }

    }

  2. Opa Camilo, ta difícil postar o erro, a página não carrega o comente…xD

    log4j:WARN No appenders could be found for logger (net.sf.jasperreports.extensions.ExtensionsEnvironment).
    log4j:WARN Please initialize the log4j system properly.
    net.sf.jasperreports.engine.JRException: Error retrieving field value from bean : end_id
    at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getBeanProperty(JRAbstractBeanDataSource.java:123)
    at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getFieldValue(JRAbstractBeanDataSource.java:96)
    at net.sf.jasperreports.engine.data.JRBeanCollectionDataSource.getFieldValue(JRBeanCollectionDataSource.java:100)
    at net.sf.jasperreports.engine.fill.JRFillDataset.setOldValues(JRFillDataset.java:864)
    at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:828)
    at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1439)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:127)
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:903)
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:832)
    at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:84)
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:624)
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:540)
    at Relatorios.JasperTest.main(JasperTest.java:37)
    Caused by: java.lang.NoSuchMethodException: Unknown property ‘end_id’ on class ‘class [Ljava.lang.Object;’
    at org.apache.commons.beanutils.PropertyUtilsBean.getSimpleProperty(PropertyUtilsBean.java:1322)
    at org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUtilsBean.java:770)
    at org.apache.commons.beanutils.PropertyUtilsBean.getProperty(PropertyUtilsBean.java:846)
    at org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils.java:426)
    at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getBeanProperty(JRAbstractBeanDataSource.java:111)
    … 12 more
    Java Result: 1
    CONSTRUÍDO COM SUCESSO (tempo total: 23 segundos)

  3. Pelo que entendi ele reclama que não ta achando meus campos no banco, só que to achando esquisito pois esta igualzinho ao banco.

    1. ola plabo,

      pelo que vi nas mensagem de erro, tem um campo desconhecido, dá uma olhada ai, e ver como tá. olha, tb o mapeamento do teu hibernate.

      flw.

  4. Olá Camilo!
    Estou baixando o projeto, mas nao consigo descompactá-lo. O que devo fazer? Estou usando o win 7 e winrar.
    Abs

    1. Franklin,
      o projeto está no formato .zip, eu ja tive problema ao usar o winrar para descompactar formatos .zip. tenta usar o winzip.
      abracos,

  5. Opa camilo, tentei pegar o seu projeto mas ta vindo corrompido. Não cosigo abrir nem usando o winrar nem usando o winzip!

    Se puder atualizar agradeço

    Forte Abraço!

  6. olá Camilo boa noite,cara esse exemplo funciona quando por exemplo o nome das minhas colunas no banco estão diferentes da minha entidade java por exemplo se eu tiver no bd varchar nome_pessoa e na minha entity eu tenho @Column(name=”nome_pessoa”) private String nomePessoa ?? não corro risco de pegar uma exceção de campo desconhecido?vc poderia ao inves de usar sql puro no iReport ter usado a propria HQL ,isso é só um sugestão pra um post novo rsrsrs.Valeu camilo muito bons seus tutoriais ,parabéns peo trabalho

    1. olá Ricardo,
      Essa questao de nome é bem pontual, pois tudo depende do projeto, nem sempre nos desenvolvedores temos o poder de alterar nomes no banco e vamos só saber como está e vamos trabalhar em cima daquilo. Se tiver realmente com o nome diferente vamos ter uma exceção. Mas, até ai não tem problema nenhum, é pra isso que serve as exceções nos alertar de algo e vc vai ter ela de imediato antes de colocar tudo em produção. Tb concordo de usar o HQL, pq ai vamos trabalhar com o valor do bean, bem pensado :).
      valeu!

  7. Ola Camilo!!!
    Veja o erro que esta dando … o que estou fazendo de errado?
    o meu note está com SO de 64.
    Grato abs

    11/03/2012 16:55:43 org.apache.catalina.core.AprLifecycleListener init
    INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files (x86)\Java\jre1.6.0_02\bin;.;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Program Files\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Live;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Windows Live\Shared
    11/03/2012 16:55:43 org.apache.tomcat.util.digester.SetPropertiesRule begin
    WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property ‘source’ to ‘org.eclipse.jst.jee.server:fj21-tarefas’ did not find a matching property.
    11/03/2012 16:55:43 org.apache.tomcat.util.digester.SetPropertiesRule begin
    WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property ‘source’ to ‘org.eclipse.jst.j2ee.server:Modelo_Projeto_Final_v1.39’ did not find a matching property.
    11/03/2012 16:55:43 org.apache.tomcat.util.digester.SetPropertiesRule begin
    WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property ‘source’ to ‘org.eclipse.jst.jee.server:IReportBlog’ did not find a matching property.
    11/03/2012 16:55:43 org.apache.coyote.AbstractProtocol init
    INFO: Initializing ProtocolHandler [“http-bio-8080”]
    11/03/2012 16:55:43 org.apache.coyote.AbstractProtocol init
    INFO: Initializing ProtocolHandler [“ajp-bio-8009”]
    11/03/2012 16:55:43 org.apache.catalina.startup.Catalina load
    INFO: Initialization processed in 759 ms
    11/03/2012 16:55:43 org.apache.catalina.core.StandardService startInternal
    INFO: Starting service Catalina
    11/03/2012 16:55:43 org.apache.catalina.core.StandardEngine startInternal
    INFO: Starting Servlet Engine: Apache Tomcat/7.0.23
    11/03/2012 16:55:44 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
    INFO: Parsing configuration file [struts-default.xml]
    11/03/2012 16:55:44 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
    INFO: Parsing configuration file [struts-plugin.xml]
    11/03/2012 16:55:44 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
    INFO: Parsing configuration file [struts.xml]
    11/03/2012 16:55:45 org.apache.catalina.loader.WebappClassLoader validateJarFile
    INFO: validateJarFile(D:\Projeto\.metadata\.plugins\org.eclipse.wst.server.core\tmp2\wtpwebapps\IReportBlog\WEB-INF\lib\servlet-api.jar) – jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
    11/03/2012 16:55:45 org.apache.catalina.startup.TaglibUriRule body
    INFO: TLD skipped. URI:
    http://java.sun.com/jsf/html
    is already defined
    11/03/2012 16:55:45 org.apache.catalina.startup.TaglibUriRule body
    INFO: TLD skipped. URI: http://java.sun.com/jsf/core is already defined
    11/03/2012 16:55:45 com.sun.faces.config.ConfigureListener contextInitialized
    INFO: Initializing Sun’s JavaServer Faces implementation (1.2_04-b07-FCS) for context ‘/IReportBlog’
    11/03/2012 16:55:46 com.sun.faces.spi.InjectionProviderFactory createInstance
    INFO: JSF1048: PostConstruct/PreDestroy annotations present. ManagedBeans methods marked with these annotations will have said annotations processed.
    11/03/2012 16:55:46 org.apache.coyote.AbstractProtocol start
    INFO: Starting ProtocolHandler [“http-bio-8080”]
    11/03/2012 16:55:46 org.apache.coyote.AbstractProtocol start
    INFO: Starting ProtocolHandler [“ajp-bio-8009”]
    11/03/2012 16:55:46 org.apache.catalina.startup.Catalina start
    INFO: Server startup in 3088 ms
    11/03/2012 16:55:48 com.sun.facelets.compiler.TagLibraryConfig loadImplicit
    INFO: Added Library from: jar:file:/D:/Projeto/.metadata/.plugins/org.eclipse.wst.server.core/tmp2/wtpwebapps/IReportBlog/WEB-INF/lib/jsf-facelets.jar!/META-INF/jsf-core.taglib.xml
    11/03/2012 16:55:48 com.sun.facelets.compiler.TagLibraryConfig loadImplicit
    INFO: Added Library from: jar:file:/D:/Projeto/.metadata/.plugins/org.eclipse.wst.server.core/tmp2/wtpwebapps/IReportBlog/WEB-INF/lib/jsf-facelets.jar!/META-INF/jsf-html.taglib.xml
    11/03/2012 16:55:48 com.sun.facelets.compiler.TagLibraryConfig loadImplicit
    INFO: Added Library from: jar:file:/D:/Projeto/.metadata/.plugins/org.eclipse.wst.server.core/tmp2/wtpwebapps/IReportBlog/WEB-INF/lib/jsf-facelets.jar!/META-INF/jsf-ui.taglib.xml
    11/03/2012 16:55:48 com.sun.facelets.compiler.TagLibraryConfig loadImplicit
    INFO: Added Library from: jar:file:/D:/Projeto/.metadata/.plugins/org.eclipse.wst.server.core/tmp2/wtpwebapps/IReportBlog/WEB-INF/lib/jsf-facelets.jar!/META-INF/jstl-core.taglib.xml
    11/03/2012 16:55:48 com.sun.facelets.compiler.TagLibraryConfig loadImplicit
    INFO: Added Library from: jar:file:/D:/Projeto/.metadata/.plugins/org.eclipse.wst.server.core/tmp2/wtpwebapps/IReportBlog/WEB-INF/lib/jsf-facelets.jar!/META-INF/jstl-fn.taglib.xml
    log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
    log4j:WARN Please initialize the log4j system properly.
    11/03/2012 16:55:53 com.sun.faces.application.ActionListenerImpl processAction
    SEVERE: java.lang.NullPointerException
    javax.faces.el.EvaluationException: java.lang.NullPointerException
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:97)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
    at javax.faces.component.UICommand.broadcast(UICommand.java:383)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:447)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:752)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
    at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
    Caused by: java.lang.NullPointerException
    at sun.jdbc.odbc.JdbcOdbcDriver.getProtocol(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcDriver.knownURL(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcDriver.acceptsURL(Unknown Source)
    at java.sql.DriverManager.getDriver(Unknown Source)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1437)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
    at org.hibernate.connection.DatasourceConnectionProvider.getConnection(DatasourceConnectionProvider.java:69)
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:423)
    at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
    at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139)
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1547)
    at org.hibernate.loader.Loader.doQuery(Loader.java:673)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
    at org.hibernate.loader.Loader.doList(Loader.java:2220)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
    at org.hibernate.loader.Loader.list(Loader.java:2099)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
    at br.com.camilolopes.dao.UsuarioDAO.listaUSALL(UsuarioDAO.java:11)
    at br.com.camilolopes.controler.ControlerUS.gerarRelatorioUS(ControlerUS.java:15)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:262)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
    at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:77)
    … 24 more
    11/03/2012 16:55:53 com.sun.faces.lifecycle.InvokeApplicationPhase execute
    WARNING: #{controlerUS.gerarRelatorioUS}: java.lang.NullPointerException
    javax.faces.FacesException: #{controlerUS.gerarRelatorioUS}: java.lang.NullPointerException
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:107)
    at javax.faces.component.UICommand.broadcast(UICommand.java:383)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:447)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:752)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
    at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
    Caused by: javax.faces.el.EvaluationException: java.lang.NullPointerException
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:97)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
    … 23 more
    Caused by: java.lang.NullPointerException
    at sun.jdbc.odbc.JdbcOdbcDriver.getProtocol(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcDriver.knownURL(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcDriver.acceptsURL(Unknown Source)
    at java.sql.DriverManager.getDriver(Unknown Source)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1437)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
    at org.hibernate.connection.DatasourceConnectionProvider.getConnection(DatasourceConnectionProvider.java:69)
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:423)
    at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
    at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139)
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1547)
    at org.hibernate.loader.Loader.doQuery(Loader.java:673)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
    at org.hibernate.loader.Loader.doList(Loader.java:2220)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
    at org.hibernate.loader.Loader.list(Loader.java:2099)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
    at br.com.camilolopes.dao.UsuarioDAO.listaUSALL(UsuarioDAO.java:11)
    at br.com.camilolopes.controler.ControlerUS.gerarRelatorioUS(ControlerUS.java:15)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:262)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
    at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:77)
    … 24 more
    11/03/2012 16:55:53 com.sun.faces.lifecycle.LifecycleImpl phase
    WARNING: executePhase(INVOKE_APPLICATION 5,com.sun.faces.context.FacesContextImpl@edec92) threw exception
    javax.faces.FacesException: #{controlerUS.gerarRelatorioUS}: java.lang.NullPointerException
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:105)
    at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
    Caused by: javax.faces.FacesException: #{controlerUS.gerarRelatorioUS}: java.lang.NullPointerException
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:107)
    at javax.faces.component.UICommand.broadcast(UICommand.java:383)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:447)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:752)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
    … 19 more
    Caused by: javax.faces.el.EvaluationException: java.lang.NullPointerException
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:97)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
    … 23 more
    Caused by: java.lang.NullPointerException
    at sun.jdbc.odbc.JdbcOdbcDriver.getProtocol(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcDriver.knownURL(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcDriver.acceptsURL(Unknown Source)
    at java.sql.DriverManager.getDriver(Unknown Source)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1437)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
    at org.hibernate.connection.DatasourceConnectionProvider.getConnection(DatasourceConnectionProvider.java:69)
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:423)
    at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
    at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139)
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1547)
    at org.hibernate.loader.Loader.doQuery(Loader.java:673)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
    at org.hibernate.loader.Loader.doList(Loader.java:2220)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
    at org.hibernate.loader.Loader.list(Loader.java:2099)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
    at br.com.camilolopes.dao.UsuarioDAO.listaUSALL(UsuarioDAO.java:11)
    at br.com.camilolopes.controler.ControlerUS.gerarRelatorioUS(ControlerUS.java:15)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:262)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
    at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:77)
    … 24 more
    11/03/2012 16:55:53 org.apache.catalina.core.StandardWrapperValve invoke
    SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/IReportBlog] threw exception [null] with root cause
    java.lang.NullPointerException
    at sun.jdbc.odbc.JdbcOdbcDriver.getProtocol(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcDriver.knownURL(Unknown Source)
    at sun.jdbc.odbc.JdbcOdbcDriver.acceptsURL(Unknown Source)
    at java.sql.DriverManager.getDriver(Unknown Source)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1437)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
    at org.hibernate.connection.DatasourceConnectionProvider.getConnection(DatasourceConnectionProvider.java:69)
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:423)
    at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
    at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139)
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1547)
    at org.hibernate.loader.Loader.doQuery(Loader.java:673)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
    at org.hibernate.loader.Loader.doList(Loader.java:2220)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
    at org.hibernate.loader.Loader.list(Loader.java:2099)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
    at br.com.camilolopes.dao.UsuarioDAO.listaUSALL(UsuarioDAO.java:11)
    at br.com.camilolopes.controler.ControlerUS.gerarRelatorioUS(ControlerUS.java:15)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:262)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
    at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:77)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
    at javax.faces.component.UICommand.broadcast(UICommand.java:383)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:447)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:752)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
    at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

    1. olá Frank,

      É dificil eu conseguir ler todo log de erro aqui na pagina comentarios, pode me enviar por email, please? Mas, passando o olho eu vi um NullPointer na sua aplicação então já tem ideia do que seja ne?

      abracos,

  8. Ola Camilo, cara fiquei na dúvida de como fazer se no meu relatorio a busca é em duas tabelas, um INNER JOIN. Poderia me explicar?

    vlw

    1. Jonathas,
      Eu normalmente faço isso pelo Hibenrate no HQL e quando este conecta ao Ireport já faz o trabalho dele. Se seu HQL por exemplo, está certinho vai gerar o report.
      abraco,

  9. Boa noite Camilo, tudo bom?
    Seguindo seu tutorial ocorre o seguinte erro

    ar 21, 2013 10:28:19 PM org.apache.catalina.core.StandardWrapperValve invoke
    Grave: Servlet.service() for servlet [Faces Servlet] in context with path [/lojanet] threw exception [getOutputStream() has already been called for this response] with root cause
    java.lang.IllegalStateException: getOutputStream() has already been called for this response
    at org.apache.catalina.connector.Response.getWriter(Response.java:633)
    at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:214)
    at com.sun.faces.context.ExternalContextImpl.getResponseOutputWriter(ExternalContextImpl.java:723)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.createResponseWriter(FaceletViewHandlingStrategy.java:1009)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:382)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:124)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)

    Sabe me dizer o que pode ser?
    Obrigado.

    []s

    1. Denis,

      Nunca passei por esse erro, mas olhando ele está bem generico, talvez vc tenha feito algo diferente do post.

      abracos

  10. Olá camilo,

    digamos que tivéssemos duas tabelas Usuario e telefone.
    Como ficaria o data source e o relatorio?

    Obrigado e parabéns!

    1. Vinicius,
      O que muda é a pesquisa. O importante é a sua query. Pela mensagem de erro, nao tem o atribudo empresa_cnpj. Veja como declarou.

  11. @Vinicius

    Apenas complementando para você entender melhor…

    Na classe Usuario teríamos um objeto Telefone.

    Tentei fazer algo semelhante e obtive o seguinte erro (tabelas diferentes – Rpa e Empresa)

    Error retrieving field value from bean : empresa_cnpj

  12. @camilolopes
    Olá camilo, obrigado!

    Estava fazendo apenas um “From Rpa” que me trazia apenas o empresa_id.

    Mais tarde tento alterar a consulta e te aviso se consegui, uma outra duvida, como faço para dar apelido ao campo na minha consulta com inner join usando a JPQL.

    Minha query está atualmente assim SELECT e from Rpa e where e.id like :id”

  13. Bom dia, Camilo

    Gostaria de uma informação sou novo no ramo do Ireport, porém estou com um projeto onde preciso fazer um relatório que seja exportado no Excel, porém cada aba do Excell será um relatório diferente. Você sabe informar qual pacote e codigo do XML posso utilizar. Pois faço a procedure já esta feita e tentei fazer os relatórios todos com um nome e ajuntei todos em um só com o subreport, porém no momento de exportar no Excel ele não separa por abas.

    Ficarei grato se conseguir me ajudar

    1. olá Carlos,
      Nunca separei em abas usando o ireport.Teria que ver na documentação como funciona.
      flw.

Deixe um comentário

O seu endereço de e-mail não será publicado.