Servlet rodando jasper reports, porem nao funciona subreport

4 respostas
D

Bom dia pessoal.

Seguinte, tenho um codigo servlet que gera o relatorio jasper em pdf, ate ae tudo ok, porem o subrelatorio abre em branco.
Quando vejo no ireport ele roda ok, porem quando rodo pelo java, servlet nao abre o subreport, apenas o report principal.

Segue o codigo

o nome do jasper principal e o Recibovd.jasper, e o subreport Recibovd2.jasper

preciso declara esse subreport no meu codigo tb?

import java.io.IOException;  
import java.sql.Connection;  
import java.sql.DriverManager;  
import java.util.HashMap;  
import java.util.Map;  
  
import javax.servlet.ServletContext;  
import javax.servlet.ServletException;  
import javax.servlet.ServletInputStream;  
import javax.servlet.ServletOutputStream;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
  
import net.sf.jasperreports.engine.JRException;  
import net.sf.jasperreports.engine.JasperReport;  
import net.sf.jasperreports.engine.JasperRunManager;  
import net.sf.jasperreports.engine.util.JRLoader;  
//import org.jfree.chart.servlet.ServletUtilities;  
  
public class Recibo2 extends HttpServlet {  
      
      
    public void doGet(HttpServletRequest request, HttpServletResponse response)  
    throws IOException, ServletException  {  
          
        //String[] vlParametro = request.getParameterValues("nome");  
    	String nomeS = request.getParameter("codig");  
        // obtém a conexão com o banco de dados  
        Connection conn = null;  
        try {  
            Class.forName("org.firebirdsql.jdbc.FBDriver");  
            conn = DriverManager.getConnection(  
                    "jdbc:firebirdsql:localhost/3050:C://banco//BD.FDB?defaultResultSetHoldable=True", // coloque o IP se não for usado localhost  
                    "sysdba",        // mude para o nome do usuário do seu bd  
                    "masterkey");   // mude para a senha deste usuário  
        } catch (Exception e) {  
            System.out.println("Erro ao obter conexao via DriverManager: "                      
                    + e.getMessage());  
        }  
          
        // gera o relatório  
        ServletContext context = getServletContext();  
        byte[] bytes = null;  
        try {  
              
              
            // carrega os arquivos jasper  
            JasperReport relatorioJasper = (JasperReport)JRLoader.loadObject(  
                    context.getRealPath("/WEB-INF/Recibovd.jasper"));  
              
            // parâmetros, se houverem  
            Map parametros = new HashMap();  
            parametros.put("Codig", nomeS);  
              
            // direciona a saída do relatório para um stream  
            bytes = JasperRunManager.runReportToPdf(relatorioJasper,parametros,conn);  
        } catch (JRException e) {  
            e.printStackTrace();  
        }  
        if (bytes != null && bytes.length > 0) {  
            // envia o relatório em formato PDF para o browser  
            response.setContentType("application/pdf");  
              
            response.setContentLength(bytes.length);  
            ServletOutputStream ouputStream = response.getOutputStream();  
            ouputStream.write(bytes, 0, bytes.length);  
            ouputStream.flush();  
            ouputStream.close();  
        }  
          
    }  
  
    
}

4 Respostas

rogerio.oliveira

Oi, é o seguinte verifique se você está passando o caminho da pasta onde está o sub-relatório para o parâmetro ?SUBREPORT_DIR". Esse parâmetro e criado automáticamente no relatório principal que chama o sub-relatório. Exemplo: parametros.put(“SUBREPORT_DIR”, pathJava+"/");
No seu caso no trecho do código ficaria assim:

// parâmetros, se houverem    
          Map parametros = new HashMap();    
          parametros.put("Codig", nomeS); 
         parametros.put("SUBREPORT_DIR", pathJava+"/");

Sendo que na variável pathJava você deve passar o caminho onde está o relatório, exemplo : this.javaPath = this.getServletContext().getRealPath(“WEB-INF/classes/br/com/rel/”);

D

Nusssa, desculpa nao entendi.

isso e no meu relatorio jasper,ou no meu servlet

rogerio.oliveira

No sua servilet no trecho te código de sua servilet.

// parâmetros, se houverem

Map parametros = new HashMap();

parametros.put(Codig, nomeS);

Acrescente a passagem do paramentro:

parametros.put(“SUBREPORT_DIR”, pathJava+"/");

rogerio.oliveira

Olha, acho que não estou conseguindo fazer você enteder. Coloquei uma linha de no seu código com um comentário explicativo, linha 55. Ver ai se você entende e se dar certo,
caso não de me avise.

  1. import java.io.IOException;

  2. import java.sql.Connection;

  3. import java.sql.DriverManager;

  4. import java.util.HashMap;

  5. import java.util.Map;

  6. import javax.servlet.ServletContext;

  7. import javax.servlet.ServletException;

  8. import javax.servlet.ServletInputStream;

  9. import javax.servlet.ServletOutputStream;

  10. import javax.servlet.http.HttpServlet;

  11. import javax.servlet.http.HttpServletRequest;

  12. import javax.servlet.http.HttpServletResponse;

  13. import net.sf.jasperreports.engine.JRException;

  14. import net.sf.jasperreports.engine.JasperReport;

  15. import net.sf.jasperreports.engine.JasperRunManager;

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

  17. //import org.jfree.chart.servlet.ServletUtilities;

  18. public class Recibo2 extends HttpServlet {

  19. public void doGet(HttpServletRequest request, HttpServletResponse response)
    
  20. throws IOException, ServletException  {
    
  21. //String[] vlParametro = request.getParameterValues("nome");
    
  22. String nomeS = request.getParameter("codig");
    
  23. // obtém a conexão com o banco de dados
    
  24. Connection conn = null;
    
  25. try {
    
  26. Class.forName("org.firebirdsql.jdbc.FBDriver");
    
  27. conn = DriverManager.getConnection(
    
  28. "jdbc:firebirdsql:localhost/3050:C://banco//BD.FDB?defaultResultSetHoldable=True", // coloque o IP se não for usado localhost
    
  29. "sysdba",        // mude para o nome do usuário do seu bd
    
  30. "masterkey");   // mude para a senha deste usuário
    
  31. } catch (Exception e) {
    
  32. System.out.println("Erro ao obter conexao via DriverManager: "
    
  33. + e.getMessage());
    
  34. }
    
  35. // gera o relatório
    
  36. ServletContext context = getServletContext();
    
  37. byte[] bytes = null;
    
  38. try {
    
  39. // carrega os arquivos jasper
    
  40. JasperReport relatorioJasper = (JasperReport)JRLoader.loadObject(
    
  41. context.getRealPath("/WEB-INF/Recibovd.jasper"));
    
  42. // parâmetros, se houverem
    
  43. Map parametros = new HashMap();
    
  44. parametros.put("Codig", nomeS);    
      	  
      /*Esta linha irá passar para o parametro do sub-relatório o caminho onde ele vai ler os relatórios e seus sub-relatórios.*/
    
  45. parametros.put("SUBREPORT_DIR", this.getServletContext().getRealPath+"/WEB-INF/");
    
  46. // direciona a saída do relatório para um stream
    
  47. bytes = JasperRunManager.runReportToPdf(relatorioJasper,parametros,conn);
    
  48. } catch (JRException e) {
    
  49. e.printStackTrace();
    
  50. }
    
  51. if (bytes != null && bytes.length > 0) {
    
  52. // envia o relatório em formato PDF para o browser
    
  53. response.setContentType("application/pdf");
    
  54. response.setContentLength(bytes.length);
    
  55. ServletOutputStream ouputStream = response.getOutputStream();
    
  56. ouputStream.write(bytes, 0, bytes.length);
    
  57. ouputStream.flush();
    
  58. ouputStream.close();
    
  59. }
    
  60. }
    
  61. }

Criado 27 de janeiro de 2011
Ultima resposta 27 de jan. de 2011
Respostas 4
Participantes 2