Collection no ireport

18 respostas
A

bom dia rapaziada tudo blz.;;

estou precisando de alguma ajuda para fazer relatorios usando collection… procurei alguns tutoriais mas não achei nenhum q resolvesse meu problema… estou tetando fazer um relatorio onde eu exiba os kits vendidos em 1 mes… só q cada kit é um conjunto de outros produtos… fiz o metodo java q desmembra todos esses kits e adiciono eles em uma colection de objetos… agora como é q eu configura dentro do ireport para ele pega os dados do JRBeanCollectionDataSource e não da conexão com o sql??? c alguem souber ou tiver algum tutorial…

o meu metodo java q chama o relatorio é essae por favor c puderem ver c é isso mesmo a classe…

public void imprimir(Collection produtos) throws JRException{

// Caminho onde está o  arquivo .jasper

String caminhoRelJasper = C:\Arquivos de programas\Aplicacao\IReport\relatorio.jrxml;
// Stream com o .jasper
    InputStream relJasper = getClass().getResourceAsStream(caminhoRelJasper);
    
    // O datasource
    JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(produtos);
    
    // Parametros do relatorios
    Map parametros = new HashMap();
    
    JasperPrint impressao = new JasperPrint();
    
    try {            
        impressao = JasperFillManager.fillReport(caminhoRelJasper ,parametros, ds);
        
        JasperViewer viewer = new JasperViewer(impressao, true);
        viewer.setVisible(true);
        //Nome e diretorio onde vai ser gerado o PDF
        // String destFileName  ="C:\\geraPDF.pdf";
        // JasperExportManager.exportReportToPdfFile(impressao,destFileName);
        //JasperExportManager.exportReportToHtmlFile(impressao,destFileNameHTML);
    } catch (JRException e) {
        System.out.println(e.getMessage());
        System.out.println("PRINTSTACKTRACE = ");
        e.printStackTrace();
    }
    
}

18 Respostas

RenataFA

DICA: Sempre post seu código como abaixo, assim fica mais simples pra todos entendermos:

public void imprimir(Collection produtos) throws JRException{
	// Caminho onde está o arquivo .jasper
	String caminhoRelJasper = "C:\Arquivos de programas\Aplicacao\IReport\relatorio.jrxml";

	// Stream com o .jasper
	InputStream relJasper = getClass().getResourceAsStream(caminhoRelJasper);

	// O datasource
	JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(produtos);

	// Parametros do relatorios
	Map parametros = new HashMap();

	JasperPrint impressao = null;

	try {
		impressao = JasperFillManager.fillReport(caminhoRelJasper, parametros, ds);

		JasperViewer viewer = new JasperViewer(impressao, true);
		viewer.setVisible(true);
		// Nome e diretorio onde vai ser gerado o PDF
		// String destFileName ="C:\geraPDF.pdf";
		// JasperExportManager.exportReportToPdfFile(impressao,destFileName);
		// JasperExportManager.exportReportToHtmlFile(impressao,destFileNameHTML);
	} catch (JRException e) {
		System.out.println(e.getMessage());
		System.out.println("PRINTSTACKTRACE = ");
		e.printStackTrace();
	}
}

Bom, eu faço algo parecido com vc, mas uso um objeto diferente. Tenta ai pra ver se dá certo, eu mudei esta linha:

JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(produtos);

Por esta:

JRDataSource ds = new JRMapArrayDataSource(aLinhas);

No meu caso, aLinhas é meu Collection, é um HashMap[]. Veja se funciona no seu caso.

Boa sorte! :wink:

A

entao… eu acho q o problema não é no codigo java e sim na criação do relatorio dentro do ireport… eu não estou conseguindo fazer com q os dados transmitidos sejam exibidos… vc tem ideia de como faço para criar o relatorio pegando a collection q passei,::?? tenho q criar alguma função especial para q ele possa exibir os dados???

RenataFA

Bem, eu não faço nada de especial.

Apenas vou no iReport e crio os fields que serão gerados pelo meu DataSource, com os tipos corretos, etc. Então eu uso esses fields pra preencher os campos no meu relatório.

E claro, deixo sem nenhuma instrução SQL no iReport.

O nome dos fields que crio no iReport são exatamente os mesmos nomes que eu uso nas chaves da minha HashMap.

Só isso e tudo funciona. Tente ai! :wink:

feltraco

Salve galera…

Seguinte, aki na empresa nos implementamos o datasource
fica mais simples, e mais orientado do que passar por HashMap :smiley:

a implementação é muito simples, vc pode passar objetos, atributos, listas etc…
fiz um artigo e coloquei nesse blog…

vejam e me digam o que acham da solução…

http://blog.apollo-ti.com/?p=8

FLwS…

Quinger

parabéns!

mto bom o tutorial…

RenataFA

feltraco:
Salve galera…

Seguinte, aki na empresa nos implementamos o datasource
fica mais simples, e mais orientado do que passar por HashMap :smiley:

a implementação é muito simples, vc pode passar objetos, atributos, listas etc…
fiz um artigo e coloquei nesse blog…

vejam e me digam o que acham da solução…

http://blog.apollo-ti.com/?p=8

FLwS…

Então, mas não passo por HashMap. Eu crio um DataSource a partir de um HashMap pq era o Collection que eu tinha no momento…

feltraco

Ok…
achei que vc estava passando tudo por HashMap
sem usar DS…

já vi bastante disso…

FLwS

A

então rapaziada... eu não manjo muito de ireport... mas tentei faze o q estava no tutorial.. mas está dando um erro q eu não sei o q é... vou postar o meu codigo e o erro... a.. dentro do ireport eu tenho no relatorio principal somente a chamada a um sub relatorio.. o sub relatorio tenho 2 fields o codigo_produto e o quantidade.. c alguem puder me ajudar

public void imprimir(Collection produtos) throws JRException{
        Map parameters = new HashMap();
        JasperDesign jasperDesign = JasperManager.loadXmlDesign("C:\Arquivos de programas\IReport\venda.jrxml");
        
        negocio.GerarRelatorio ds = new negocio.GerarRelatorio(produtos);
        
        JasperReport jasperReport = JasperManager.compileReport(jasperDesign);
        JasperPrint jasperPrint = JasperManager.fillReport(jasperReport, parameters, ds);
        JasperViewer.viewReport(jasperPrint, false);
        
    }
public class GerarRelatorio implements JRDataSource{
    private int contador = 0;
    private Collection produtos = new Vector();
    
    /** Creates a new instance of GerarRelatorio */
    public GerarRelatorio(Collection vetor) {
        super();
        this.produtos = vetor;
    }
    
    public boolean next() throws JRException {
        this.contador++;
        if (this.contador == 1)
            return true;
        return false;
    }
    
    public Object getFieldValue(JRField field) throws JRException {
      if(field != null)
        if (field.getName().equalsIgnoreCase("lista_produtos"))
            return new JRBeanCollectionDataSource(Arrays.asList(this.produtos));
      
        return null;
    }    
}

Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethodException: Unknown property 'codigo_produto'
at org.apache.commons.beanutils.PropertyUtils.getSimpleProperty(PropertyUtils.java:1157)
at org.apache.commons.beanutils.PropertyUtils.getNestedProperty(PropertyUtils.java:754)
at org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils.java:783)
at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getBeanProperty(JRAbstractBeanDataSource.java:104)
at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getFieldValue(JRAbstractBeanDataSource.java:93)
at net.sf.jasperreports.engine.data.JRBeanCollectionDataSource.getFieldValue(JRBeanCollectionDataSource.java:104)
at net.sf.jasperreports.engine.fill.JRFillDataset.setOldValues(JRFillDataset.java:791)
at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:755)
at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1019)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:126)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:758)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:685)
at net.sf.jasperreports.engine.fill.JRFillSubreport.fillSubreport(JRFillSubreport.java:498)
at net.sf.jasperreports.engine.fill.JRSubreportRunnable.run(JRSubreportRunnable.java:63)
at net.sf.jasperreports.engine.fill.JRThreadSubreportRunner.run(JRThreadSubreportRunner.java:137)
at java.lang.Thread.run(Thread.java:619)

feltraco

deixa eu ver se entendi

codigo_produto e quantidade estao dentro da lista de produtos ?
se sim, é so vc passar essa lista como parametro para o sub-relatorio

caso nao, vc tera que declarar esses dois fields no seu GerarRelatorio, assim como esta para a lista
e entao passar esses dados como parametro para o sub-relatorio…

qq coisa estamos ai…

A

o codigo do produto e a quantidade está dentro do sub relatorio… e dentro da collection está um objetos cons os atributos codigo_produto e quantidade… só q a hora q eu executo a aplicação java… ele da aquele erro q passei… informando q não foi possivel retornar o valor do codigo_produto… o q será q é?

feltraco

quando vc passa akela lista ali no data source, vc esta passando para o relatorio
principal, o sub nao sabe da existencia dessa lista

para resolver isso vc essa lista como dataSource do sub relatorio
botao direito no sub, na aba Subrelatorio, selecione Usar um DataSource
e entao selecione o field correspondente a lista…

e pronto…seus problemas acabaram… rs rs rs rs

A

eu já fiz isso… dentro do principal no icone q chama o sub relatorio. eu coloca pra usar a conexão por datasurce e informo o data surce a ele… e nos parametro q são enviados ao outro relatorio e crio um parametro e passa o field q está armazenado o meu vetor… mas mesmo assim da aquele erro q postei anteriormete… dentro o ireport da igual a aquele codigo q está naquele tutorial… agora eu não sei c eu passei meio despercebino e não configurei alguma coisa…

feltraco

no tutorial eu coloquei uma coisa que nao precisa,
vc nao precisa colocar como datasource e como parametro…

no principal vc declara um fiel, coloca ele no seu datasource, retornando um JRbeanCollectionDataSource
e seta ele como data souce do seu subrelatorio…

caso nao consiga e quiser me enviar o relatorio pra eu dar uma olhada
fique a vontade…

Boa sorte… e estamos ai…

A

consegui gerar o relatorio… valeu mesmo pela ajuda…

feltraco

precisando estamos ai

FLwS

fabioebner

Bom dia.. estou tentando fazer o mesmo q vcs porem recebo o seguinte erro:

java.lang.ClassCastException: br.com.dnasolution.entity.TbIndicadorDocumento cannot be cast to java.util.Map at net.sf.jasperreports.engine.data.JRMapCollectionDataSource.next(JRMapCollectionDataSource.java:79) at net.sf.jasperreports.engine.fill.JRFillDataset.advanceDataSource(JRFillDataset.java:830) at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:748) at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1422) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:111) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:879) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:801) at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:89) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:601) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:517)

o meu codigo esta assim:
Collection<TbIndicadorDocumento> documentosGerados;
    documentosGerados = indicadorDocumentoFACADE.getDocumentoByData(new Date(), new Date());


    String caminhoRelJasper = "d:\RelatorioFeitos.jasper";
    InputStream relJasper = getClass().getResourceAsStream(caminhoRelJasper);
    JRDataSource ds = new JRMapCollectionDataSource(documentosGerados);


    //JRDataSource ds = new JRMapArrayDataSource(documentosGerados);
    JasperPrint impressao = null;
    try {
        //InputStream relatorioPeriodo = new FileInputStream(new File(caminhoRelJasper));
          Map parametros = new HashMap();
           impressao = JasperFillManager.fillReport(caminhoRelJasper, parametros, ds);
          JasperViewer viewer = new JasperViewer(impressao, true);
         viewer.setVisible(true);
    } catch (Exception e) {
        e.printStackTrace();
    }

e o meu metodo: getDocumentoByData ele recupera no banco os documentos que foram lavrados em uma determinada data (me retorna uma entity preenchida.

L

Gostaria de ler esse artigo ou tutorial, mas o blog esta fora do ar no momento, alguem pode me passar uma copia???

Aguardo contado

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 28 de janeiro de 2008
Ultima resposta 27 de jun. de 2011
Respostas 18
Participantes 7