Jasper dando erro, quando chamado por classe java

5 respostas
B

Tenho um relatorio no IReport com os campos definidos “codigo”, “descricao” e “emUso”. Todos são String. Estou tentando rodá-lo via classe java com o seguinte código:

private void botaoImpressaoRelatorioActionPerformed(java.awt.event.ActionEvent evt) {                                                        
        
        Vector headers = new Vector();
        Vector linhas = new Vector();
        Vector registro = new Vector();;
        
        headers.clear();
        headers.add((Object) "codigo");
        headers.add((Object) "descricao");
        headers.add((Object) "emUso" );
        
        registro.clear();
        registro.add((Object) "0001");
        registro.add((Object) "Teste 1");
        registro.add((Object) "S");
        linhas.add(registro);
        
        registro.clear();
        registro.add((Object) "0002");
        registro.add((Object) "Teste 2");
        registro.add((Object) "S");
        linhas.add(registro);
        
        registro.clear();
        registro.add((Object) "0003");
        registro.add((Object) "Teste 3");
        registro.add((Object) "N");
        linhas.add(registro);
        
        registro.clear();
        registro.add((Object) "0004");
        registro.add((Object) "Teste 4");
        registro.add((Object) "S");
        linhas.add(registro);
        
        registro.clear();
        registro.add((Object) "0005");
        registro.add((Object) "Teste 5");
        registro.add((Object) "S");
        linhas.add(registro);
        
        
        //String dir="";
        
        try{
            
            AcessoBanco c= new AcessoBanco();
            Connection con = null; // c.criarConexao();
            
            MyDataSource dataSource = new MyDataSource(headers, linhas);
            
            JasperReport relatorio = JasperCompileManager.compileReport("C:\\TiposEquipamento.jrxml");
            
            Map parametros = new HashMap();
            parametros=null;
            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());
        }
        
    }

Ele está me retornando o seguinte erro :

No Ireport esses campos estao ligados a uma consulta que lá criei e funciona legal com a tabela original. Será que é por isso que não consigo compilar? Se for, como devo criar os campos lá no Ireport para aceitar o relatorio via java do jeito que estou fazendo?

A quem ajudar, agradeço.
Bonissauro

PS: Na verdade não consegui fazer nenhum relatório meu funcionar a partir de classes java, sendo com ou sem consultas, arrays ou o quer que seja…

5 Respostas

C

Ola…

Pelo que eu vi no seu Report tu fez um Vector so com outros certo ?

No seu HashMap (que é ond tu manda seus parametros pra teu relatorio) e vc está passando null pra ele, entao ele n vai passar!

procure tutoriais sobre como passar collections pra seu relatorio, da uma lida bem legal e tente implementar, ai qualquer coisa tu posta ai q agente resolve pra ti, OK ?

B

Ola…

Buenas…

Pelo que eu vi no seu Report tu fez um Vector so com outros certo ?

Não entendi muito bem tua duvida a respeito da minha duvida (nossa, tô ficando enrolado). É que não postei um código onde implemento uma classe datasource que gera os dados a partir de vetores e nao de conexoes com BDs. Desculpe por ter esquecido de postar:

public class MyDataSource implements JRDataSource {
        
        Vector fields = null;
        Vector data = null;
        Iterator itData = null;
        Object nextData = null;
        
        public MyDataSource(Vector fields, Vector data){
            this.fields = fields;
            this.data = data;
            itData = data.iterator();
        }
        
   /* (non-Javadoc)
    * @see net.sf.jasperreports.engine.JRDataSource#next()
    */
        public boolean next() throws JRException {
            boolean hasNext = itData.hasNext();
            if(hasNext==true)
                nextData = itData.next();
            return hasNext;
        }
        
   /* (non-Javadoc)
    * @see net.sf.jasperreports.engine.JRDataSource#getFieldValue(net.sf.jasperreports.engine.JRField)
    */
        public Object getFieldValue(JRField arg0) throws JRException {
            Iterator it = fields.iterator();
            int i = 0;
            int index = 0;
            for(Object element = it.next();it.hasNext();element = it.next(),i++)
                if(element.toString().compareToIgnoreCase(arg0.getName())==0)
                    index = i;
            
            return ((Vector) nextData).get(index);
        }
        
    }

No seu HashMap (que é ond tu manda seus parametros pra teu relatorio) e vc está passando null pra ele, entao ele n vai passar!

Achei que os dados para preenchimento dos campos fossem passados pelo Datasource e que os tais parametros fossem para coisas como título do relatório, período a ser processado pela query, e outras coisas.

procure tutoriais sobre como passar collections pra seu relatorio

Queres dizer, ao invés de Vectors, passar collections no parâmetro DataSource ou te referes ao HashMap mesmo?

dá uma lida bem legal e tente implementar, ai qualquer coisa tu posta ai q agente resolve pra ti, OK ?

Já tentei vários, e juro que os “li bem legal” mesmo, antes de importunar os colegas. Mas o tutoriais que encontrei são similares nas coisas simples, como desenhar o report, e superficiais na explicação dos conceitos como esses dos “parametros” e “datasources”, que me confundem pacas. Quando têm exemplos, são de aplicações complexas, que, ou tenho que compreendê-las como um todo, ou tentar adaptá-las a tarefas simples, como esta que estou tentando, mas não tenho sucesso.

Em todo caso, sigo pesquisando…

Obrigado pela ajuda…

Abraco
Bonissauro

C

Bonissauro…

Tem um tutorial do Roberto Furutani, é bem legal mesmo, ele mostra como fazer isso.
Sobre tu passar collections pra seu relatório… tente o seguinte…

vamos supor q tu tem uma empresa que lista os carros que estão estacionados no seu estacionamento…
entao tu tem uma classe carro que tem atributos como cor, placa, marca, etc… certo ?
agora pra tu saber os carros que estão tu faz um select no BD e ele te retorna X carros certo ?
e no seu report tu vai mostrar isso, ele vai ficar assim lá

ta… pra isso na sua colection tinham 2 objetos, um carro com a placa 123 e outro com a placa 456 certo ?

qdo vc fez o select no seu bd, vc fez isso certo ?

ArrayList list = new ArrayList();

while( resultSet.next() )
   list.add( carro );

ai tu passa entao essa lista no seu hashMap

HashMap map = new HashMap();
map.put(carro);

certo ?

o codigo e + ou menos isso eu n testei, msa n importa o código, importa você entender como q faz, certo ?

B

Tá, isso da classe Hashmap não tem mistério…

Meu problema é distinguir o que faz a cada um dos itens do metodo fillReport.

Mas acho que meu pepino ainda nem chegou no fillReport. Porque debugando o treco descobri que o erro ocorre no compileReport!!! Por isso pergunto: qual é o fonte do relatorio? O .jasper ou o .jrxml ? Será que não estou tentando compilar algo que já está compilado?

Vamos rever meus passos, seguindo seu exemplo:

Criar o report

  1. posiciono os 2 textfields sem ligar a nenhuma consulta. Aliás a consulta foi banida.

  2. mudo seus nomes para os nomes dos campos que vou mandar pelo arrayList: placa e marca (nao quero saber a cor)

  3. crio os campos do relatorio la em visualizar campos do relatorio, CUIDANDO LETRAS MAIUSCULAS/MINUSCULAS e para que sejam iguais à header que pretendo mandar via datasource, ou Hashmap, sei lá… O fato é que na minha classe vou ter dois Vectors (ou coisa que os valha), um mono e um bi dimensional. O primeiro com os nomes das colunas e o segundo com os registros a serem impressos.

Pergunto:

  1. Qual a melhor maneira de chamar isso pela classe java?

  2. Consegues me mandar algum exemplo pratico e simples como esse?

Já não tenho palavras suficientes pra te agradecer, rapaz,
imagina se conseguires isso pra esse pobre e perdido iniciante…

Em tempo, vou procurar o tal tutorial do japones que falaste… Mas o nome não me é estranho. Acho que já andei lendo algo dele por aí…

Abraco
Bonissauro[/code]

B

Graças à ajuda dos grupos, descobri que meu problema eram os JAR do IREPORT, que deviam ser adicionados ao classpath de meu projeto.

Obrigado a todos
Bonissauro

PS: Claro que o report ainda nao saiu, mas pelo menos troquei de erro. Hehehehehe… :razz:

Criado 15 de maio de 2006
Ultima resposta 15 de mai. de 2006
Respostas 5
Participantes 2