JasperReports e Collection?

Estou tentando mandar um ArrayList para um relatório mas não estou conseguindo…

vejam.

    public void imprimeEtiquetas() throws JRException{
        String arquivo = "relatorios/Etiquetas.jasper";
        java.io.InputStream file = getClass().getClassLoader().getResourceAsStream(arquivo);
        int qtd = Integer.parseInt(qtdEtiqueta.getText());
        int multiplo = 0;
        int totalEmbalagem = 0;
        if(unidVenda.getSelectedItem().toString().equals("DZ")){
            multiplo = 12;
            totalEmbalagem = Integer.parseInt(qtdEmbalagem.getText()) * multiplo;            
        }
        ArrayList lista = new ArrayList();
        for(int x = 0; x < qtd; x++){
            lista.add(refEtiqueta.getText());
            lista.add(corEtiqueta.getText());
            lista.add(totalEmbalagem);
        }

        Map parametros = new HashMap();
        JRDataSource dados = new JRBeanCollectionDataSource(lista);
        JREmptyDataSource dataSource = new JREmptyDataSource();
        JasperPrint printer = JasperFillManager.fillReport(file, parametros, dataSource);
        JRViewer view = new JRViewer(printer);
        JDialog dialog = new JDialog();
        dialog.getContentPane().add(view); //adiciono o preview
        new AbreRelatorios().abreRelatorio(dialog);
    }

O formulário esta abrindo blzinha, mas recebendo " null ", quero saber como eu pego os valores do ArrayList no relatório ?? Eu uso Fields ou Parameters ?

obrigado.

Fernando

O que deve estar acontecendo é que tu estás passando um Data Source vazio para o relatório.

JREmptyDataSource dataSource = new JREmptyDataSource(); JasperPrint printer = JasperFillManager.fillReport(file, parametros, dataSource);

Aqui tu deverias passar a variável dados, e no ireport tu terás de criar fields com os mesmos nomes
dos atributos de lista.

JRDataSource dados = new JRBeanCollectionDataSource(lista); JasperPrint printer = JasperFillManager.fillReport(file, parametros, dados );

Opa Rafa, depois q postei q vi o q tava fazendo…

Como assim “nomes de atributos de lista” ???

obrigado

Bom, quando eu preciso fazer isto que tu estás precisando agora, primeiro eu crio uma classe que
no teu caso esta teria três atributos, e aí sim tua lista seria do tipo ArrayList, e aí os fields
do ireport teriam o mesmo nome que tu dastes para a classe criada…

Abraço.

Mas no caso estou apenas enviando o ArrayList contendo getText() dos meus campos…

por exemplo


ArrayList lista = new ArrayList();
lista.add(nome.getText());
lista.add(sobreNome.getText());

Para conseguir pegar esses valores no relatorio como seria ??? Eu teria q add Fields ou Parameters ???

obrigado

Fernando, para tu acessar estes valores, como tu estás passando via Data Source
tem que ser com os fields, não sei como tu vai acessar estes sem que seja pela maneira
que te expliquei anteriormente.

Abraço,

Fala Fernando…

é isso que o rafa tá dizendo pra não fazeres. Trabalhas com o ArrayList “tipado” usando o poder da Generics.

Ao invés de passar uma Lista contendo os campos da Tela, vais popular uma entidade Pessoa, que será um POJO, com os atributos que colocarás no relatório

public class Pessoa{

    private String nome;
    private String sobreNome;

    public String getNome() {return nome;}
    public void setNome(String nome) {this.nome = nome;}

    
    public String getSobreNome() {return sobreNome;}
    public void setSobreNome(String sobreNome) {this.sobreNome = sobreNome;}
}

Aí ao invés de ArrayList lista = new ArrayList();

farás Pessoa pessoa = new Pessoa(); pessoa.setNome(tfNome.getText()); pessoa.setSobreNome(tfSobreNome.getText()); ArrayList<Pessoa> lista = new ArrayList<Pessoa>(); lista.add(pessoa);

Espero que tenha ficado claro pra você o que foi feito… Isso evita Ns problemas futuros com código e o Principal deles é teres a certeza que dentro do teu ArrayList não vai haver Objetos “Indesejáveis” quando receberes em algum Parâmetro…

Abs [] e bons estudos

PS: Não sei se cometi alguma garfe… digitei esse código aqui, não testei.

Eu entendi o esquema q taum falando, mas eh o seguinte eu ja tenho a classe pronta to usando Swing+AWT, e estou pegando os valores para impressao dentro da propria classe em um metodo.

veja:

//metodo que imprime
public void imprimeEtiquetas() throws JRException{
        String arquivo = "relatorios/Etiquetas.jasper";
        java.io.InputStream file = getClass().getClassLoader().getResourceAsStream(arquivo);
        int qtd = Integer.parseInt(qtdEtiqueta.getText());
        int multiplo = 0;
        int totalEmbalagem = 0;
        if(unidVenda.getSelectedItem().toString().equals("DZ")){
            multiplo = 12;
            totalEmbalagem = Integer.parseInt(qtdEmbalagem.getText()) * multiplo;            
        }

        //String referEtiq = refEtiqueta.getText();
        ArrayList lista = new ArrayList();
        for(int x = 0; x < qtd; x++){
            lista.add(refEtiqueta.getText());
            lista.add(corEtiqueta.getText());
            lista.add(totalEmbalagem);
        }

        Map parametros = new HashMap();
        JRDataSource dados = new JRBeanCollectionDataSource(lista);
        JasperPrint printer = JasperFillManager.fillReport(file, parametros, dados);
        JRViewer view = new JRViewer(printer);
        JDialog dialog = new JDialog();
        dialog.getContentPane().add(view);
        new AbreRelatorios().abreRelatorio(dialog);
    }

//botao que chama o metodo de impressao
private void imprimirActionPerformed(java.awt.event.ActionEvent evt) {                                         
        try {
            imprimeEtiquetas();
        } catch (JRException ex) {
            Logger.getLogger(EtiquetaDigitacao.class.getName()).log(Level.SEVERE, null, ex);
        }
}               

O problema eh q naum sei como pegar os valores do ArrayList no JasperReports, num sei se crio Fields ou Parameters, e com quais nomes…

obrigado

Opa…consegui resolver.

Fiz assim.

parametros.put(“NOME_PARAMETRO”, lista.get(0));

ja era…

obrigado a todos