Pessoal tou tentando varrer um array e imprimir num relatorio ireport.. mas ele so imprimi o ultimo elemento do array....
Segue o código abaixo...
packageireport;importjava.sql.Connection;importjava.sql.DriverManager;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.Iterator;importjava.util.Map;importnet.sf.jasperreports.engine.JRDataSource;importnet.sf.jasperreports.engine.JasperExportManager;importnet.sf.jasperreports.engine.JasperFillManager;importnet.sf.jasperreports.engine.JasperManager;importnet.sf.jasperreports.engine.JasperPrint;importnet.sf.jasperreports.engine.JasperReport;importnet.sf.jasperreports.engine.data.JRBeanArrayDataSource;importnet.sf.jasperreports.engine.data.JRBeanCollectionDataSource;importnet.sf.jasperreports.engine.design.JasperDesign;importnet.sf.jasperreports.view.JasperViewer;publicclassteste{publicstaticvoidmain(String[]args){Stringdriver="org.hsqldb.jdbcDriver";Stringurl="jdbc:hsqldb:file:bd/aluminio";Stringuser="sa";Stringpassword="";JasperReportrelatorio=null;JasperPrintimpressao=null;JasperViewerviewer=null;HashMapparametros=newHashMap();ArrayLista=newArrayList();//for(int i=0; i<5; i++){a.add(1+"Olá"+"Ui");a.add("oi");//parametros.put("NOME", a.get(i));Connectionconnection=null;try{Class.forName(driver);connection=DriverManager.getConnection(url,user,password);relatorio=JasperManager.loadReport("c:/Teste2.jasper");parametros.put("ID",5);for(inti=0;i<a.size();i++){parametros.put("NOME",a.get(i));}impressao=JasperManager.fillReport(relatorio,parametros,connection);/* Cria o visualizador de imporessão*/viewer=newJasperViewer(impressao,true);viewer.show();connection.close();}catch(Exceptione){e.printStackTrace();}}//}}
Dá uma olhada ae, consegui fazer os meus relatórios com esse guia, quando você executa uma consulta no banco, o Jasper já fica com o os campos pré-definidos, é adicionar um text e clicar com o botão direito, e edit expression.
M
marthian_2
Vou da uma olhada sim…
Mas é que tenho duas fontes de dados…
Uma pelo BD que está funcionando blz e outra por um ArrayList que só aparece o último elemento…
Vou ver o material e posto aqui o resultado!
Vlw!
M
marthian_2
A apostila não me ajudou muito não…
Quero varrer o meu ArrayList e fazer com que ele seja exibido em forma de linhas…
A
andre.almeida
Tenta o seguinte:
Ao invés de ArrayList, use ArrayList< HashMap<String,Object> >;
Funciona assim:
Cria um ArrayList, onde cada valor do teu Array, possui uma lista de valores, que serao resgatados
no iReport pela chave, e mostrara o valor (String é a chave, e object o valor).
M
marthian_2
Fiz esse outro pra chamar tipo um subrelatorio do principal..
packageireport;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.InputStream;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importnet.sf.jasperreports.engine.JRDataSource;importnet.sf.jasperreports.engine.JRException;importnet.sf.jasperreports.engine.JasperCompileManager;importnet.sf.jasperreports.engine.JasperFillManager;importnet.sf.jasperreports.engine.JasperManager;importnet.sf.jasperreports.engine.JasperPrint;importnet.sf.jasperreports.engine.JasperReport;importnet.sf.jasperreports.engine.data.JRBeanArrayDataSource;importnet.sf.jasperreports.engine.data.JRBeanCollectionDataSource;importnet.sf.jasperreports.engine.design.JasperDesign;importnet.sf.jasperreports.engine.util.JRLoader;importnet.sf.jasperreports.engine.xml.JRXmlLoader;importnet.sf.jasperreports.view.JasperViewer;publicclassreport{publicstaticvoidmain(String[]args)throwsSQLException,JRException{Lista=newArrayList();//for(int i=0; i<5; i++){a.add(1+"Olá"+"Ui");a.add("oi");//JRBeanCollectionDataSource jr = new JRBeanCollectionDataSource(a);JRDataSourcejr=newJRBeanArrayDataSource(a.toArray());JasperPrintimpressao;try{Mapparametros=newHashMap();//parametros.put("NOME",a.get(1));JasperPrintresultado=JasperFillManager.fillReport("c:\\sub.jasper",parametros,jr);JasperViewer.viewReport(resultado,false);}catch(JRExceptione){e.printStackTrace();}catch(Exceptione){System.out.println(e);}}}
Ele imprimi o numero de linhas certos.. mas com valores null...
como “parametros” é um hashmap vc está sempre sobrescrevendo o parametro nome, ou seja, só vai ficar o ultimo valor>
M
marthian_2
O eclipse não aceita esta expressão: ArrayList< HashMap><String,Object> a
A
andre.almeida
O correto é
ArrayList<HashMap><String,Object>>
edit:
por algum motivo aqui no guj nao da pra escrever na sequencia correta …
Mas é so colocar o HashMaP<String,Object> detro do "<>" do ArrayList.
M
marthian_2
Mas leandrolw como vou iterar o meu array sem por o a.get(i)? se colocar a.get(0) ele só vai me retornar o primeiro…
M
marthian_2
Oi andre.almeida …
Desculpe a minha ignorancia…
Mas não teria que instanciar não? Tipo…
M
marthian_2
ArrayList<HashMap<String,Object>> a = new ArrayList();
Isso?
M
marthian_2
Mas como vou por os elementos no array? a.add(“Teste1”, java.lang.String);??? Dá erro!
A
andre.almeida
Abaixo segue um exemplo completo de relatorio com JRDataSource,
com Um masterRelatorio (principal) e um subRelatorio.
Esses valores vieram diretamente de um resultSet da consulta na base.
segue:
publicstaticvoidinit(){try{ResultSetresultSetMasterReport=Conexao.executeQuery("select * from produto order by 1");ListlistaMasterReport=newArrayList();while(resultSetMasterReport.next()){HashMap<String,Object>atributosMasterReports=newHashMap<String,Object>();atributosMasterReports.put("CD_PRODUTO",resultSetMasterReport.getObject("CD_PRODUTO"));atributosMasterReports.put("NOME",resultSetMasterReport.getObject("NOME"));atributosMasterReports.put("DESCRICAO",resultSetMasterReport.getObject("DESCRICAO"));atributosMasterReports.put("FIGURA",resultSetMasterReport.getObject("FIGURA"));atributosMasterReports.put("CATEGORIA",resultSetMasterReport.getObject("CATEGORIA"));ResultSetresultSetSubReport=Conexao.executeQuery("select * from item where cd_produto = "+"'"+resultSetMasterReport.getObject("CD_PRODUTO")+"' order by 1");ListlistaSubReport=newArrayList();while(resultSetSubReport.next()){HashMap<String,Object>atributosSubReports=newHashMap<String,Object>();atributosSubReports.put("CD_ITEM",resultSetSubReport.getObject("CD_ITEM"));atributosSubReports.put("DESCRICAO",resultSetSubReport.getObject("DESCRICAO"));atributosSubReports.put("PRECO",resultSetSubReport.getObject("PRECO"));atributosSubReports.put("QTD_ESTOQUE",resultSetSubReport.getObject("QTD_ESTOQUE"));atributosSubReports.put("STATUS",resultSetSubReport.getObject("STATUS"));listaSubReport.add(atributosSubReports);}JRMapCollectionDataSourcesubDataSource=newJRMapCollectionDataSource(listaSubReport);atributosMasterReports.put("SUB_DATA_SOURCE",subDataSource);listaMasterReport.add(atributosMasterReports);}JRMapCollectionDataSourcemasterDataSource=newJRMapCollectionDataSource(listaMasterReport);JasperPrintjasperPrint=JasperFillManager.fillReport("Produtos.jasper",newHashMap(),masterDataSource);JasperViewer.viewReport(jasperPrint);StringcaminhoArquivoPdf="c:\\relatorio.pdf";JasperExportManager.exportReportToPdfFile(jasperPrint,caminhoArquivoPdf);String[]exec={"cmd.exe","/c","start","\"\"","\""+caminhoArquivoPdf+"\""};Runtime.getRuntime().exec(exec);}catch(IOExceptionex){ex.printStackTrace();}catch(JRExceptionex){ex.printStackTrace();}catch(SQLExceptionex){ex.printStackTrace();}}
E
Evaldo_Garcia_Paula
Já tentou passar o Array completo e no código fazer um interator?
O jasper permite vc fazer código java nele
M
marthian_2
Evaldo Garcia Paula…
Nunca tentei fazer isso naum… como se faz codigo java no ireport? rsrs
M
marthian_2
andre.almeida…
Tou tentando usar modificar este teu exemplo pra minha realidade… mas sem sucesso…
L
leandrolw
como fazer para resolver seu problema.
mude seu datasource para JRMapCollectionDataSource que recebe uma Collection
o seu código tem que ficar mais ou menos assim:
List<HashMap> a = new ArrayList<HashMap>();
/** EXEMPLO */
for(int i =0; i < 10 ; i++){
HashMap<String, String> teste = new HashMap<String, String>();
teste.put("teste", "Ola "+i);
a.add(teste);
}
JRDataSource jr = new JRMapCollectionDataSource(a);
Inserir em cada posição do ArrayList um map com a chave e valor, apos ir no iReporte e criar um Field com o mesmo nome da chave e do mesmo tipo que o valor, ou seja,
se o seu map for String a chave e Integer o Valor vc terá que criar um Field com o nome da chave e o Tipo Integer.
Tenta ai, assim funciona…
Pore vc não tera acesso a base de dados
M
marthian_2
leandrolw aparecem 10 linhas null…
L
leandrolw
Va até seu relátorio e veja se o field esta com o mesmo nome da chave do hashmap
M
marthian_2
No relatorio eu só pus $P{NOME}…
Se eu colocar $F{NOME} não compila…
L
leandrolw
Vc esta usando qual versão do ireport?
M
marthian_2
3.5.3
Field not found: $F{NOME}
M
marthian_2
Só lembrando que no relatório num fiz nenhuma conexão…
Só tem o relatório em branco com o $F{NOME}
M
marthian_2
Ufa… Consegui…
Lá em conexões na aba JavaBeans DataSource adicionai um bean que tinha o campo nome… aí compilei e deu certo…
Agora vou ter que criar uma bean que contenha os campos do meu array…