Ireport+Lista

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…

[code]package ireport;

import java.sql.Connection;
import java.sql.DriverManager;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanArrayDataSource;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.view.JasperViewer;

public class teste {

public static void main(String[] args) {
	String driver = "org.hsqldb.jdbcDriver";
	String url = "jdbc:hsqldb:file:bd/aluminio";
	String user = "sa";
	String password = "";
	JasperReport relatorio = null;
	JasperPrint impressao = null;
	JasperViewer viewer = null;
	
	
	
	
	HashMap parametros = new HashMap();
	ArrayList a= new ArrayList();
	//for(int i=0; i<5; i++){
	a.add(1+"Olá"+"Ui");
	a.add("oi");
	
	//parametros.put("NOME", a.get(i));

	Connection connection = null;
	try {
	Class.forName(driver);
	connection = DriverManager.getConnection(url, user, password);
	relatorio = JasperManager.loadReport("c:/Teste2.jasper");
parametros.put("ID", 5);
	for (int i=0;i<a.size();i++){  
	      
	     parametros.put("NOME",a.get(i));  
	}
	impressao = JasperManager.fillReport(relatorio, parametros, connection);
	
	/* Cria o visualizador de imporessão*/
	viewer = new JasperViewer(impressao, true);
	
	viewer.show();
	
	connection.close();
	} catch (Exception e) {
	e.printStackTrace();
	}}
	
	//}
	
   }[/code]

O que pode tar acontecendo de errado???

Já acertou no Jasper onde vai ficar os parametros que vc está passando?

Coloquei o $P{NOME} no detail do relatório…

E o ID pus na consulta SQL pra retornar os dados de um cliente!

Tou tento usar o List do ireport… mas sem sucesso!

http://www.scribd.com/doc/14811322/Desenvolvendo-Relatorios-Profissionais-Com-iReport-Para-Netbeans-IDE

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.

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!

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…

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).

Fiz esse outro pra chamar tipo um subrelatorio do principal…

[code]package ireport;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanArrayDataSource;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
import net.sf.jasperreports.view.JasperViewer;

public class report {

public static void main(String[] args) throws SQLException, JRException {
	
	List a= new ArrayList();
	//for(int i=0; i<5; i++){
	a.add(1+"Olá"+"Ui");
	a.add("oi");
	//JRBeanCollectionDataSource jr = new JRBeanCollectionDataSource(a);
	JRDataSource jr = new JRBeanArrayDataSource(a.toArray());
	JasperPrint impressao;
	try {
		Map parametros = new HashMap();
		//parametros.put("NOME",a.get(1));
        
                JasperPrint resultado = JasperFillManager.fillReport( "c:\\sub.jasper", parametros, jr );
                JasperViewer.viewReport( resultado, false );

	} catch (JRException e) {
		e.printStackTrace();
	} catch (Exception e){
		System.out.println(e);
	}

	           
	 
	

	}
	
   }

[/code]

Ele imprimi o numero de linhas certos… mas com valores null…

Ola, no seu código tem um probleminha…

		for (int i=0;i&lt;a.size();i++){  
		      
		     parametros.put("NOME",a.get(i));  
		}

como “parametros” é um hashmap vc está sempre sobrescrevendo o parametro nome, ou seja, só vai ficar o ultimo valor>

O eclipse não aceita esta expressão: ArrayList< HashMap><String,Object> a

O correto é

ArrayList&lt;HashMap&gt;&lt;String,Object&gt;&gt;

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.

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…

Oi andre.almeida …

Desculpe a minha ignorancia…

Mas não teria que instanciar não? Tipo…

ArrayList<HashMap<String,Object>> a = new ArrayList();

Isso?

Mas como vou por os elementos no array?
a.add(“Teste1”, java.lang.String);??? Dá erro!

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:

public static void init() {
        try {
            ResultSet resultSetMasterReport = Conexao.executeQuery("select * from produto order by 1");
            
            List listaMasterReport = new ArrayList();
            
            while (resultSetMasterReport.next()) {
                HashMap&lt;String,Object&gt; atributosMasterReports = new HashMap&lt;String,Object&gt;();
                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"));
                
                ResultSet resultSetSubReport = Conexao.executeQuery("select * from item where cd_produto = "
                        +"'"+resultSetMasterReport.getObject("CD_PRODUTO")+"' order by 1");
                
                List listaSubReport = new ArrayList();
                
                while(resultSetSubReport.next()){
                    HashMap&lt;String,Object&gt; atributosSubReports = new HashMap&lt;String,Object&gt;();
                    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);
                }
                
                JRMapCollectionDataSource subDataSource= new JRMapCollectionDataSource(listaSubReport);
        
                
                
                atributosMasterReports.put("SUB_DATA_SOURCE",subDataSource);
                
                listaMasterReport.add(atributosMasterReports);
            }
           
        JRMapCollectionDataSource masterDataSource= new JRMapCollectionDataSource(listaMasterReport);
        
        JasperPrint jasperPrint = JasperFillManager.fillReport("Produtos.jasper",
                    new HashMap(), masterDataSource);

        JasperViewer.viewReport(jasperPrint);
        
        
        String caminhoArquivoPdf = "c:\\relatorio.pdf";
        JasperExportManager.exportReportToPdfFile(jasperPrint, caminhoArquivoPdf);
			String[] exec = { "cmd.exe", "/c", "start", "\"\"",
					"\"" + caminhoArquivoPdf + "\"" };

			Runtime.getRuntime().exec(exec);
        
        
        
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (JRException ex) {
            ex.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }

    }

Já tentou passar o Array completo e no código fazer um interator?
O jasper permite vc fazer código java nele

Evaldo Garcia Paula…

Nunca tentei fazer isso naum… como se faz codigo java no ireport? rsrs

andre.almeida…

Tou tentando usar modificar este teu exemplo pra minha realidade… mas sem sucesso…

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&lt;HashMap&gt; a = new ArrayList&lt;HashMap&gt;();
 
        /** EXEMPLO */
        for(int i =0; i &lt; 10 ; i++){
            HashMap&lt;String, String&gt; teste = new HashMap&lt;String, String&gt;();
            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