JRBeanCollectionDataSource Com varios Objetos

Java

26/12/2011

Ola boa tarde, estou desenvolvendo um relatorio ( orcamento de produtos), o meu sistema erp gera um arquivo txt com uma estrtura fixa com todos os dados, ae chamo um aplicativo java que le esse txt e comeco a montar os dados para o pdf, para cada parte do meu orcamento eu tenho uma classe, por exemplo tenho a classe empresa, cliente, dados do orcamento, produtos, totais entre outros e uma classe q tem todas essas outras classes porem estou com um problema na minha logica na parte de produtos.. eu recebo n produtos separados por ý.. segue exemplo:
public class Produtos {
	private String pro_codigo = ;
	private String pro_descricao = ;
        demais campos omitidos
        todos os getters and seters
}
public class JOrcamento {
	
	private DadosOrcamento dadosOrcamento;
	private Cliente cliente;
	private Loja loja;
	private Produtos produtos;
        private List<Produtos> produtos;
public Produtos getProdutos() {
		return (Produtos) produtos;
	}
public void setProdutos(List<Produtos> listaprodutos) {
		this.produtos = (List<Produtos>) listaprodutos;
	}
       demais campos omitidos
        todos os getters and seters
}
public class principal {
DadosOrcamento dadosorcamento = new DadosOrcamento();
		dadosorcamento.setModelo(dados[Constantes.EMAIL$MODELO]);
		dadosorcamento.setCaminho(dados[Constantes.EMAIL$CAMINHO]);
.....
.....
....
Produtos produtotemp = new Produtos();
produtotemp.setPro_codigo(dados[Constantes.EMAIL$PRO_CODIGO]);
		produtotemp
produtotemp.setPro_descricao(dados[Constantes.EMAIL$PRO_DESCRICAO]);
String[] array_codigo = produtotemp.getPro_codigo().split(
				Character.toString(Constantes.VAL_MARK));
int TotalProd = Integer.parseInt(array_item.length + ) - 1;

List<Produtos> listaprodutos = (List<Produtos>) new Produtos();
		for (int prod = 0; prod <= TotalProd; prod++) {
			Produtos produto = new Produtos();
			produto.setPro_codigo(array_codigo[prod]);
			produto.setPro_descricao(array_descricao[prod]);
			listaprodutos.add(produto);
		}


JOrcamento jOrcamento = new JOrcamento();
jOrcamento.setDadosOrcamento(dadosorcamento);
jOrcamento.setProdutos(listaprodutos);
Collection<JOrcamento> lista = new ArrayList<JOrcamento>();
lista.add(jOrcamento);
JRDataSource jrds = new JRBeanCollectionDataSource(lista);
}

Dessa forma pelo Ireport acesso todos os dados exeto quando eu incluo a lista de produtos, ae ele da erro
No Ireport eu faco $F.getLj_razao_social() para pegar os dados
Porem a parte de produtos nao consigo achar uma solucao
Desde de já agracedo a todos e boas festas
Alberto Leal

Alberto Leal

Curtidas 0

Respostas

Robson Teixeira

Robson Teixeira

26/12/2011

na sua classe possui o metodo getLj_razao_social() escrito desse jeito???? se for altere no seu relatorio para $F{loja.lj_razao_social}.

espero ter ajudado.
att
robson
GOSTEI 0
Davi Costa

Davi Costa

26/12/2011

Espero que possa ajudar:(o primeiro é bem prático)

http://www.franciscosouza.com.br/2009/07/22/jasperreports-com-jrbeancollectiondatasource/

http://www.furutani.com.br/2009/02/tutorial-de-jasperreports-usando-arraylist-de-vo/

http://www.guj.com.br/java/149373-ireport---subreport---lista-dentro-de-lista-usando-jrbeancollectiondatasource-resolvido

http://www.guj.com.br/java/149373-ireport---subreport---lista-dentro-de-lista-usando-jrbeancollectiondatasource-resolvido/2

att Davi
GOSTEI 0
Alberto Leal

Alberto Leal

26/12/2011

na sua classe possui o metodo getLj_razao_social() escrito desse jeito???? se for altere no seu relatorio para $F{loja.lj_razao_social}.

espero ter ajudado.
att
robson


Bom dia.. entao a parte de loja funciona corretamente.. soh to com problemas na parte de produtos
GOSTEI 0
Alberto Leal

Alberto Leal

26/12/2011

Hora q eu vo rodar a aplicacao tenho esse erro na console

Exception in thread main java.lang.ClassCastException: br.com.saci.Produtos cannot be cast to java.util.List
at teste.principal.main(principal.java:129)


Linha 129: List<Produtos> listaprodutos = (List<Produtos>) new Produtos();
List<Produtos> listaprodutos = (List<Produtos>) new Produtos();
		for (int prod = 0; prod <= TotalProd; prod++) {
			Produtos produto = new Produtos();
			produto.setPro_codigo(array_codigo[prod]);
			produto.setPro_descricao(array_descricao[prod]);
			listaprodutos.add(produto);
		}


GOSTEI 0
Robson Teixeira

Robson Teixeira

26/12/2011

De acordo com o codigo que você postou sua classe Produtos implementa a interface List???? é acho q ao invez de fazer

List<Produtos> listaprodutos = (List<Produtos>) new Produtos();

Devia ser

List<Produtos> listaprodutos = new ArrayList<Produtos>();

att
robson
GOSTEI 0
Alberto Leal

Alberto Leal

26/12/2011

Mudei para arraylist agora deu esse erro
net.sf.jasperreports.engine.JRException: Error retrieving field value from bean : produtos
at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getBeanProperty(JRAbstractBeanDataSource.java:119)
at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getFieldValue(JRAbstractBeanDataSource.java:96)
at net.sf.jasperreports.engine.data.JRBeanCollectionDataSource.getFieldValue(JRBeanCollectionDataSource.java:100)
at net.sf.jasperreports.engine.fill.JRFillDataset.setOldValues(JRFillDataset.java:895)
at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:860)
at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:837)
at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1434)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:126)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:836)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:765)
at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:84)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:624)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:540)
at teste.principal.main(principal.java:192)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(PropertyUtilsBean.java:2170)
at org.apache.commons.beanutils.PropertyUtilsBean.getSimpleProperty(PropertyUtilsBean.java:1332)
at org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUtilsBean.java:770)
at org.apache.commons.beanutils.PropertyUtilsBean.getProperty(PropertyUtilsBean.java:846)
at org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils.java:426)
at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getBeanProperty(JRAbstractBeanDataSource.java:111)
... 13 more
Caused by: java.lang.ClassCastException: java.util.ArrayList cannot be cast to br.com.saci.Produtos
at br.com.saci.JOrcamento.getProdutos(JOrcamento.java:54)
... 23 more
GOSTEI 0
Davi Costa

Davi Costa

26/12/2011

Parece que no jasper vc mapeou um List e não um List<Produto> no seu field.
Dá uma olhada nisso

att Davi
GOSTEI 0
Alberto Leal

Alberto Leal

26/12/2011

Mudei para
ArrayList<Produtos> listaprodutos =  new ArrayList<Produtos>();
		for (int prod = 0; prod <= TotalProd; prod++) {
			Produtos produto = new Produtos();
			produto.setPro_codigo(array_codigo[prod]);
			produto.setPro_descricao(array_descricao[prod]);
			listaprodutos.add(produto);
		}


public class JOrcamento {
		
	private DadosOrcamento dadosOrcamento;
	private Cliente cliente;
	private CondicaoPagamento condicaoPagamento;
	private Loja loja;
	private Outros outros;
	private ArrayList<Produtos> produtos;
	private Totais totais;

public ArrayList<Produtos> getProdutos() {
		return produtos;
	}
	public void setProdutos(ArrayList<Produtos> produtos) {
		this.produtos = produtos;
	}

agora da o erro de
27/12/2011 13:32:26 net.sf.jasperreports.engine.query.JRXPathQueryExecuter <init>
AVISO: The supplied org.w3c.dom.Document object is null.
Ae eu abro pdf gerado a parte do subreport nao aparece mas todo o resto sim
No ireport o meu datasource configurei como collection of JavaBeans
GOSTEI 0
Alberto Leal

Alberto Leal

26/12/2011

Espero que possa ajudar:(o primeiro é bem prático)

http://www.franciscosouza.com.br/2009/07/22/jasperreports-com-jrbeancollectiondatasource/

http://www.furutani.com.br/2009/02/tutorial-de-jasperreports-usando-arraylist-de-vo/

http://www.guj.com.br/java/149373-ireport---subreport---lista-dentro-de-lista-usando-jrbeancollectiondatasource-resolvido

http://www.guj.com.br/java/149373-ireport---subreport---lista-dentro-de-lista-usando-jrbeancollectiondatasource-resolvido/2

att Davi


Tentei seguir esses tutoriais mais ainda nao consegui
GOSTEI 0
Alberto Leal

Alberto Leal

26/12/2011

Fiz umas mudancas no meu codigo java agora eu acho q ele esta correto, porem agora o problema esta no ireport, o relatorio principal ele preenche corretamente, porem o subreport q esta na banda detail ( o subreport dexei com 2 bandas Detail e Nodata).
Para criar o subreport usando o wizard do Ireport (4.1.3) Fiz os seguintes passos
1º Create a new report
2º Selecionei blank a4
3º Conections/Data Source Usei a mesma definida no relatorio master
4º Fiedls e Grop By dexei em branco ( nao traz nada)
5º Subreport exp Store the directory name in a paramentrer
6º Conetion exp Use the same Conection used to fill the master report

public class JOrcamento {
		
	private DadosOrcamento dadosOrcamento;
	private Cliente cliente;
	private CondicaoPagamento condicaoPagamento;
	private Loja loja;
	private Outros outros;
	private ArrayList<Produtos> produtos;
	private Totais totais;


public ArrayList<Produtos> getProdutos() {
		return produtos;
	}
	public void setProdutos(ArrayList<Produtos> produtos) {
		this.produtos = produtos;
	}
}


public class principal {
....
Produtos produtotemp = new Produtos();
		produtotemp.setPro_codigo(dados[Constantes.EMAIL$PRO_CODIGO]);
		produtotemp.setPro_descricao(dados[Constantes.EMAIL$PRO_DESCRICAO]);

		String[] array_codigo = produtotemp.getPro_codigo().split(
				Character.toString(Constantes.VAL_MARK));
		String[] array_descricao = produtotemp.getPro_descricao().split(
				Character.toString(Constantes.VAL_MARK));

		int TotalProd = Integer.parseInt(array_item.length + ) - 1;

		ArrayList<Produtos> listaprodutos =  new ArrayList<Produtos>();
		for (int prod = 0; prod <= TotalProd; prod++) {
			Produtos produto = new Produtos();
			produto.setPro_codigo(array_codigo[prod]);
			produto.setPro_ref_embalagem(array_referencia[prod]);
			produto.setPro_descricao(array_descricao[prod]);
			listaprodutos.add(produto);
		}
....
JOrcamento jOrcamento = new JOrcamento();
		jOrcamento.setDadosOrcamento(dadosorcamento);
		jOrcamento.setLoja(loja);
		jOrcamento.setCliente(cliente);
		jOrcamento.setProdutos(listaprodutos);
		jOrcamento.setTotais(total);
		jOrcamento.setOutros(outro);
		jOrcamento.setCondicaoPagamento(condpagamento);

Collection<JOrcamento> lista = new ArrayList<JOrcamento>();
		lista.add(jOrcamento);
		JRDataSource jrds = new JRBeanCollectionDataSource(lista);

}

No ireport criei um report defindo meu datasource como o JOrcamento, ao clicar em read atributes me traz
cliente (br.com.saci.Cliente)
condicaoPagamento (br.com.saci.CondicaoPagamento)
dadosOrcamento (br.com.saci.DadosOrcamento)
loja (br.com.saci.Loja)
outros (br.com.saci.Outros)
produtos (java.util.ArrayList)
totais (br.com.saci.Totais)
Com isso eu acesso por exemplo os fiedls no relatorio $F.getLj_razao_social() e traz os dados normalmente, na band detail eu fiz a chamada para um subreport soh q de vez eu ler br.com.saci.JOrcamento eu li br.com.saci.Produtos, ae q nada funciona mais dentro do subreport
GOSTEI 0
Dyego Carmo

Dyego Carmo

26/12/2011

Muito bom !

Problema resolvido ? Poderia fechar o chamado ?

Obrigadao !!!
GOSTEI 0
Alberto Leal

Alberto Leal

26/12/2011

Solução:

private DadosOrcamento dadosOrcamento;
private Cliente cliente;
private Object condicaoPagamento;
private Loja loja;
private Outros outros;
private Object produtos;
private Totais totais;



List<Produtos> itensDoOrcamento = new ArrayList<Produtos>();

for (int prod = 0; prod <= TotalProd; prod++) {
itensDoOrcamento.add(new Produtos(array_item[prod],
array_codigo[prod], array_descricao[prod],
array_unidade[prod], array_ref_embalagem[prod],
array_marca[prod], array_quantidade[prod],
array_preco_unitario[prod], array_perc_desconto[prod],
array_ipi[prod], array_icms[prod], array_ncm[prod],
array_cst[prod], array_tot_unt[prod], array_cfop[prod]));
}
GOSTEI 0
Alberto Leal

Alberto Leal

26/12/2011

Muito bom !

Problema resolvido ? Poderia fechar o chamado ?

Obrigadao !!!


Como q se encerra o chamado ?
GOSTEI 0
Davi Costa

Davi Costa

26/12/2011

Achei isso em um outro post:
...quando alguem responde o seu chamado, uma janela é aberta e pergunta se a resposta dada resolveu o problema. quando vc responder sim, o chamado é fechado.

att Davi
GOSTEI 0
Alberto Leal

Alberto Leal

26/12/2011

Achei isso em um outro post:
...quando alguem responde o seu chamado, uma janela é aberta e pergunta se a resposta dada resolveu o problema. quando vc responder sim, o chamado é fechado.

att Davi


Obrigado.. nao apareceu essa opcao ainda nao para min
GOSTEI 0
POSTAR