Jasper - Nullpointer nos parameters do fillreport

Galera do meu Brasil-il-il…

Tenho esse código que chama um relatorio com tres campos criados como PARAMETER no IREPORT. codigo, descricao e emUso.

No fillreport, ele está me retornando NullPointer Exception por causa da tal HashTable, acho eu. Alguem tem alguma luz pra lançar sobre meu problema?


        try{
            
            //captura os dados na tabela em MySQL
            //e retorna em um vetor

            Vector filtro = dbTipoEquipamento1.TipoEquipamentoFiltrar();
            
            Hashtable parametros = new Hashtable();
            
            TipoEquipamento registroLocalizado;

            // Acresce os parametros conforme os registros
            // que forem sendo encontrados no loop
            // Tenho minhas dúvidas quanto a essa parte do código

            for (int contador=0; (contador<=filtro.size()-1); contador++){
                
                registroLocalizado = (TipoEquipamento) filtro.get(contador);
                
                int codigo;
                String descricao, emUso;
                
                codigo    = registroLocalizado.getCodigo();
                descricao = registroLocalizado.getDescricao();
                emUso     = registroLocalizado.getEmUso();
                
                parametros.put("codigo",String.valueOf(codigo));
                parametros.put("descricao",descricao);
                parametros.put("emUso",emUso);
                
            }
            
            JasperReport relatorio = JasperCompileManager.compileReport("C:\\TiposEquipamento.jrxml");
            JasperPrint impressao = JasperFillManager.fillReport(relatorio, parametros, (new JREmptyDataSource()));
            
            JasperViewer view = new JasperViewer(impressao);
            view.setVisible(true);
            
        }catch(Exception e){
            e.printStackTrace();
            JOptionPane.showMessageDialog(null, "Não foi possível a processar o relatório.\nMotivo:"+e.getMessage());
        }

Aqui vai o erro retornado.

Tenho uma incerteza quanto aos parametros, mas não consegui esclarecê-las em nenhum tutorial que encontrei pela net. Se alguem puder me ajudar, ficarei muito agradecido e até pago uma cerveja se morar em Porto Alegre, hehehehehe…

Desde já agradeço
Bonissauro

bonissauro,

Me parece que você está tentando inserir um valor nulo no Hashtable. Você tem certeza que as variáveis codigo, descricao e emUso não são nulas? Debuga esse código e dá um verificada nisso ok?

Já debuguei antes de postar e a HashTable está carregada com as chaves e valores corretos. O erro está me ocorrendo na linha

JasperPrint impressao = JasperFillManager.fillReport(relatorio, parametros, (new JREmptyDataSource()));

Um colega de outro forum disse que estou passando os dados a serem impressos pelos PARAMETER (2 parametro do fillreport) quando deveria passar pelo Datasource (3º parametro), mas não consegui descobrir como montar o datasource adequadamente, nem o que devo passar como PARAMETER, de repente ate como null, mas nao funcionou de nenhuma maneira. Continuo perdidaço…

Em todo caso, valew…
Bonissauro

bonissauro,

Você está passando um ResultSet vazio:

JasperPrint impressao = JasperFillManager.fillReport(relatorio, parametros, (new JREmptyDataSource()));

(new JREmptyDataSource()))

Ao invés de você fazer new JREmptyDataSource() crie uma função que retorne do seu banco um ResultSet.

Exemplo:

Connection con = DriverManager.getConnection("SUA STRING DE CONEXAO DE BANCO"); 
PreparedStatement stmt = con.prepareStatement("SELECT * FROM tabela");
ResultSet rs = stmt.executeQuery();

Não esqueça das exceptions!

Então você passaria como parametro o rs:

JasperPrint impressao = JasperFillManager.fillReport(relatorio, parametros, rs));

Complementando:

O HashTable passa somente os parâmetros para a sua query (no nosso caso o stmt).

Você estava inserindo valores no HashTable sem necessidade. Basta passar o ResultSet como parametro para enviar os valores para o JasperReport.

Um abraço!

Valew pelas dicas, meus bruxos, mas ainda não deu certo.

Pelo que entendi, deveria fazer o código desta maneira…


                try {
                    
                    String sqlConsulta="select codigo, descricao, emUso from CSE_TIPOS_DE_EQUIPAMENTO order by descricao";
                    
                    PreparedStatement stmt=con.prepareStatement(sqlConsulta);
                    
                    ResultSet rs = stmt.executeQuery();
                    
                    Hashtable parametros = new Hashtable();
                    
                    JasperReport relatorio = JasperCompileManager.compileReport("C:\\TiposEquipamento.jrxml");
                    
                    JasperPrint impressao = JasperFillManager.fillReport(relatorio, parametros, new JRResultSetDataSource(rs));
                    
                    JasperViewer view = new JasperViewer(impressao);
                    view.setVisible(true);
                    
                } catch(Exception e){
                    
                    e.printStackTrace();
                    
                    JOptionPane.showMessageDialog(null, e.getMessage());
                    
                    c.fecharConexao(con);
                    
                }

Mas continua me dando o tal nullponter exception na hashtable… Acho que tenho que mandar algo nesse tal parametro mas nao sei o que…

O gozado é que o erro so me aparece no prompt do netbeans. A mensagem do optionpane é uma String vazia…

Obrigado DE NOVO pela atenção
Bonissauro

Substitua o HashTable pelo HashMap :wink:

Feitoooo, Tenho um relatório que ATÉ FUNCIONA em Java. Este é um momento histórico…

Obrigado, meu bruxo…

Aliás, obrigado a todos que me aturaram até aqui e, saibam de antemão que isso foi SÓ O COMEÇO. Me aguardem brevemente com novas dúvidas… Hahahahaha…

Abraco a todos
Bonissauro