[RESOLVIDO]Relatório JASPER + JSF

10 respostas
L

Olá galera,

Muito já li e pesquisei, aqui mesmo no GUJ e em outros sites e não consegui solucionar o meu problema.

Tenho um projeto WEB - JSP + JSF - criado com o NetBeans 6.7.1 e construí um relatório bem simples com o IReport 3.6.0 e preciso chamar esse relatório no sistema que estou desenvolvendo. O relatório está pronto e já foi gerado o arquivo .jasper . Estou utilizando o postgresql.

Estou aprendendo sobre essas tecnologias, já que nunca programei nada para web.

Gostaria que alguém me ajudasse nessa tarefa: Como faço para chamar esse relatório em PDF no browser, passando um ResultSet?

Muito obrigado a todos que puderem me ajudar…
Abraços!

10 Respostas

M

Dê uma olhada nesse tópico

http://www.guj.com.br/posts/list/84044.java#448426

P

cara a moçada aqui não ajuda muito com relação a geração de relatórios jasper + java. fiquei um tempo pedindo ajuda mas não deu em nada ai tive q estudar a tecnologia mais a fundo.

seguinte essa nova versão do ireport ta meia bugada então sugiro voltar uma versão dessa ferramenta

segue o código q tenho aqui funcionando:

import java.io.IOException;
import java.io.StringReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.HashMap;

import net.sf.jasperreports.engine.JasperManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.view.JasperViewer;

/* Primeira parte */
public class RelatorioLaboratorio {


   private Connection con = null;
   private String driver = "oracle.jdbc.driver.OracleDriver";
   private String endereco = "jdbc:oracle:thin:@host:1521:sid";
   private String user = "user";
   private String pass = "passw";
   private ResultSet rs = null;
   private String valores[] = new String[10];
   private int chamada = 1;
   private String dir = System.getProperty("user.dir") + "/web/";
   private StringReader stream;
   /*Segunda parte */

   public RelatorioLaboratorio() {
      /* Efetua a conexao a base de dados e coleta os valores da base de dados armazenando-os
       em um array para ser futuramente utilizado */
      try {
         if (con == null) {
            Class.forName(driver);
            con = DriverManager.getConnection(endereco, user, pass);
            Statement statement = con.createStatement();
            rs = statement.executeQuery("select * from chamado");
            HashMap teste = new HashMap();
            while(rs.next()) {
               //for até o numero de campos da tabela
               for (int i = 1; i < 10; i++) {
                  valores[i] = rs.getString(i);
               }
            }
         }
      }
      catch (Exception e) {
         System.err.println("Problemas apresentados na operacao de conexao");
         e.printStackTrace();
      }
      /* Inicio do bloco que ira gerar nossos relatorios e 3ª parte */
      try {
         //String array[] = valores;
         JasperDesign design = JasperManager.loadXmlDesign(dir + "relatorios/relatorio.jrxml");
         JasperReport jr = JasperManager.compileReport(design);
         HashMap parameters = new HashMap();
         parameters.put("PAR_PEDID",1);
         //parameters.put("PARAMETRO_2", array[2]);
         //parameters.put("PARAMETRO_3", array[5]);
         //parameters.put("PARAMETRO_4", array[4]);
         //parameters.put("PARAMETRO_5",array[9]);
         JasperPrint impressao = JasperManager.fillReport(jr,parameters,con);
         JasperViewer jrviewer = new JasperViewer(impressao,false);
         jrviewer.show();
      }
      catch (Exception e) {
         e.printStackTrace();
      }
   }
   /* Aqui chamamos o construtor de nossa classe para exibirmos o relatorio e 4ª parte*/
   public static void main (String args[]) {
      new RelatorioLaboratorio();
      System.out.println("ok");
   }
}

espero q te ajude a iniciar

abraço

L

Primeiramente, obrigado a vocês que responderam e me ajudaram a aumentar meu conhecimento… Por isso que a comunidade GUJ é sempre forte!!! :smiley:

phmjunior

Estou seguindo seu exemplo e a classe criada com esse código funcionou perfeitamente!!! Pelo NetBeans mesmo, quando mando executar essa classe, visualizo a tela exibindo meu relatório, como eu queria!!! Muito OBRIGADO!

Só tem mais um probleminha… hehehe…

Considerando que minha aplicação é web, JSP + JSF, como havia dito antes… Como faço para chamar esse relatório (utilizando essa classe que acabei de criar) através do clique de um botão, por exemplo??? Desculpe se a pergunta for muito óbvia, é que estou aprendendo…

Conto novamente com a ajuda de vocês!!! Vlw e aguardo…

[]'s

P

você utiliza o botão : commandButton ??

L

Não… Acho que não é commandButton…

Um button normal, que fica disponível na paleta de componentes do NetBeans…

P

você usa o jsf certo?
se sim, então você usa os componentes jsf como por exemplo managedBean.

cria no tua aplicação ond for chamar o relatório um h:commandLink
Assim:

<h:commandLink action="Relatorio1.RelatorioLaboratorio" value="" />

ai no seu managedBean:

<managed-bean>
      <managed-bean-name>Relatorio1</managed-bean-name>   
      <managed-bean-class>meu Pacote.RelatorioLaboratorio</managed-bean-class>
      <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

acho q é isso.

L

phmjunior

Consegui fazer o que eu queria… Não usei o ManagedBean como disse, mas suas respostam foram de grande ajuda.

Fiz algumas alterações na classe que postou de exemplo e adaptei ela a minha necessidade… Consegui chamar o relatório como queria através de um button… Tudo certinho!

Mais tarde vou postar a classe alterada para ficar a disposição da galera! :slight_smile:

Mais uma vez, obrigado GUJ e vlw phmjunior!!!

P

blz cara parabéns!!!
isso posta sua classe alterada pra galera ver q não complicado.

abraço

L

Tá ai galera, conforme o prometido:

import java.io.IOException;
import java.io.StringReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.HashMap;

import net.sf.jasperreports.engine.JasperManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.view.JasperViewer;

/* Primeira parte */
public class Relatorio {

    private Connection con = null;
    private String driver = "org.postgresql.Driver";
    private String endereco = "jdbc:postgresql://localhost:5432/bancoteste";
    private String user = "user";
    private String pass = "user";
    private ResultSet rs = null;
    private String valores[] = new String[10];
//    private int chamada = 1;

//    Localizar pasta que contém os relatórios:
//    private String dir = System.getProperty("user.dir") + "/web/";
    private String dir = "Aqui o diretorio do seu projeto ou utilizar a linha anterior";
//    private StringReader stream;
    /*Segunda parte */

    public void GeraRelatorio(String sql, String relatorio) {
        /* Efetua a conexao a base de dados e coleta os valores da base de dados armazenando-os
        em um array para ser futuramente utilizado */
        try {
            if (con == null) {
                Class.forName(driver);
                con = DriverManager.getConnection(endereco, user, pass);
                Statement statement = con.createStatement();
                rs = statement.executeQuery(sql);
                HashMap teste = new HashMap();
                while (rs.next()) {
                    //for até o numero de campos da tabela
                    for (int i = 1; i < 10; i++) {
                        valores[i] = rs.getString(i);
                    }
                }
            }
        } catch (Exception e) {
            System.err.println("Problemas apresentados na operacao de conexao");
            e.printStackTrace();
        }
        /* Inicio do bloco que ira gerar nossos relatorios e 3ª parte */
        try {
            //String array[] = valores;
            JasperDesign design = JasperManager.loadXmlDesign(dir + "relatorios/" + relatorio +".jrxml");
            JasperReport jr = JasperManager.compileReport(design);
            HashMap parameters = new HashMap();
            parameters.put("PAR_PEDID", 1);
            //parameters.put("PARAMETRO_2", array[2]);
            //parameters.put("PARAMETRO_3", array[5]);
            //parameters.put("PARAMETRO_4", array[4]);
            //parameters.put("PARAMETRO_5",array[9]);
            JasperPrint impressao = JasperManager.fillReport(jr, parameters, con);
            JasperViewer jrviewer = new JasperViewer(impressao, false);
            jrviewer.show();
            con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Assim, eu consegui chamar essa classe e exibir o relatório na tela ao clicar em um button, passando o SQL e o nome do arquivo do relatório como parâmetros…

Tem muita coisa a ser melhorada, mas já é um grande passo :smiley: !!!

[]'s

J

lksJF a tua dúvida e a minha dúvida !

Mano, esse teu sistema e comercial ou tu poderia disponibilizar o código para estudo ?

Grande abraço …

[email removido]

Criado 21 de outubro de 2009
Ultima resposta 7 de jul. de 2010
Respostas 10
Participantes 4