[SOLUÇÃO] Relatório Dinamico - JasperReport

3 respostas
A

Pessoal,

tive muita dificuldade de encontrar algum exemplo de relatório dinamico simples e facil.

Então vou postar um exemplo de relatório dinamico feito todo com JasperDesign (Classe do JasperReport).

O Relatório abaixo gera uma tabela com 4 colunas (id,data,hora,status). Para tornar o relatório dinamico basta criar métodos que manipulem o conteúdo. Segue após o relatório um exemplo de um método q gera um Field, o que muda é só o local do código, como vocês podem ver

public class RelatorioDesign extends HttpServlet{

	private static final long serialVersionUID = 1L;

      @SuppressWarnings("unchecked")
      public void doGet(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException
      {

            try{

        	
            // Gera o Design do relatório
            JasperDesign desenho = getJasperDesign();
            	  
           	// Gera um .Jasper para vizualizar no IReport: (Só para teste no IReport)
            //JasperCompileManager.compileReportToFile(desenho, "D:\\Design.jasper");
            	  
            Map parametros = new HashMap();

            // Compila o Relatório
            JasperReport jr = JasperCompileManager.compileReport(desenho);
                  
            // Gera uma lista com os Forms (Ou seja a lista com o objeto que voce deseja exibir no relatorio)
            ArrayList lista = new ArrayList();
            lista.add(new Form()); 
                  
            // Cria um PDF para o Relatório
            JRBeanCollectionDataSource jrBean = new JRBeanCollectionDataSource(lista);
            JasperPrint impressao = JasperFillManager.fillReport(jr, parametros, jrBean);
            byte[] b = JasperExportManager.exportReportToPdf(impressao);
                  
            // Exibe o PDF
            ServletOutputStream ouputStream;
            ouputStream = response.getOutputStream();
            response.setContentType("application/pdf");
            response.setContentLength(b.length);
            ouputStream.write(b, 0, b.length);
            ouputStream.flush();
            ouputStream.close();
          
           }
           
          catch(Exception e){

            	e.printStackTrace();

           }
      }
      
      private JasperDesign getJasperDesign() throws JRException {

  
    		// -------------------   PÁGINA  -------------------

    		JasperDesign jasperDesign = new JasperDesign();

    		jasperDesign.setName("RelatorioDinamico");

    		jasperDesign.setPageWidth(600);

    		jasperDesign.setPageHeight(1000);

    		jasperDesign.setColumnCount(1);

    		jasperDesign.setColumnWidth(540);

    		jasperDesign.setColumnSpacing(0);

    		jasperDesign.setLeftMargin(0);

    		jasperDesign.setRightMargin(0);

    		jasperDesign.setTopMargin(0);

    		jasperDesign.setBottomMargin(0);


    		// -------------------   FIELDS  -------------------

	    		JRDesignField field = new JRDesignField();
	
	    		field.setName("hora");
	
	    		field.setValueClass(java.lang.String.class);
	
	    		jasperDesign.addField(field);
	
	
	
	    		field = new JRDesignField();
	
	    		field.setName("data");
	
	    		field.setValueClass(java.lang.String.class);
	
	    		jasperDesign.addField(field);
	    		
	    		
	    		field = new JRDesignField();
	
	    		field.setName("status");
	
	    		field.setValueClass(java.lang.String.class);
	
	    		jasperDesign.addField(field);
	    		
	    		
	    		field = new JRDesignField();
	
	    		field.setName("id");
	
	    		field.setValueClass(java.lang.Integer.class);
	
	    		jasperDesign.addField(field);

    		

    		// -------------------   TITLE  -------------------

    		JRDesignBand band = new JRDesignBand();

    		band.setHeight(70);
    		
    		JRDesignStaticText staticText = new JRDesignStaticText();

    		staticText.setX(189);

    		staticText.setY(18);

    		staticText.setWidth(233);

    		staticText.setHeight(32);

    		staticText.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_CENTER);
    		
    		staticText.setFontName("Tahoma");
    		
    		staticText.setPdfFontName("Helvetica-Bold");
    		
    		staticText.setFontSize(24);
    		
    		staticText.setBold(true);
    		
    		staticText.setText("Relatorio Dinamico");

    		band.addElement(staticText);

  
    		jasperDesign.setTitle(band);

    		

    		// -------------------   PAGE HEADER  -------------------

    		band = new JRDesignBand();

    		band.setHeight(15);

    		jasperDesign.setPageHeader(band);

    		

    		// -------------------   COLUMN HEADER  -------------------

    		band = new JRDesignBand();
    		
    		band.setHeight(22);

    		jasperDesign.setColumnHeader(band);
    		
       		
    		//Coluna
    		staticText = new JRDesignStaticText();

    		staticText.setX(216);

    		staticText.setY(2);

    		staticText.setWidth(56);

    		staticText.setHeight(19);

    		staticText.setBackcolor(Color.GRAY);

    		staticText.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_CENTER);
    		
    		staticText.setText("Data");

    		band.addElement(staticText);

    		
    		//Coluna
    		staticText = new JRDesignStaticText();

    		staticText.setX(272);

    		staticText.setY(2);

    		staticText.setWidth(108);

    		staticText.setHeight(19);

    		staticText.setBackcolor(Color.GRAY);

    		staticText.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_CENTER);
    		
    		staticText.setText("Hora");

    		band.addElement(staticText);
    		
    		//Coluna
    		staticText = new JRDesignStaticText();

    		staticText.setX(156);

    		staticText.setY(2);

    		staticText.setWidth(60);

    		staticText.setHeight(19);

    		staticText.setBackcolor(Color.GRAY);

    		staticText.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_CENTER);
    		
    		staticText.setText("ID");

    		band.addElement(staticText);
    		
    		//Coluna
    		staticText = new JRDesignStaticText();

    		staticText.setX(380);

    		staticText.setY(2);

    		staticText.setWidth(64);

    		staticText.setHeight(19);

    		staticText.setBackcolor(Color.GRAY);

    		staticText.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_CENTER);
    		
    		staticText.setText("Status");

    		band.addElement(staticText);

    		

    		// -------------------   DETAIL  -------------------

    		band = new JRDesignBand();

    		band.setHeight(20);

    		
    		// Campo
    		JRDesignTextField textField = new JRDesignTextField();

    		textField.setBlankWhenNull(false);

    		textField.setX(216);

    		textField.setY(5);

    		textField.setWidth(56);

    		textField.setHeight(14);

    		textField.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_CENTER);

    		JRDesignExpression expression = new JRDesignExpression();

    		expression.setValueClass(java.lang.String.class);

    		expression.setText("$F{data}");

    		textField.setExpression(expression);

    		band.addElement(textField);

    		
    		// Campo
    		textField = new JRDesignTextField();

    		textField.setBlankWhenNull(false);

    		textField.setX(272);

    		textField.setY(5);

    		textField.setWidth(108);

    		textField.setHeight(14);

    		textField.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_CENTER);

    		expression = new JRDesignExpression();

    		expression.setValueClass(java.lang.String.class);

    		expression.setText("$F{hora}");

    		textField.setExpression(expression);

    		band.addElement(textField);
    		
    		
    		// Campo
    		textField = new JRDesignTextField();

    		textField.setBlankWhenNull(false);

    		textField.setX(380);

    		textField.setY(5);

    		textField.setWidth(64);

    		textField.setHeight(14);

    		textField.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_CENTER);

    		expression = new JRDesignExpression();

    		expression.setValueClass(java.lang.String.class);

    		expression.setText("$F{status}");

    		textField.setExpression(expression);

    		band.addElement(textField);

    		
    		// Campo
    		textField = new JRDesignTextField();

    		textField.setBlankWhenNull(false);

    		textField.setX(156);

    		textField.setY(5);

    		textField.setWidth(60);

    		textField.setHeight(14);

    		textField.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_CENTER);

    		expression = new JRDesignExpression();

    		expression.setValueClass(java.lang.Integer.class);

    		expression.setText("$F{id}");

    		textField.setExpression(expression);

    		band.addElement(textField);
    		
    		
    		jasperDesign.setDetail(band);    	
  		

    		// -------------------   COLUMN FOOTER  -------------------

    		band = new JRDesignBand();
    		
    		band.setHeight(5);

    		jasperDesign.setColumnFooter(band);



    		// -------------------   PAGE FOOTER  -------------------

    		band = new JRDesignBand();
    		
    		band.setHeight(5);

    		jasperDesign.setPageFooter(band);



    		// -------------------   SUMARY  -------------------

    		band = new JRDesignBand();
    		
    		band.setHeight(5);

    		jasperDesign.setSummary(band);

    		

    		return jasperDesign;
    	}
}

Exemplo Método Gera Field:

// (...)

            private enum tipoColunas{
		  
		ID("java.lang.Integer"), 
		DATA("java.lang.String"), 
		HORA("java.lang.String"), 
		STATUS("java.lang.String");
		  
		private String tipo;
		  
		tipoColunas(String tipo){
			this.tipo = tipo;
		}
	}

// (...)

      private JRDesignField insereField(String coluna){
    	  
    	JRDesignField field = new JRDesignField();
    	field.setName(coluna);
  		
    	// Recupera o tipo do Field dinamico
    	String tipo = tipoColunas.valueOf(coluna.toUpperCase()).tipo;
 		
    	field.setValueClassName(tipo);

  		return(field);
    }

Espero ajudar o pessoal que tenham q fazer essa tristeza. Acho que fica bem facil com o exemplo, o resto é só a lógica do que você quer fazer.

DICA: Analizem o código dentro do .jrxml estático que vocês querem tornar dinamico. Vai facilitar o entendimento.

Abraço.

3 Respostas

E

Amigo desculpe perguntar neste forum, mais estou tendo esssa dificuldade no seu exemplo quando eu rodo gera a seguinte execacao

run:

Exception in thread main net.sf.jasperreports.engine.design.JRValidationException: Report design not valid :

1. Field not found : nome

2. Field name missing.

at net.sf.jasperreports.engine.design.JRAbstractCompiler.verifyDesign(JRAbstractCompiler.java:258)

at net.sf.jasperreports.engine.design.JRAbstractCompiler.compileReport(JRAbstractCompiler.java:140)

at net.sf.jasperreports.engine.JasperCompileManager.compileReport(JasperCompileManager.java:215)

at jasperreportexemplo.Main.gerar(Main.java:58)

at jasperreportexemplo.Main.main(Main.java:68)

Java Result: 1

alguem sabe o porque?
e aonde vc esta usando este metodo Gera Field:

A

Não estou usando pois no exemplo estou assumindo que contém os fields: hora, data, status e ID.

O gera Field seria para inserir dinamicamente esses campos, ou seja, escolher quais desses campos vão estar no relatório.

O erro está informando que vc está usando um Field nome, que não foi setado.

Por ex:

JRDesignField field = new JRDesignField();   
   
            field.setName("nome");   
   
            field.setValueClass(java.lang.String.class);   
   
            jasperDesign.addField(field);
E

Bom dia, então consegui fazer funcionar, muito bom seu exemplo foi o unico na net que eu encontrei me ajudou muito, fiz o que eu queria.

Obrigado

Criado 16 de outubro de 2009
Ultima resposta 8 de jun. de 2010
Respostas 3
Participantes 2