Sub-relatórios no iReports

Olá pessoal estou começando a desenvolver relatórios no iReports e encontrei um problema não sei, creio q é meio babaca,…
Seguinte possuo um relatório q dentro dele tem outros dois sub-relatórios, qdo eu peço pra rodar o relatorio ele me cria a relação de dados no primeiro sub-relatório dinamicamente com n quantidade de linhas e qdo chama o segundo ele carrega por cima do primeiro, será q tenho q inserir alguma quebra pra informar o final do primeiro sub-relatório, se sim como faço isso, pois o tamanho do primeiro é dinamico

Ola,

como você dispôs os subrelatórios no relatório principal ? Um sobre o outro ?

Vc precisa colocar eles um debaixo do outro, e neste caso, eles não se sobrepõe.

Mas se você quiser usar como se fossem quebras (por exemplo Tipo X, e ai abaixo lisar subTipos), vc tem que criar um Group (agrupador, nova banda) no seu subrelatório.

BLza cara funcionou, agora o seguinte para o Relatório principal funcionar preciso passar dois parametros por exemplo um Nome(String) e uma idade(inteiro) vou chama-lo de uma servlet como monto a servlet passando os parametros, tem algum exemplo, e cara mto obrigado pela ajuda valeuzão

Helooo !

RagGirl

Mas vamos lá ! :wink:

Primeiro, crie uma classe, tipo Util para localizar o relatório:

package br.com.teste.util;

import java.io.InputStream;
import java.net.URL;

import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;

public class ReportUtils {
    
    private static String imageBasePath; 

    public static JasperReport getReport(String reportName) throws Exception {
		String reportPath = "/br/com/test/reports/"+reportName+".jasper";
	    InputStream stream = ReportUtils.class.getResourceAsStream(reportPath);
	    if(stream==null){
	    	throw new Exception("Relatório não encontrado:"+reportPath);
	    }
	    JasperReport report = (JasperReport) JRLoader.loadObject(stream);
	    return report;
    }
        
}

Depois, o Servlet:

package br.com.teste.servlet.report;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import br.com.teste.sql.PoolConnection;


public class ReportServlet extends HttpServlet {

	
	/* (non-Javadoc)
	 * @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
	 *
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Connection conn = null;
		
	    try {
			// nome do relatorio
			String reportName = request.getParameter("reportName");		
			   
			if (reportName == null || reportName.equals("")) {
				throw new Exception("Nome do relatório deve ser informado.");
			}
			
			// copia parametros da requisição
	        Enumeration en = request.getParameterNames();
		    Map parameters = new HashMap();
		    while(en.hasMoreElements()){
		       String key = (String) en.nextElement();
		       parameters.put(key, request.getParameter(key)); 
		    }
		    parameters.put("REPORT_LOCALE", new Locale("pt", "br")); 		    	    
		    		
		    // conexão do datasource
		    PoolConnection pool = new PoolConnection();
		    conn = pool.getJdbcURL().getConnection();    	

		    // carrega relatório
		    JasperReport relatorio = ReportUtils.getReport(reportName);		    
		    JasperPrint jasperPrint = JasperFillManager.fillReport(relatorio, parameters, conn);
		    ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();

		    // exporta para pdf
            JasperExportManager.exportReportToPdfStream(jasperPrint, arrayOutputStream);            
		    
            // define os cabecalhos do header            
            response.setHeader("Pragma","");
            response.setHeader("Cache-Control","");
            response.setHeader("Expires","");
            
            response.setContentType("application/pdf");
            // problemas com o IE
            //response.setContentType("application/octect-stream");            
            //response.setHeader( "Content-Disposition", " attachment; filename=" + reportName.toUpperCase() + ".pdf");   			                 
            //response.setHeader("Content-Disposition", "inline; filename=" + reportName.toUpperCase() + ".pdf");
            
            response.setContentLength(arrayOutputStream.size());
		    
		    // escreve o relatorio no response
		    OutputStream out = response.getOutputStream();		    
		    arrayOutputStream.writeTo(out);
		    out.flush();	
		    out.close();
	    } catch (Exception e) {
	    	e.printStackTrace();	
	    	request.setAttribute("ERRO_REPORT", e.getMessage());
		    this.getServletContext().getRequestDispatcher("/visualizacaoRelatorio.jsp").forward(request, response);		    	    	
	    } finally {    	        
	    	if (conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
				}
			}
	    }
	}
}

E os parametros passa na tela:

<form method="post" name="relatorio" target="visualizacaoRelatorio" action="<%= request.getContextPath()%>/reportService">
	<input type="hidden" name="reportName" value="">
	<input type="hidden" name="NOME" value="">
	<input type="hidden" name="IDADE" value="">
</form>	

Blz !

Perdoe-me RagGirl…

Seguinte sou iniciante, estou com um pouco de duvidas, ou melhor cheio de duvidas…hehe
onde encontro PoolConnection pois nao tenho o pacote br… de onde importo ela… obrigado

Oi,

ok, sem problemas :wink:

Ops, mandei um exemplo e acabei não vendo, mas essa é uma classe que usei aqui para fazer a conexão.

Mas crie esse método:

protected Connection getConnection()
    throws Exception {
        
        // Buscar contexto JNDI
        Context ic = new InitialContext();
        // Solicitar o objeto Data Source
        DataSource ds = (DataSource)ic.lookup("jdbc/[b]aquiseuDS[/b]");
        // Obter uma conexao     
        Connection conn = ds.getConnection();
        
        return conn;        
    }

e la no Pool, substitua essa linha:

// conexão do datasource
PoolConnection pool = new PoolConnection();
conn = pool.getJdbcURL().getConnection();    

por essa:

conn = this.getConnection();    

Agora deve funcionar, qlq problema entre em contato.

RagGirl consegui resolver mas ta me dando um erro ao gerar o Relatório

[code]exception

javax.servlet.ServletException: Invoker service() exception
org.apache.catalina.servlets.InvokerServlet.serveRequest(InvokerServlet.java:477)
org.apache.catalina.servlets.InvokerServlet.doPost(InvokerServlet.java:169)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

root cause

java.lang.NoClassDefFoundError: org/apache/commons/javaflow/bytecode/Continuable
java.lang.ClassLoader.defineClass0(Native Method)
java.lang.ClassLoader.defineClass(ClassLoader.java:539)
java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1634)
org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:860)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1307)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1189)
java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
java.lang.ClassLoader.defineClass0(Native Method)
java.lang.ClassLoader.defineClass(ClassLoader.java:539)
java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1634)
org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:860)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1307)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1189)
java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:402)
net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:234)
SisEst.controle.RelatorioColetaDados.doPost(RelatorioColetaDados.java:67)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.catalina.servlets.InvokerServlet.serveRequest(InvokerServlet.java:419)
org.apache.catalina.servlets.InvokerServlet.doPost(InvokerServlet.java:169)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)[/code]

não sei mais o q fzr, pois estou a uma semana com esse problema e o pior de tudo, é que meu chefe quer que eu mostre tudo até no sabado (4 relatórios) pra ele e não consegui sair do lugar, será q vc pode me dar mais essa ajuda, se puder me add no msn: wsinfo@msn.com, juro q so vou encomodar qdo realmente necessário…rs, obrigado pela atenção heim

bom vou tentar ser um pouco mais claro, acho q vai facilitar para me ajudar, construi um relatorio no iReports no qual preciso de 2 parametros um inteiro e outro string, os dois são usados lógicamente no SQL dentro do relatório, compilei e gerei o meu Relatorio.jasper, pois bem agora como faço para exibir esse relatório atraves de uma servlet ou jsp mesmo, so passando o parametro Nome=“wagner” e idade=20, gostaria de saber como posso visualizalo, obrigado

Oi,

não temos acesso ao msn… :shock:

Vou tentar montar um exemplo mais simples e te enviar.

Oi Wagner,

achei por aqui ainda mais alguns .pdf que eu tinha da época que comecei a ver e estudar iReport.

E também esses links:

Jasper num servlet:
http://www.guj.com.br/forum/viewtopic.php?t=1664

Subrelatório no Jasper:
http://www.guj.com.br/forum/viewtopic.php?t=2254

Query no Jasper:
http://www.guj.com.br/forum/viewtopic.php?t=3037

Jasper/Ireport parametros para gerar Relatorio
http://www.guj.com.br/forum/viewtopic.php?t=12041

Mais um sobre parâmetros
http://www.guj.com.br/forum/viewtopic.php?t=10426

SQL dinamico no Ireport
http://www.guj.com.br/forum/viewtopic.php?t=9513

JFreeReport Algumas dicas para iniciantes
http://www.guj.com.br/forum/viewtopic.php?t=8584

Problema com query SQL
http://www.guj.com.br/forum/viewtopic.php?t=12012&highlight=jasper+ireport

IReport pegando dados de Array
http://www.guj.com.br/forum/viewtopic.php?t=11416&highlight=jasper+ireport

Exemplos
http://www.guj.com.br/forum/viewtopic.php?p=46586#46586

Jasper + Ireport - Consultas SQL
http://www.guj.com.br/forum/viewtopic.php?t=12012

Como chamar um relatorio do Ireport
http://www.guj.com.br/forum/viewtopic.php?t=3857

Parametros no IReport
http://www.guj.com.br/forum/viewtopic.php?t=10426

Como uso JRBeanDataSource?
http://www.guj.com.br/forum/viewtopic.php?t=11655

Compilar arquivo xml do iReport em um Servlet
http://www.guj.com.br/forum/viewtopic.php?t=9769

Oq preciso para usar o Jasper-Report
http://www.guj.com.br/forum/viewtopic.php?t=3927

exemplo basicão pra gerar relatórios usando o jasperreports
http://www.guj.com.br/forum/viewtopic.php?t=3657

Como crio relatório??
http://www.guj.com.br/forum/viewtopic.php?t=3168

Valeu.