Relatório com Subrelatório iReport [RESOLVIDO]

9 respostas
M

Boa Tarde.
Estou terminando minha aplicação e estou montando os relatórios pelo iReport. fiz um relatório chamar "orcamento.jasper" e outro chamado "orcamentopacotes.jasper". Dentro do "orcamento.jasper", incluir o subrelatório.

Na parte de codificação em java, segue abaixo a minha classe completa.

try{
    		conexao.abrir();
    		
			BufferedImage slogan = ImageIO.read(new File("imagens/slogan.jpg"));
			
			URL url = getClass().getResource("orcamento.jasper"); 
			URL url1 = getClass().getResource("orcamento_subreport0.jasper");

    		if (url == null || url1 == null)
				JOptionPane.showMessageDialog(null,"Arquivo não encontrado");
               
    		InputStream is = url.openStream();
			
			JasperReport relatorioJasper = (JasperReport)JRLoader.loadObject(url);
			JasperReport subrelatorioJasper = (JasperReport)JRLoader.loadObject(url1);
			
			HashMap parameters = new HashMap();
			
			Statement stm = conexao.conexao.createStatement();
			String sql = "SELECT RTRIM(CNPJ) AS CNPJ, RTRIM(IE) AS IE, RTRIM(NOME) AS NOME,RTRIM(CIDADE) AS CIDADE,RTRIM(ENDERECO) AS ENDERECO,RTRIM(NUMERO) AS NUMERO,RTRIM(COMPLEMENTO) AS COMPLEMENTO,RTRIM(BAIRRO) AS BAIRRO,RTRIM(CEP) AS CEP,RTRIM(UF) AS UF,RTRIM(TEL) AS TEL,RTRIM(WEB_SITE) AS WEB_SITE,RTRIM(E_MAIL) AS E_MAIL FROM EMPRESA WHERE COD_EMPRESA='1'";
			ResultSet rs = stm.executeQuery(sql);
			while(rs.next()){
				parameters.put("cnpj", rs.getString("CNPJ"));
				parameters.put("ie", rs.getString("IE"));
				parameters.put("empresa", String.valueOf(rs.getString("NOME")));
				parameters.put("endereco", String.valueOf(rs.getString("ENDERECO")+", "+rs.getString("NUMERO")+" "+rs.getString("COMPLEMENTO")+" - "+rs.getString("BAIRRO")+" - "+rs.getString("CEP")+" - "+rs.getString("CIDADE")+" - "+rs.getString("UF")));
				parameters.put("telefone", String.valueOf(rs.getString("TEL")));
				parameters.put("website", String.valueOf(rs.getString("WEB_SITE")));
				parameters.put("email", String.valueOf(rs.getString("E_MAIL")));
				break;
			}
			parameters.put("slogan",slogan);
			parameters.put("vendedor", String.valueOf(sVendedor));
			parameters.put("total_mo", "R$ "+duasCasas.format(dValorMO));
			parameters.put("total_ac", "R$ "+duasCasas.format(dValorAC));
			parameters.put("total_pc","R$ "+duasCasas.format(dValorPC));
			parameters.put("total_geral", "R$ "+duasCasas.format(dValorTotal));
			parameters.put("total_geral","R$ "+duasCasas.format(dValorTotal));
			
			PreparedStatement pstmt = conexao.conexao.prepareStatement("SELECT CODIGO_AC,NOME_AC,VALOR_MO,DESCONTO_PC_MO,VALOR_AC,DESCONTO_PC_AC,TIPO FROM ORCAMENTO_ACESSORIO WHERE TIPO='A'");	
			ResultSet rs1 = pstmt.executeQuery();
			
			JRResultSetDataSource jrRS = new JRResultSetDataSource( rs1 );
			
			JasperPrint jp = JasperFillManager.fillReport(is, parameters,jrRS);
			JasperViewer.viewReport(jp, false);
			
			Statement stm1 = conexao.conexao.createStatement();
			String sql1 = "DELETE FROM ORCAMENTO_ACESSORIO";
			stm1.executeUpdate(sql1);
			
			Statement stm2 = conexao.conexao.createStatement();
			String sql2 = "DELETE FROM ORCAMENTO_PACOTE";
			stm2.executeUpdate(sql2);
			conexao.fechar();
		}
		catch(SQLException e){
			JOptionPane.showMessageDialog(null,e.getMessage());
		}
		catch(JRException e){
			JOptionPane.showMessageDialog(null,e.getMessage());
		}
		catch(Exception ex) {   
    		ex.printStackTrace();
		}

Quando eu rodo pelo java, ele imprime o relatório principal porém, o subrealtório não sai no relatório principal e dá o seguinte erro

23/03/2009 18:53:34 net.sf.jasperreports.engine.query.JRJdbcQueryExecuter
WARNING: The supplied java.sql.Connection object is null.

já pesquisei em vários lugares e não consigo identificar esse erro. Por favor, quem souber, posta aqui para eu poder encerrar a aplicação e entregar ao cliente.

Desde já, agradeço e conto com a ajuda de todos.

Daniel M. Vergani

9 Respostas

F

Como é um warning não sei se é isso que não mostraria o sub-relatorio.
Dá uma olha melhor se o subrelatório cabe dentro do relatório principal, tenta rodar o subrelatório separado para ver no que dá.

M

Como é um warning não sei se é isso que não mostraria o sub-relatorio.
Dá uma olha melhor se o subrelatório cabe dentro do relatório principal, tenta rodar o subrelatório separado para ver no que dá.

Como assim cabe dentro de outro relatório? Se eu rodo ele direto no iReport com o banco de dados preenchidos e as query do relatório e do subrelatório preenchida, ele funciona direitinho. Mostra o relatório principal e o subrelatório dentro do relatório principal.

Uma dúvida: como no código acima, eu passo a query para o relatório principal. Como q o subrelatório sabe a query que ele tem q executar para realizar a pesquisa?

Vou testar da forma q vc falou, rodar apenas esse relatório pra ver no q dá.

Mesmo assim, valeu pela força.

Daniel

J

Você pode passar a query pro subrelatorio como um parametro (do relatorio principal)…
No iReport na configuracao do subrelatorio você passa esse parametro como fonte de dados…

M

Você pode passar a query pro subrelatorio como um parametro (do relatorio principal)…
No iReport na configuracao do subrelatorio você passa esse parametro como fonte de dados…

tentei fazer da seguinte forma: cliquei duas vezes em cima do subrelatório incluido no relatório principal e fui na aba “Subrelatório”. NO quadro “Expressão de Conexão/Fonde de Dados”, ele já está com o valor “$P{REPORT_CONNECTION}”. Tentei colocar "$P{REPORT_CONNECTION} + “SELECT * FROM ORCAMENTO_PACOTE” mas não aceita. Criei um parametro do tipo String e coloquei “$P{REPORT_CONNECTION} + $P{QUERY_PACOTE}” mas fala q não aceita tmb. Como que eu deveria colocar erntão?

Acho que o problema está sendo esta conexção, conforme o erro q ele dá abaixo:

23/03/2009 18:53:34 net.sf.jasperreports.engine.query.JRJdbcQueryExecuter
WARNING: The supplied java.sql.Connection object is null.

Novamente, obrigado pelas respostas…estou no aguardo…

Daniel

M

Pessoasl...consegui..finalmente...

seguinte: quando inlcuir o subrelatório no relatório pricnipal, clica duas vezes no subrelatório e na guia "Sbrelatório" no quadro "Expressão de conexão/Fonte de Dados", deixa com a variável q ele cria automaticamente, a "$P{REPORT_CONNECTION}". Na aplicação, é feito da seguinte forma:

try{
    		conexao.abrir();
    		
			BufferedImage slogan = ImageIO.read(new File("imagens/slogan.jpg"));
			
			URL url = getClass().getResource("orcamento.jasper"); 
			URL url1 = getClass().getResource("orcamento_subreport0.jasper");

    		if (url == null || url1 == null)
				JOptionPane.showMessageDialog(null,"Arquivo não encontrado");
               
    		InputStream is = url.openStream();
			
			HashMap parameters = new HashMap();
			
			Statement stm = conexao.conexao.createStatement();
			String sql = "SELECT RTRIM(CNPJ) AS CNPJ, RTRIM(IE) AS IE, RTRIM(NOME) AS NOME,RTRIM(CIDADE) AS CIDADE,RTRIM(ENDERECO) AS ENDERECO,RTRIM(NUMERO) AS NUMERO,RTRIM(COMPLEMENTO) AS COMPLEMENTO,RTRIM(BAIRRO) AS BAIRRO,RTRIM(CEP) AS CEP,RTRIM(UF) AS UF,RTRIM(TEL) AS TEL,RTRIM(WEB_SITE) AS WEB_SITE,RTRIM(E_MAIL) AS E_MAIL FROM EMPRESA WHERE COD_EMPRESA='1'";
			ResultSet rs = stm.executeQuery(sql);
			while(rs.next()){
				parameters.put("cnpj", rs.getString("CNPJ"));
				parameters.put("ie", rs.getString("IE"));
				parameters.put("empresa", String.valueOf(rs.getString("NOME")));
				parameters.put("endereco", String.valueOf(rs.getString("ENDERECO")+", "+rs.getString("NUMERO")+" "+rs.getString("COMPLEMENTO")+" - "+rs.getString("BAIRRO")+" - "+rs.getString("CEP")+" - "+rs.getString("CIDADE")+" - "+rs.getString("UF")));
				parameters.put("telefone", String.valueOf(rs.getString("TEL")));
				parameters.put("website", String.valueOf(rs.getString("WEB_SITE")));
				parameters.put("email", String.valueOf(rs.getString("E_MAIL")));
				break;
			}
			parameters.put("slogan",slogan);
			parameters.put("vendedor", String.valueOf(sVendedor));
			parameters.put("total_mo", "R$ "+duasCasas.format(dValorMO));
			parameters.put("total_ac", "R$ "+duasCasas.format(dValorAC));
			parameters.put("total_pc","R$ "+duasCasas.format(dValorPC));
			parameters.put("total_geral", "R$ "+duasCasas.format(dValorTotal));
			parameters.put("total_geral","R$ "+duasCasas.format(dValorTotal));
			parameters.put("REPORT_CONNECTION",conexao.conexao);
			
			PreparedStatement pstmt = conexao.conexao.prepareStatement("SELECT CODIGO_AC,NOME_AC,VALOR_MO,DESCONTO_PC_MO,VALOR_AC,DESCONTO_PC_AC,TIPO FROM ORCAMENTO_ACESSORIO WHERE TIPO='A'");	
			ResultSet rs1 = pstmt.executeQuery();
			
			JRResultSetDataSource jrRS = new JRResultSetDataSource( rs1 );
			
			JasperPrint jp = JasperFillManager.fillReport(is, parameters,jrRS);
			JasperViewer.viewReport(jp, false);
			
			Statement stm1 = conexao.conexao.createStatement();
			String sql1 = "DELETE FROM ORCAMENTO_ACESSORIO";
			stm1.executeUpdate(sql1);
			
			Statement stm2 = conexao.conexao.createStatement();
			String sql2 = "DELETE FROM ORCAMENTO_PACOTE";
			stm2.executeUpdate(sql2);
			conexao.fechar();
		}
		catch(SQLException e){
			JOptionPane.showMessageDialog(null,e.getMessage());
		}
		catch(JRException e){
			JOptionPane.showMessageDialog(null,e.getMessage());
		}
		catch(Exception ex) {   
    		ex.printStackTrace();
		}

Observe que na linha 36, eu passo a variável "conexao" do tipo "Connection" que está na minha classe "conexão".
A query do Subrelatório eu já defini ela pelo iReport. Mas, se quiser realizar a query na aplicação, cria uma variável do tipo String e no quadro de query, coloca o parametro lá.

É isso ai..quem tiver dúvidas ainda, escreve q eu explico.

Obrigado pela ajuda de todos.!

Daniel

Agora ele carrega certinho o relatório e o subrelatório

G

Oi mvergani

como que manda a query para o subrelatorio executala criei a criei um parametro,
mas so consigo manda para o relatorio o sub relatorio nao pega o valor que mando e com isso nao consigo
selecionar o que quero, e sim ele pega todos os dados do meu banco…

fico no aguardo por qualquer ajuda…
desde ja obrigado

M

opa…desculpe a demora pra responder…

para vc passar uma query para o subrelatório, vc cria no relatório principal uma variável do tipo String (não estou com o programa abrto agora e esqueci o tipo de variáveis que ele tem…) e cria uma outra variável no subrelatório também como do tipo String…tem uma configuração de variável que vc “agrega” valores do subrelatório aos do relatório principal…o que vc passar na variável no relatório principal, ele joga pra variável do subrelatório…

espero ter ajudado…se não conseguir, me avisa q eu tento explicar melhor…

falow

G

o que fis foi criar parametros onde faço os filtros dai mando para o relatorio principal

e o subrelatorio recebe esses parametros e fas a sql com os filtros corretos funcionou…

obrigado de qualquer forma

outra duvida que tenho…

ha algma maneira de unir relatorios…

vou tentar explicar tenho duas tabelas principais os e eventos da os que sao a chave do relatorio a os mostro os dados no page header em cima na folha
e os eventos que sao varios relativos a uma os criei esse subrelatorio e mostro ele o problema eh que consigo faser funcionar para uma os se coloco mais de uma acontece as veses de mostrar eventos que nao sao relativo akela os por isso uma maneira que pensei em faser isso eh faser um
while(rs.next())
e mandar os result set mandando os dados da os e dentro desse while criar chamar o relatorio criando para cada um um relatorio e apos unir todos eles…

nao sei se ja consegui resolver um problema desse tipo dessa forma ou alguma outra se tiver alguma ideia pra me passar ou exemplo agradeceria

desde ja obrigado

abrass

L

Olá pessoal!
Eu sou iniciante na utilização do ireport eu queria passar 3 variaveis de um sub relatorio para meu relatorio principal .
Ja tentei de diversas maneiras, ainda não consegui ele da esse tipo de erro.

Erros de compilação .\relatorio.jasper.

net.sf.jasperreports.engine.JRException: Errors were encountered when compiling report expressions class file: 1. Syntax error on token(s), misplaced construct(s)                 value = (java.lang.String)(C:\Documents and Settings\Leonardo\Desktop\Relatórios\Jasper\subrelatorio.jrxml);//$JR_EXPR_ID=0$                 <-------------------------> 2. Syntax error on token Invalid Character, { expected                 value = (java.lang.String)(C:\Documents and Settings\Leonardo\Desktop\Relatórios\Jasper\subrelatorio.jrxml);//$JR_EXPR_ID=0$                                              ^ 3. Syntax error on token(s), misplaced construct(s)                 value = (java.lang.String)(C:\Documents and Settings\Leonardo\Desktop\Relatórios\Jasper\subrelatorio.jrxml);//$JR_EXPR_ID=0$                                              <----------------------------------------------------------------------------> 4. Syntax error on token(s), misplaced construct(s)                 value = (java.lang.String)(C:\Documents and Settings\Leonardo\Desktop\Relatórios\Jasper\subrelatorio.jrxml);//$JR_EXPR_ID=0$                                               <-------> 5. Syntax error on tokens, ( expected instead                 value = (java.lang.String)(C:\Documents and Settings\Leonardo\Desktop\Relatórios\Jasper\subrelatorio.jrxml);//$JR_EXPR_ID=0$                                                         <----------------------------------------------> 6. Syntax error on token(s), misplaced construct(s)                 value = (java.lang.String)(C:\Documents and Settings\Leonardo\Desktop\Relatórios\Jasper\subrelatorio.jrxml);//$JR_EXPR_ID=0$                 <-------------------------> 7. Syntax error on token Invalid Character, { expected                 value = (java.lang.String)(C:\Documents and Settings\Leonardo\Desktop\Relatórios\Jasper\subrelatorio.jrxml);//$JR_EXPR_ID=0$                                              ^ 8. Syntax error on token(s), misplaced construct(s)                 value = (java.lang.String)(C:\Documents and Settings\Leonardo\Desktop\Relatórios\Jasper\subrelatorio.jrxml);//$JR_EXPR_ID=0$                                              <----------------------------------------------------------------------------> 9. Syntax error on token(s), misplaced construct(s)                 value = (java.lang.String)(C:\Documents and Settings\Leonardo\Desktop\Relatórios\Jasper\subrelatorio.jrxml);//$JR_EXPR_ID=0$                                               <-------> 10. Syntax error on tokens, ( expected instead                 value = (java.lang.String)(C:\Documents and Settings\Leonardo\Desktop\Relatórios\Jasper\subrelatorio.jrxml);//$JR_EXPR_ID=0$                                                         <----------------------------------------------> 11. Syntax error on token(s), misplaced construct(s)                 value = (java.lang.String)(C:\Documents and Settings\Leonardo\Desktop\Relatórios\Jasper\subrelatorio.jrxml);//$JR_EXPR_ID=0$                 <-------------------------> 12. Syntax error on token Invalid Character, { expected                 value = (java.lang.String)(C:\Documents and Settings\Leonardo\Desktop\Relatórios\Jasper\subrelatorio.jrxml);//$JR_EXPR_ID=0$                                              ^ 13. Syntax error on token(s), misplaced construct(s)                 value = (java.lang.String)(C:\Documents and Settings\Leonardo\Desktop\Relatórios\Jasper\subrelatorio.jrxml);//$JR_EXPR_ID=0$                                              <----------------------------------------------------------------------------> 14. Syntax error on token(s), misplaced construct(s)                 value = (java.lang.String)(C:\Documents and Settings\Leonardo\Desktop\Relatórios\Jasper\subrelatorio.jrxml);//$JR_EXPR_ID=0$                                               <-------> 15. Syntax error on tokens, ( expected instead                 value = (java.lang.String)(C:\Documents and Settings\Leonardo\Desktop\Relatórios\Jasper\subrelatorio.jrxml);//$JR_EXPR_ID=0$                                                         <----------------------------------------------> 15 errors      at net.sf.jasperreports.engine.design.JRAbstractCompiler.compileReport(JRAbstractCompiler.java:193)     at it.businesslogic.ireport.IReportCompiler.run(IReportCompiler.java:591)     at java.lang.Thread.run(Unknown Source)

Tempo de execução de compilação: 203;

Eu queria saber também se alguem tem um material sobre esse tipo de execução em relatorio.
Desde ja muito obrigado a todos.

Criado 23 de março de 2009
Ultima resposta 17 de nov. de 2009
Respostas 9
Participantes 5