JasperReport - Error retrieving field value from bean [Resolvido]

E ai galera, to com dificuldades em gerar um relatorio…

Tenho o seguinte SQL:

SELECT contaspagar."descricao" AS descricao, contaspagar."numero_fatura" AS numero_fatura, contaspagar."valor" AS valor, contaspagar."vcto" AS vcto, contaspagar."codigo_contaspagar" AS codigo_contaspagar, contaspagar."codigo_plc3" AS codigo_plc3, plc3."codigo_plc3" AS codigo_plc3, plc3."nome" AS plc3_nome FROM "public"."contaspagar" contaspagar, "public"."plc3" plc3 WHERE contaspagar."codigo_plc3" = plc3."codigo_plc3"

e quando vou gerar o relatorio aparece o seguinte erro:

net.sf.jasperreports.engine.JRRuntimeException: net.sf.jasperreports.engine.JRException: Error retrieving field value from bean : plc3_nome
	at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getBeanProperty(JRAbstractBeanDataSource.java:123)
	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:821)
	at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:785)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1482)
	at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:126)
Caused by: net.sf.jasperreports.engine.JRException: Error retrieving field value from bean : plc3_nome
	at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getBeanProperty(JRAbstractBeanDataSource.java:123)
	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:821)
	at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:785)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1482)
	at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:126)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:946)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:864)
	at net.sf.jasperreports.engine.fill.JRFillSubreport.fillSubreport(JRFillSubreport.java:613)
	at net.sf.jasperreports.engine.fill.JRSubreportRunnable.run(JRSubreportRunnable.java:59)
	at net.sf.jasperreports.engine.fill.JRThreadSubreportRunner.run(JRThreadSubreportRunner.java:205)
	... 1 more
Caused by: java.lang.NoSuchMethodException: Unknown property 'plc3_nome' on class 'class modelo.ContasPagar'
	at org.apache.commons.beanutils.PropertyUtilsBean.getSimpleProperty(PropertyUtilsBean.java:1322)
	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)
	... 12 more

Alguem sabe o porquê disso?

[]'s


que eu me lembre esse erro é que ele não esta encontando esse "plc3_nome"  no seu TO por exemplo


[code]relatorioFornecedorTO.setNome(rs.getString("nome"));
relatorioFornecedorTO.setEndereco(rs.getString("endereco"));[/code]

TO  do relátorio

[code]private String Nome;
private String Endereco;

public String getNome() {
		return Nome;
	}

	public void setNome(String nome) {
		Nome = nome;
	}

	public String getEndereco() {
		return Endereco;
	}

	public void setEndereco(String endereco) {
		Endereco = endereco;
	}[/code]


AI no seu relátorio vc coloca outro nome de uma field desconheçida que não tenha em seu TO ele vai reclamar e dar o erro, pois ele não vai encontar do além essa cara...

bom não sei resolve isso ....pelo que eu entendi!

que eu me lembre esse erro é que ele não esta encontando esse “plc3_nome” no seu TO por exemplo

relatorioFornecedorTO.setNome(rs.getString("nome")); relatorioFornecedorTO.setEndereco(rs.getString("endereco"));

TO do relátorio

[code]private String Nome;
private String Endereco;

public String getNome() {
return Nome;
}

public void setNome(String nome) {
	Nome = nome;
}

public String getEndereco() {
	return Endereco;
}

public void setEndereco(String endereco) {
	Endereco = endereco;
}[/code]

AI no seu relátorio vc coloca outro nome de uma field desconheçida que não tenha em seu TO ele vai reclamar e dar o erro, pois ele não vai encontar do além essa cara…

bom não sei resolve isso …pelo que eu entendi!

O problema pode ser uma unica coisa, falta do campo expecificado.

Onde:

1º pode ser no relatorio que o $F{Field} seja diferente do especificado,

2º no sql o nome esteja diferente do $F{Field}

3º se estiver usando Collection, seu objeto pode ter nome diferente do especificado

Hum… cara não entendi bm essa parte do TO :smiley:

deixa eu te passar como eu fazendo :

Eu faço uma consulta no banco e nela me retorna uma lista de ContasPagar q eu envio para um JRBeanCollectionDataSource

List<ContasPagar> lcp;
JRBeanCollectionDataSource BCD1 = new JRBeanCollectionDataSource(lcp);

Depois eu passo por MAP essa bean:

ht.put("contas", BCD1);

JasperPrint impressao = JasperFillManager.fillReport(System.getProperty("user.dir") + "/jasper/ContasPagar.jasper", ht);

[]'s

[quote=TheKill]

3º se estiver usando Collection, seu objeto pode ter nome diferente do especificado[/quote]

Eu estou usando Collection, e os nomes estao iguais:

public class ContasPagar 

    @ManyToOne
    @JoinColumn(name="codigo_plc3")
    private PLC3 codigo_plc3;

e n SQL ta igual o nome…

[quote=DeGuedes][quote=TheKill]

3º se estiver usando Collection, seu objeto pode ter nome diferente do especificado[/quote]

Eu estou usando Collection, e os nomes estao iguais:

public class ContasPagar 

    @ManyToOne
    @JoinColumn(name="codigo_plc3")
    private PLC3 codigo_plc3;

e n SQL ta igual o nome…[/quote]

net.sf.jasperreports.engine.JRRuntimeException: net.sf.jasperreports.engine.JRException: Error retrieving field value from bean : plc3_nome

Vou reformular minha pergunta:
Tenho a classe COntasPagar:
Dentro dela tenho a referencia da tabela PLC3

@ManyToOne @JoinColumn(name="codigo_plc3") private PLC3 codigo_plc3;

para jogar no relatorio preciso pegar o PLC3.getNome… e t fazendo o seguinte select:

SELECT contaspagar."descricao" AS descricao, contaspagar."numero_fatura" AS numero_fatura, contaspagar."valor" AS valor, contaspagar."vcto" AS vcto, contaspagar."codigo_contaspagar" AS codigo_contaspagar, contaspagar."codigo_plc3" AS codigo_plc3, plc3."codigo_plc3" AS plc3_codigo_plc3, plc3."nome" AS plc3_nome FROM "public"."contaspagar" contaspagar, "public"."plc3" plc3 WHERE contaspagar."codigo_plc3" = plc3."codigo_plc3"

Coom isso a seguinte excessão :

Caused by: java.lang.NoSuchMethodException: Unknown property 'plc3_nome' on class 'class modelo.ContasPagar'

ele ta tentando pegar o nome dentro da tabela ContasPagar, mas ele deve pegar esse Nome dentro da tabela PLC3

e eh isso q t querendo saber, como eu digo pro Ireport q ele deve procurar o campo Nome na tabela PLC3 e nao em contas a pagar

isso eu acho que nao dá…

vc ta mandando uma collection para o relatorio e quer que ele use SQL ? o correto seria você alterar OU o relatorio para pegar o nome que esta no teu objeto ou vice-versa

É o mesmo que eu dizer o seguinte:

Relatorio campo $F{Cod_Cliente}

Java objeto Cliente:

private int codigoCliente;

Envio para o relatorio uma collection Cliente,
e o relatorio tenta pegar Cod_Cliente do meu objeto Cliente… Pergunto, ele vai encontrar Cod_Cliente em Cliente?

[quote=TheKill]isso eu acho que nao dá…

vc ta mandando uma collection para o relatorio e quer que ele use SQL ? o correto seria você alterar OU o relatorio para pegar o nome que esta no teu objeto ou vice-versa[/quote]

E qual serio o método certo para mim usar com Collection?

[]'s

Método certo?

Apenas o objeto deve estar igual no relatorio…
Nao se usa método… No relatorio vc cria o Field Codigo e no Objeto vc tem um atributo chamado Codigo, entendeu?

Seguinte cara, eu usei isso no field e funcionou:

$F{codigo_plc3.nome}

Seria um ContasPagar.getCodigo_plc3.getNome();

Simples assim!

Obrigado

[]'s

Firmeza :slight_smile:

Foi nada nao, pode fazer a gentileza de alterar o primeiro topico marcando [Resolvido]