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…
publicvoidimprimir(Collectionprodutos)throwsJRException{// Caminho onde está o arquivo .jasperStringcaminhoRelJasper=“C:\Arquivosdeprogramas\Aplicacao\IReport\relatorio.jrxml”;
// Stream com o .jasperInputStreamrelJasper=getClass().getResourceAsStream(caminhoRelJasper);// O datasourceJRBeanCollectionDataSourceds=newJRBeanCollectionDataSource(produtos);// Parametros do relatoriosMapparametros=newHashMap();JasperPrintimpressao=newJasperPrint();try{impressao=JasperFillManager.fillReport(caminhoRelJasper,parametros,ds);JasperViewerviewer=newJasperViewer(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(JRExceptione){System.out.println(e.getMessage());System.out.println("PRINTSTACKTRACE = ");e.printStackTrace();}}
DICA: Sempre post seu código como abaixo, assim fica mais simples pra todos entendermos:
publicvoidimprimir(Collectionprodutos)throwsJRException{// Caminho onde está o arquivo .jasperStringcaminhoRelJasper="C:\Arquivos de programas\Aplicacao\IReport\relatorio.jrxml";// Stream com o .jasperInputStreamrelJasper=getClass().getResourceAsStream(caminhoRelJasper);// O datasourceJRBeanCollectionDataSourceds=newJRBeanCollectionDataSource(produtos);// Parametros do relatoriosMapparametros=newHashMap();JasperPrintimpressao=null;try{impressao=JasperFillManager.fillReport(caminhoRelJasper,parametros,ds);JasperViewerviewer=newJasperViewer(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(JRExceptione){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
andrertd
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!
feltraco
Salve galera…
Seguinte, aki na empresa nos implementamos o datasource
fica mais simples, e mais orientado do que passar por HashMap
a implementação é muito simples, vc pode passar objetos, atributos, listas etc…
fiz um artigo e coloquei nesse blog…
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
andrertd
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
publicvoidimprimir(Collectionprodutos)throwsJRException{Mapparameters=newHashMap();JasperDesignjasperDesign=JasperManager.loadXmlDesign("C:\Arquivos de programas\IReport\venda.jrxml");negocio.GerarRelatoriods=newnegocio.GerarRelatorio(produtos);JasperReportjasperReport=JasperManager.compileReport(jasperDesign);JasperPrintjasperPrint=JasperManager.fillReport(jasperReport,parameters,ds);JasperViewer.viewReport(jasperPrint,false);}
publicclassGerarRelatorioimplementsJRDataSource{privateintcontador=0;privateCollectionprodutos=newVector();/** Creates a new instance of GerarRelatorio */publicGerarRelatorio(Collectionvetor){super();this.produtos=vetor;}publicbooleannext()throwsJRException{this.contador++;if(this.contador==1)returntrue;returnfalse;}publicObjectgetFieldValue(JRFieldfield)throwsJRException{if(field!=null)if(field.getName().equalsIgnoreCase("lista_produtos"))returnnewJRBeanCollectionDataSource(Arrays.asList(this.produtos));returnnull;}}
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
andrertd
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
andrertd
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
andrertd
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(newDate(),newDate());StringcaminhoRelJasper="d:\RelatorioFeitos.jasper";InputStreamrelJasper=getClass().getResourceAsStream(caminhoRelJasper);JRDataSourceds=newJRMapCollectionDataSource(documentosGerados);//JRDataSource ds = new JRMapArrayDataSource(documentosGerados);JasperPrintimpressao=null;try{//InputStream relatorioPeriodo = new FileInputStream(new File(caminhoRelJasper));Mapparametros=newHashMap();impressao=JasperFillManager.fillReport(caminhoRelJasper,parametros,ds);JasperViewerviewer=newJasperViewer(impressao,true);viewer.setVisible(true);}catch(Exceptione){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
lico
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
rafa8888
oi ai esta meu codigo
importjava.io.*;importjava.util.HashMap;importjava.util.ArrayList;importjava.util.List;importjava.util.Map;//import javax.swing.JOptionPane; publicclassDados{//"args" é um array de String onde cada elemento é um argumento passado pela linha de comando momento na "inicialização" da execução. publicstaticvoidmain(String[]args){Map<Integer,List<String>>mapLines=newHashMap<Integer,List<String>>();try{//leitura do ficheiro, prepara-o para ser aberto BufferedReaderin=newBufferedReader(newFileReader("conteudo.txt"));Stringstr;inti=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=newArrayList<String>();Stringwords[]=str.split(";");for(Stringword:words){values.add(word);System.out.println(word);}mapLines.put(i,values);i++;}}// fim do while in.close();}catch(IOExceptione){// 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=newHashMap<Integer,List<String>>();for(Integerkey:m.keySet()){for(Stringword:m.get(key)){System.out.println(word);}}}publicstaticvoidmain2(String[]args){Map<Integer,List<String>>mapLines=newHashMap<Integer,List<String>>();try{BufferedReaderin2=newBufferedReader(newFileReader("conteudo2.txt"));Stringstr;inti=0;while((str=in2.readLine())!=null){if(str.startsWith("#")){str="";}else{//esta a dividir a frase em varias strings List<String>values=newArrayList<String>();Stringwords[]=str.split(" ");for(Stringword:words){values.add(word);System.out.println(word);}mapLines.put(i,values);i++;}}// fim do while in2.close();}catch(IOExceptione){// 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=newHashMap<Integer,List<String>>();for(Integerkey:m.keySet()){for(Stringword:m.get(key)){System.out.println(word);}}}}