Ireport+Lista

29 respostas
M

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

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();
		}}
		
		//}
		
	   }

O que pode tar acontecendo de errado???

29 Respostas

E

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

M

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!

E

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.

M

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

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

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

Fiz esse outro pra chamar tipo um subrelatorio do principal..

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);
		}

		           
		 
		
	
		}
		
	   }

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

L

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>

M

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

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.

M

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

Oi andre.almeida …

Desculpe a minha ignorancia…

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

M

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

Isso?

M

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

A

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();
        }

    }
E

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

M

Evaldo Garcia Paula…

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

M

andre.almeida…

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

L

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

M

leandrolw aparecem 10 linhas null…

L

Va até seu relátorio e veja se o field esta com o mesmo nome da chave do hashmap

M

No relatorio eu só pus $P{NOME}…

Se eu colocar $F{NOME} não compila…

L

Vc esta usando qual versão do ireport?

M

3.5.3

Field not found: $F{NOME}

M

Só lembrando que no relatório num fiz nenhuma conexão…

Só tem o relatório em branco com o $F{NOME}

M

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…

acho q é isso… vou testar e depois comento aki…

M

Pro que eu quero ainda nm seu certo.....

public class Teste2 {
	

	public static void main(String[] args) {
		
		ArrayList<String[]> lista = new ArrayList();
		lista.add(new String[]{"Marciano","José"});
		new report().gera(lista);
	}
		
   }
public class report {

	
		public void gera(ArrayList array){
		  List<HashMap> a = new ArrayList<HashMap>();
		    
		    /** EXEMPLO */
		    for(int i =0; i < array.size() ; i++){
		        HashMap<String, String> teste = new HashMap<String, String>();
		        teste.put("nome", (String) array.get(i));
		        a.add(teste);
		    }
		   
		    JRDataSource jr = new JRMapCollectionDataSource(a);
		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);
		}

		           
		 
		
	
		}
		
	   }
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.String;
	at ireport.report.gera(report.java:39)
	at ireport.Teste2.main(Teste2.java:29)
M

Estes problemas foram resulvidos… mas surgiu mais um… hehehe

Quando chamo ambos os relatorios separados eles rodam blz… mas quando inserir o subrelatorio no relatorio, os valores do sub aparecem null…

Obs. Inseri no relatorio em detail um “subreport” e indiquei o caminho do subrelatório…

J

marthian_2:
Estes problemas foram resulvidos… mas surgiu mais um… hehehe

Quando chamo ambos os relatorios separados eles rodam blz… mas quando inserir o subrelatorio no relatorio, os valores do sub aparecem null…

Obs. Inseri no relatorio em detail um “subreport” e indiquei o caminho do subrelatório…

mesmo passando um List<HashMap<String,Object>> como DataSource é necessário montar o SQL no Ireport ? Grato.

Criado 11 de agosto de 2009
Ultima resposta 30 de mar. de 2010
Respostas 29
Participantes 5