Subrelatorios criados no Ireport

10 respostas
alexwebsp

Criei um relatório com sub-relatorio no IReport, no ireport funciona normalmente mas pelo Java não aparece o sub-relatório, só que é o seguinte: o usuário vai escolher o código do pedido selecionado numa tabela, isso eu fiz, ele seleciona numa tabela de pesquisa e os dados são exibidos no TextFields e outra tabela, onde é exibido os produtos, então quero fazer um relatório principal"Pedido de Compras" com os produtos selecionados, então meu relatório haverá a parte mestre que é o pedido de compras junto com o subrelatório que são os produtos, mas não pode esquecer que tem que o relatório está amarrado pelo número do pedido que é o: getPedComCodigo(), tanto o relatório mestre como o subrelatório, não estou conseguindo fazer isso, preciso de ajuda, abaixo está o código que tentei fazer, mas não deu certo.

public void relatorioPedidoCompras(PedidoCompraVO q) throws ClassNotFoundException, SQLException, JRException
            {
            String pdf = "c:\geff\relatorios\compras.pdf";
            String relat = "c:\geff\relatorios\compras.jasper";
            String relatsub = "c:\geff\relatorios\comprassubrelatorio.jasper";
            
            String driver = "org.postgresql.Driver";
            String url = "jdbc:postgresql://"+endereco+":5432/geff";
            String login = "Alex";
            String senha = "mattos";
            Class.forName(driver);
            Connection conn = DriverManager.getConnection(url,login,senha);
            conn.setAutoCommit(false);
            
            PreparedStatement consulta = conn.prepareStatement( "SELECT p.pedcomcodigo, p.pedcomdata, c.clinome,    
            p.pedcomvaltotal, p.pedcomcondpagamento, p.pedcompraentrega, p.pedcomfrete, p.pedcomimpostos, 
            p.pedcomobservacoes, p.pedresponsavel FROM pedidocompra p,clientes c WHERE p.clicodigo=c.clicodigo and 
            p.pedcomcodigo='"+q.getPedComCodigo()+"';");
            
            ResultSet rs = consulta.executeQuery();
            
            JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);
            HashMap parameters = new HashMap();
            
            parameters.put("SUBREPORT_DIR", relatsub);
            
            String impressao = JasperFillManager.fillReportToFile(relat, parameters, jrRS);
            JasperViewer.viewReport("c:\geff\relatorios\compras.jrprint",false,false);
            JasperExportManager.exportReportToPdfFile(impressao, pdf);
            conn.rollback();
            consulta.close();
        }

10 Respostas

M

Qual foi o erro apresentado?

alexwebsp

erro:

30/05/2009 12:09:06 net.sf.jasperreports.engine.query.JRJdbcQueryExecuter <init>
WARNING: The supplied java.sql.Connection object is null.
Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethodError: com.lowagie.text.Image.getPlainWidth()F
        at net.sf.jasperreports.engine.export.JRPdfExporter.exportImage(JRPdfExporter.java:1219)
        at net.sf.jasperreports.engine.export.JRPdfExporter.exportElements(JRPdfExporter.java:675)
        at net.sf.jasperreports.engine.export.JRPdfExporter.exportPage(JRPdfExporter.java:641)
        at net.sf.jasperreports.engine.export.JRPdfExporter.exportReportToStream(JRPdfExporter.java:536)
        at net.sf.jasperreports.engine.export.JRPdfExporter.exportReport(JRPdfExporter.java:344)
        at net.sf.jasperreports.engine.JasperExportManager.exportReportToPdfFile(JasperExportManager.java:126)
        at net.sf.jasperreports.engine.JasperExportManager.exportReportToPdfFile(JasperExportManager.java:103)
M

o problema ta na conexão com o banco de dados. Agora basta saber o que tá causando isso, pode ser que seja o Objeto de conexão da classe ta com problema.

Como você fez esses subrelatórios? Você usou JRBeanCollectionDataSource para o subrelatório ou configuração uma conexão e string SQL dentro do iReport para o subrelatório?

alexwebsp

No IReport eu consigo exibir o relatório principal com o subrelatório

Conexão do relatório

$P{REPORT_CONNECTION}

parametro: $P{SUBREPORT_DIR}+"c:\geff\relatorios\comprassubrelatorio.jasper"

Query do Subrelatório:

SELECT DISTINCT i.pedcomcodigo, i.procodigo, i.itepedcomdescricao, i.itepedcomquantidade, i.itepedcomunidade, i.itepedcomvlrunitario, i.itepedcomvlrtotal 
FROM itenspedcompra i, pedidocompra p


Query do relatório Principal "Compras":

SELECT DISTINCT p.pedcomcodigo, p.pedcomdata, c.clinome, p.pedcomvaltotal, 
       p.pedcomcondpagamento, p.pedcompraentrega, p.pedcomfrete, 
       p.pedcomimpostos, p.pedcomobservacoes, p.pedresponsavel 
FROM pedidocompra p,clientes c 
WHERE p.clicodigo=c.clicodigo;
M

Ai que tá o problema o ideal é criar o relatório e sub relatório com uma conexão vazia apenas passando parâmetros no relatório, e o sub relatório usar um JRBeanColllectionDataSource como base de dados.

vê se isso te ajuda: http://www.furutani.com.br/2009/02/usando-o-jrbeancollectiondatasource/

Qualquer dúvida pode postar, recentemente fiz uma aplicação que precisava de relatórios e subrel e esse artigo do furutani me ajudou muito :slight_smile:

alexwebsp

tentei fazer assim, mas ainda não está dando certo

public void relatorioPedidoCompras(PedidoCompraVO q) throws ClassNotFoundException, SQLException, JRException     
            {     
            String pdf = "c:\geff\relatorios\compras.pdf";     
            String relat = "c:\geff\relatorios\compras.jasper";     
            String relatsub = "c:\geff\relatorios\comprassubrelatorio.jasper";     
                 
     
            String driver = "org.postgresql.Driver";     
            String url = "jdbc:postgresql://"localhost":5432/geff";     
            String login = "Alex";     
            String senha = "mattos";     
            Class.forName(driver);     
            Connection conn = DriverManager.getConnection(url,login,senha);     
            conn.setAutoCommit(false);     
            PreparedStatement consulta = conn.prepareStatement( "SELECT p.pedcomcodigo, p.pedcomdata, c.clinome, p.pedcomvaltotal, p.pedcomcondpagamento, p.pedcompraentrega, p.pedcomfrete, p.pedcomimpostos, p.pedcomobservacoes, p.pedresponsavel FROM pedidocompra p,clientes c WHERE p.clicodigo=c.clicodigo and p.pedcomcodigo='"+q.getPedComCodigo()+"';");     
            ResultSet rs = consulta.executeQuery();     
     
            JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);     
     
            PreparedStatement consulta2 = conn.prepareStatement( "SELECT DISTINCT i.procodigo, i.itepedcomdescricao, i.itepedcomquantidade, i.itepedcomunidade, i.itepedcomvlrunitario, i.itepedcomvlrtotal  FROM itenspedcompra i, pedidocompra p WHERE i.pedcomcodigo='"+q.getPedComCodigo()+"';");     
            ResultSet rs2 = consulta2.executeQuery();     
     
            JRResultSetDataSource jrRSS = new JRResultSetDataSource(rs2);     
            HashMap parameters = new HashMap();     
     
            parameters.put("SUBREPORT_DIR", relatsub);     
            parameters.put("REPORT_CONNECTION",jrRSS);     
     
            String impressao = JasperFillManager.fillReportToFile(relat, parameters, jrRS );     
            JasperViewer.viewReport("c:\geff\relatorios\compras.jrprint",false,false);     
            JasperExportManager.exportReportToPdfFile(impressao, pdf);     
            conn.rollback();     
            consulta.close();     
        }
erro:   
  
Erro  Incompatible net.sf.jasperreports.engine.JRResultSetDataSource value assigned to parameter REPORT_CONNECTION in the compras dataset.
M

o que é esse parâmetro REPORT_CONNECTION?

alexwebsp

REPORT_CONNECTION

Conexão do subrelatório

M

Você nao precisa ter uma conexão configurada no relatório ou sub relatório pode ser vazio

alexwebsp

Consegui faer o relatório funcionar, mas estou com outro problema, não estou conseguindo exportar para o pdf

public void relatorioPedidoCompras(PedidoCompraVO q) throws ClassNotFoundException, SQLException, JRException
            {

            String pdf = "c:\geff\relatorios\compras.pdf";
            String relat = "c:\geff\relatorios\compras.jasper";
            String relatsub = "c:\geff\relatorios\comprassubrelatorio.jasper";
           

            String driver = "org.postgresql.Driver";
            String url = "jdbc:postgresql://"+endereco+":5432/geff";
            String login = "Alex";
            String senha = "mattos";
            Class.forName(driver);
            Connection conn = DriverManager.getConnection(url,login,senha);
            conn.setAutoCommit(false);
            PreparedStatement consulta = conn.prepareStatement( "SELECT p.pedcomcodigo, p.pedcomdata, c.clinome, p.pedcomvaltotal, p.pedcomcondpagamento, p.pedcompraentrega, p.pedcomfrete, p.pedcomimpostos, p.pedcomobservacoes, p.pedresponsavel FROM pedidocompra p,clientes c WHERE p.clicodigo=c.clicodigo and p.pedcomcodigo='"+q.getPedComCodigo()+"';");
            ResultSet rs = consulta.executeQuery();

            JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);

            HashMap parameters = new HashMap();

            parameters.put("SUBREPORT_DIR",relatsub);
            parameters.put("REPORT_CONNECTION",conn);


            String impressao = JasperFillManager.fillReportToFile(relat, parameters, jrRS );
            
            JasperViewer.viewReport("c:\geff\relatorios\compras.jrprint",false,false);
            JasperExportManager.exportReportToPdfFile(impressao, pdf);
            conn.rollback();
            consulta.close();
        }
erro:


Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethodError: com.lowagie.text.Image.getPlainWidth()F
        at net.sf.jasperreports.engine.export.JRPdfExporter.exportImage(JRPdfExporter.java:1219)
        at net.sf.jasperreports.engine.export.JRPdfExporter.exportElements(JRPdfExporter.java:675)
        at net.sf.jasperreports.engine.export.JRPdfExporter.exportPage(JRPdfExporter.java:641)
        at net.sf.jasperreports.engine.export.JRPdfExporter.exportReportToStream(JRPdfExporter.java:536)
        at net.sf.jasperreports.engine.export.JRPdfExporter.exportReport(JRPdfExporter.java:344)
        at net.sf.jasperreports.engine.JasperExportManager.exportReportToPdfFile(JasperExportManager.java:126)
        at net.sf.jasperreports.engine.JasperExportManager.exportReportToPdfFile(JasperExportManager.java:103)
        at net.sf.jasperreports.engine.JasperManager.printReportToPdfFile(JasperManager.java:291)
Criado 30 de maio de 2009
Ultima resposta 1 de jun. de 2009
Respostas 10
Participantes 2