Problemas com JasperReport e Ireport

18 respostas
G

[size=12]Eu estou começando a usar java, e estou fazendo um sistema simples para emitir relatorios com o Ireport mas ñ sei como eu faço para q no meu sistema chame o relatorio ja criado no ireport para o sistema, ele funcionaria da seguinte maneira, é um sistema onde vc entra com os dados e poe para imprimir ñ existe conexão com banco de dados, ele teria apenas q pegar os dados preenchidos no textfield e jogar para os respectivos campos no relatorioa, colocando os dados nesse textfield ele aperta o botão imprimir ai ele imprimiria o relatorio com os dados, era isso q eu queria q o sistema fizesse mas eu ñ sei como fazer alguem poderie me dar uma ajuda nisso por favor…[/size]

18 Respostas

R
Bom, se você vai digitar informações em um JTextField, provavelmente não haverá a banda "Detail" no seu relatório, certo? Neste caso você pode criar parâmetros no seu relatório e passá-los lá na sua aplicação. Na sua aplicação ficaria algo do tipo:
// Valores dos parâmetros
HashMap params = new HashMap();
params.put("valor1", 10);
params.put("valor2", 20);
params.put("rotulo", "testando");

// Carrega o relatório
JasperReport report = (JasperReport) JRLoader.loadObject(getClass().getClassLoader().getResource("relatorio.jasper"));

// Passa os parâmetros ao relatório
JasperPrint impressao = JasperFillManager.fillReport(report, params);

// Exibe o relatório na tela
JRViewer viewer = new JRViewer(impressao);
viewer.setVisible(true);
Sacou?

Agora se você vai ter um relatório com várias linhas de valores, que utilize a banda "Detail", você deve criar um JRDataSource.

Abraços,

Marcos Antonio Campos Jordão''

G

O q eu quero é poder inserir esses dados no sistema no campo correspondente q é o JtextField e imprimir no relatório, so isso sem banco de dados sem nda é coloca os dados no sistema imprimo no relatorio como é q eu posso fazer isso?

R

Do jeito que eu falei.
Criando parâmetros no seu Report e passando do sistema para ele na hora da impressão via HashMap.

G

Então é so eu pegar tipo tem uma variavel nome no IReporte é $F{nome_pac} e no NetBeans esta como JtextField1, eu faria params.put(“JtextField1”, “nome_pac”); ficaria assim?

R

Com “Variáveis” não dá certo.
Você terá que criar “Parâmetros”.

Para adicionar ao Map seria assim:

Desde que “nome_pac” seja um parâmetro e não uma variável.

G

Então cara la no Ireporte onde eu criei a variavel $F{nome_pac} eu tenho que criar ela como $P{nome_pac} seria issou ou ñ? como faria para criar um paramentro

R

Não.
No iReport tem as áreas:

  • Parâmetros
  • Campos
  • Variáveis

Ao invés de criar em Variáveis, crie em Parâmetros.
Pode ser via menu: Visualizar > Parâmetros do Relatório > Novo
Ou pela lateral “Estrutura do Documento”.
Veja a imagem anexa.


G

Como é q eu vou criar o JRDataSource com 6 parametros

G

Ai raciOnal da uma olhada no código q eu criei so q da erro ve se tem alguma coisa de errada?

public void Prontuario() {
        //Inicializando as Variaveis
        JasperPrint impressao = null;
        
        // Parametros do relatorios
        HashMap params = new HashMap();
        params.put("nome_pac", nome_paciente.getText());
        params.put("cor_pac",cor_paciente.getItemListeners());
        params.put("idade_pac", idade_paciente.getText());
        params.put("sexo_pac",sexo_paciente.getItemAt(0));
        params.put("estvciv_pac",estcivil_paciente.getItemAt(0));
        params.put("religiao_pac",religiao_paciente.getText());
        params.put("localtrabalho_pac",localtrabalho_paciente.getText());
        params.put("profissao_pac",profissao_paciente.getText());
        params.put("convenio_pac",convenio_paciente.getText());
        params.put("endereco_pac",endereco_paciente.getText());
                
        // Referenciando o .jasper
        String relatorio = "Prontuario.jasper";
        
        try {
           impressao = JasperFillManager.fillReport(relatorio, params);
        } catch (JRException ex) {
            ex.printStackTrace();
        }
        
        // Exibe o relatório na tela
        JRViewer viewer = new JRViewer(impressao);
        viewer.setVisible(true);
    }
R

Você não informou qual o erro que está dando!

A princípio notei que está passando o relatório (variável “relatorio”) como String, tente passa-lo como JasperReport, obtendo pelo JRLoader, de preferência pegando o caminho no classpath através do getResource(). Assim:

Falow

G

Kara o erro é esse

at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:620) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124) at java.net.URLClassLoader.defineClass(URLClassLoader.java:260) at java.net.URLClassLoader.access$000(URLClassLoader.java:56) at java.net.URLClassLoader$1.run(URLClassLoader.java:195) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276) at java.lang.ClassLoader.loadClass(ClassLoader.java:251) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:420) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:256) at prontuarioimpresso.Prontuario.Prontuario(Prontuario.java:58)

Kara e vc havia dito pegando o caminho no classpath como assim… como faz isso?
e vc tb flw para eu usar o JRDataSource eu tenho mais parametros para passar ainda para o relatorio são 18 parametros, como eu vou usa JRDataSource seguindo esses ai q eu ja passei?

G

Agora da esse erro

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:139)

esse codigo é implementado dentro da classe onde eu criei o formulario Java ou eu tenho q criar um outra classe para ele

R

O JRDataSource eu tinha dito para você usar no caso de querer fazer um relatório com vários registros.
Também serve para fazer de um registro só, como é o seu caso, mas passando por parâmetro também vai dar certo.

Eu acho que o seu problema agora está em carregar o arquivo do .jasper

Onde você colocou o seu arquivo compilado?

Se ele estiver junto do seu projeto, por exemplo na raiz dele, a melhor maneira é deste jeito:
JasperReport relatorio = (JasperReport) JRLoader.loadObject(getClass().getClassLoader().getResource("Prontuario.jasper"));
Agora se ele estiver dentro de algum package interno, você deve informar também, assim:
JasperReport relatorio = (JasperReport) JRLoader.loadObject(getClass().getClassLoader().getResource("package_relatorios/Prontuario.jasper"));
Se ele estiver em algum lugar do seu computador você pode passá-lo como File, assim:
// Linux
File arquivo = new File("/home/marcos/relatorios/relatorio.jasper");
JasperReport relatorio = (JasperReport) JRLoader.loadObject(arquivo);

// Windows
File arquivo = new File("c:\relatorios\relatorio.jasper");
JasperReport relatorio = (JasperReport) JRLoader.loadObject(arquivo);

Mais uma dica, dá uma boa olhada na documentação, eu também precisei do JasperReport não faz muito tempo e aprendi tudo com a documentação.

Falow

N

gardussi, esse “Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException”

ocorre devido ao caminho informado estar retornando null, faça como o raci0nal falou

pra mim é a melhor maneira… cria um package e joga os .jasper nele e informe atraves do classpath

não tem erro… fica 100%

Exemplo de como eu uso :

  • Sistema
    ---- dao
    ---- view
    ---- recursos
    ---- etc

dai você lê os recursos do pacote:

URL relatorio = getClass().getClassLoader().getResource("recursos/nome-do-relatorio.jasper");

Map parameters = new HashMap();
//parameters.put("nome do parametro", valor ); Caso queira passar algum parametro ao relatório
            

JasperPrint preencher_este_relatorio = JasperFillManager.fillReport(  relatorio.openStream()  , parameters , jrRS);
JasperViewer.setDefaultLookAndFeelDecorated(true);
JasperViewer.viewReport( preencher_este_relatorio , false );
G

Kara continua dando erro eu ja coloquei o arquivo .jasper o .jrxml e nda

G

Agora eu consegui deu certo vlw ai pela ajuda kara

G
Esse é o codigo do programa no meu ele funcionou certinho vlw
public void GeraRelatorio() {
        JasperReport caminho = null;
        
        try {
            caminho = (JasperReport) JRLoader.loadObject(getClass().getClassLoader().getResource("Prontuario.jasper"));
        } catch (JRException ex) {
             System.out.println(ex.getMessage()); 
            ex.printStackTrace();
        }
        
        
        // Parametros do relatorios   
        Map parametros = new HashMap(); 
        parametros.put("nome_pac", nome_paciente.getText());
        parametros.put("cor_pac",cor_paciente.getText());
        parametros.put("idade_pac", idade_paciente.getText());
        parametros.put("sexo_pac",sexo_paciente.getText());
        parametros.put("estvciv_pac",estadocivil_paciente.getText());
        parametros.put("religiao_pac",religiao_paciente.getText());
        parametros.put("localtrabalho_pac",localtrabalho_paciente.getText());
        parametros.put("profissao_pac",profissao_paciente.getText());
        parametros.put("convenio_pac",convenio_paciente.getText());
        parametros.put("endereco_pac",endereco_paciente.getText());
        
        JasperPrint impressao = new JasperPrint();  
        
        try {   
           impressao = JasperFillManager.fillReport(caminho ,parametros);   
               
            JasperViewer viewer = new JasperViewer(impressao, true);   
            viewer.setVisible(true);   
            
            //Nome e diretorio onde vai ser gerado o PDF   
            String destFileName  = "C:\\Prontuario\\relatorio\\geraPDF.pdf";   
            JasperExportManager.exportReportToPdfFile(impressao,destFileName);   
           // JasperExportManager.exportReportToHtmlFile(impressao,destFileNameHTML);       
        } catch (JRException e) {   
            System.out.println(e.getMessage());   
        }   
  
    }
R

oi ai esta meu codigo

import java.io.*;           
            import java.util.HashMap;    
            import java.util.ArrayList;      
            import java.util.List;      
            import java.util.Map;      
            //import javax.swing.JOptionPane;     
          
          
                         
          public class Dados{               
                       
                  
              //"args" é um array de String onde cada elemento é um argumento passado pela linha de comando momento na "inicialização" da execução.    
              public static void main(String[] args){               
                      
                      
                 Map<Integer, List<String>> mapLines= new HashMap<Integer, List<String>>();         
               try {               
                 //leitura do ficheiro, prepara-o para ser aberto    
                 BufferedReader in = new BufferedReader(new FileReader("conteudo.txt"));               
                 String str;           
                 int i = 0;           
                 //vai percorrer todo o ficheiro    
                 while((str = in.readLine()) != null)               
                 {                     
                     if(str.startsWith("#"))    
                     {                     
                         str= "";                     
                     }                     
                     else{     //esta a dividir a frase em varias strings imprimindo o seu resultado    
                          List<String> values = new ArrayList<String>();         
                              String words[] = str.split(";");             
                              for(String word : words) {             
                                  values.add(word);     
                                  System.out.println(word);    
                              }         
                              mapLines.put(i, values);         
                              i++;         
                     }       
               }// fim do while                               
                 in.close();               
             }  catch (IOException e){               
                 // possiveis erros são tratatos aqui     
                 //JOptionPane.showMessageDialog(null, this.word, "NÂO FOI POSSÍVEL ABRIR O SEU FICHEIRO", JOptionPane.ERROR_MESSAGE);      
                 System.out.println("ERRO-->NÃO FOI ENCONTRADO O SEU FICHEIRO DE DESTINO,TENTE DE NOVO");            
             }          
             // Apresenta o contéudo do Map         
             Map<Integer, List<String>> m = new HashMap<Integer, List<String>>();         
             for(Integer key : m.keySet()) {         
                 for(String word : m.get(key)) {         
                     System.out.println(word);         
                 }         
             }                  
             }     
              public static void main2(String[] args){               
                      
                      
                  Map<Integer, List<String>> mapLines= new HashMap<Integer, List<String>>();         
               try {               
                            
                 BufferedReader in2 = new BufferedReader(new FileReader("conteudo2.txt"));               
                 String str;           
                 int i = 0;           
                 while((str = in2.readLine()) != null)               
                 {                     
                     if(str.startsWith("#"))                     
                     {                     
                         str= "";                     
                     }                     
                     else{     //esta a dividir a frase em varias strings    
                              List<String> values = new ArrayList<String>();         
                              String words[] = str.split(" ");             
                              for(String word : words) {             
                                  values.add(word);    
                                  System.out.println(word);    
                              }         
                              mapLines.put(i, values);         
                              i++;         
                     }       
               }// fim do while                               
                 in2.close();               
             }  catch (IOException e){               
                 // possiveis erros são tratatos aqui      
                 System.out.println("ERRO-->NÃO FOI ENCONTRADO O SEU FICHEIRO DE DESTINO,TENTE DE NOVO");    
             }          
             // Apresenta o contéudo do Map         
             Map<Integer, List<String>> m = new HashMap<Integer, List<String>>();         
             for(Integer key : m.keySet()) {         
                 for(String word : m.get(key)) {         
                     System.out.println(word);         
                 
                  }       
          
              }    
          }    
      }

e tenho por exemplo este ficheiro

961234567 253883377 24:05:2011 10:30:10 068 16 13    
       963456789 253883355 28:05:2011 12:15:17 088 12 09    
       963456789 253883377 29:05:2011 17:00:00 120 14 11    
       969876666 253883377 30:05:2011 10:05:34 070 11 09    
       961234567 253883377 31:05:2011 22:30:05 066 14 11    
       961234567 253883377 02:06:2011 14:19:41 076 15 13    
       963456789 253883377 05:06:2011 11:33:34 085 07 06

e queria que fosse pedido ao utilizador que dados e que ele quer imprimir. por exemplo...pedirmos para imprimir todos os dados com o numero 961234567

abraços

Criado 11 de janeiro de 2008
Ultima resposta 27 de jun. de 2011
Respostas 18
Participantes 4