Problema enum iReport

27 respostas
rodrigo.fai

Boa tarde!

Estou com um problema no meu relatório que é o seguinte: meu field no ireport esta do tipo string só que na minha aplicação ele é Enum, ai quando executa a aplicação da um erro:

Caused by: java.lang.ClassCastException:
br.com.mcinfo.rep.modelo.enumeracoes.EnumUnidadeFederativa cannot be
cast to java.lang.String

Como posso fazer para no ireport criar um tipo Enum.

27 Respostas

matheus306

Cara vc precisa apontar para o pacote onde fica a classe enum ao invés de apontar para java.util.String. Eu acho, não tenho certeza, que enum esta no mesmo pacote so que se chama enumeration. java.util.enumeration.

Tenta ai e se der erro mande novamente.

rodrigo.fai

matheus306:
Cara vc precisa apontar para o pacote onde fica a classe enum ao invés de apontar para java.util.String. Eu acho, não tenho certeza, que enum esta no mesmo pacote so que se chama enumeration. java.util.enumeration.

Tenta ai e se der erro mande novamente.

kra… não sei qual vesão do iReport que vc usa mas, a que eu estou usando não tem como apontar p/ o pacote do enumeration! Somente p/ os pacotes pre-definidos…

matheus306

Quando vc declara um field ele te da aquelas opções, mas, aquelas não são as únicas. Você pode declarar um caminho ali. Ex: na versão 2.02 ele não lista java.util.list. Toda vez eu declaro na mão!

Veja lá!

rodrigo.fai

matheus306:
Quando vc declara um field ele te da aquelas opções, mas, aquelas não são as únicas. Você pode declarar um caminho ali. Ex: na versão 2.02 ele não lista java.util.list. Toda vez eu declaro na mão!

Veja lá!

blz! ate da p/ declarar um campo com este pacote “java.util.Enumeration” mas… quando adiciono um “campo texto” p/ exibicao do valor, ele nao me deixa definir com este pacote! a nao ser que eu defina como “java.lang.Number”!? será que da certo?

matheus306

segure o field e arrates para a sua tela. Repare que ele vai criar um campo do tipo string e vai colocar assim “”+$F{enum}

D

Desculpa gente, posso nunca ter visto esse caso, mas porque usaria List, Enum se os campos são para exibir geralmente um único valor?
Qual seria a real aplicação de um campo ter um objeto List?

Abraços

matheus306

bom cara! na verdade, se eu entendi a sua pergunta, um campo nunca é do tipo list. Vc geralmente passa uma lista de objeto para o irport e declara os atributos dos objetos q contem na lista ex:
Classe pessoa.

public class Pessoa{
 protected Integer id;
 protected String nome;
 protected String rg;
 
 geter´s e seter´s
}

vc passa uma lista de pessoa e no ireport declara os campos de pessoa. Ex: Filed > String > nome. Assim se vc mandar 500 pessoas em uma lista, ele vai imprimir o nome 500 vezes.

Entendeu?

rodrigo.fai

agora sim! deu certo eu criar o field do tipo Enumeration e o text field correspondente, porem… ao executar o relatorio eh exibida a seguinte msm de erro:

Error evaluating expression : Source text : “”+$F{corEtnia}
Caused by: java.lang.ClassCastException: br.com.faespsenar.sicp.model.TipoDeEtnia cannot be cast to java.util.Enumeration

Sendo que “TipoDeEtnia” eh uma classe enum! nao to entendeno o pq do erro!

matheus306

Estranho mesmo!!!

vou dar uma pesquisada aki pra te resp. Mas, as vezes vc pode passar este campo como parametro no java. E passar o valor para String.

Teria como?

rodrigo.fai

matheus306:
Estranho mesmo!!!

vou dar uma pesquisada aki pra te resp. Mas, as vezes vc pode passar este campo como parametro no java. E passar o valor para String.

Teria como?

intao… eu fiz uma gambiarra aqui q deu certo! eu criei um atributo @transient que captura este valor do enum(a string) e exibi no relatorio. mas nao queria deixar deste jeito! acho q ha uma maneira mais elegate de c resolver este problema!?

matheus306

hehehehe… Gambiarra mermo!! kkkkkkkkkk…
acho que sim…

vc tem algum método público no enum que retorne o valor?

rodrigo.fai

matheus306:
hehehehe… Gambiarra mermo!! kkkkkkkkkk…
acho que sim…

vc tem algum método público no enum que retorne o valor?

tenho nao! precisa ser criado?
mas como seria este metodo? nunca ouvi falar de um metodo dentro de uma classe enum, que retornasse o valor!

matheus306

estava olhando aqui um relatório que eu fiz que usa enum, so que, eu passo um único objeto, como se fosse a ficha de uma única pessoa, então eu passo como parametro e recebo uma string no ireport. No seu caso vc passa uma lista com vários registros ne?

matheus306

la vai um ex:

public enum NivelHierarquicoEnum {
	
	LULA ("Presidente"),
	AECIO ("Governador"),


	private String descricao;
	
	NivelHierarquicoUGEnum(String descricao){
		this.descricao = descricao;
	}

	@Override
	public String toString() {
		return descricao;
	}
	
	public String getName(){
		return name();
	}
	
}
matheus306

outra coisa, ao inves de apontar para enumeration, como eu tinha te falado antes, coloca o field para apontar para a sua classe enum.

depois troca o field la na tela de “”+${filed} para ${filed}.getDescricao()

rodrigo.fai

isso! na verdade eh um relatorio de projetos, onde um projeto existe varios participantes! entao eu criei um relatorio com um subrelatorio(p/ exibicao dos registros dos participantes) onde passo como parametro uma lista de participantes. Eh na bean participante que tem a enum!

mas blz, vlw pelo auxilio! na verdade esse problema com os enum eh o menor problema que tenho! Surgiu um outro que estou descabelano aqui viu… rsrsrrs

um participante pode ser: produtor rural, trabalhador rural e familiar, blz? como eu filtraria esta informacao antes da exibicao do relatorio? pq p/ kda tipo de participante eh uma informacao especifica que tenho que exibir! Entao terei que criar 3 tipos de relatorios, certo? mas ficaria dificil o filtro pq eu exibo as informacoes do participante dentro de um subrelatorio! entendeu meu caso?

vlw.

matheus306

no seu caso vc teria que criar subs. Se eu entendi vc tem tres tipos de pessoas, cada uma tem um tipo de relatorio. Então vc cria três subs. Formata os campos e no java vc passa os parametros pra cada hum e junta os tres em um quarto que seria tipo o relatorio pai.

entendeu?

rodrigo.fai

matheus306:
no seu caso vc teria que criar subs. Se eu entendi vc tem tres tipos de pessoas, cada uma tem um tipo de relatorio. Então vc cria três subs. Formata os campos e no java vc passa os parametros pra cada hum e junta os tres em um quarto que seria tipo o relatorio pai.

entendeu?

saquei! soh nao entendi a parte do quarto que seria o relatorio pai… como faria?

matheus306

declara tres subs nele. ele so serve pra receber sub! passa os tres subs como parametro pra ele.

entendeu?

rodrigo.fai

matheus306:
declara tres subs nele. ele so serve pra receber sub! passa os tres subs como parametro pra ele.

entendeu?

ah tah… entendi! mas eu ja resolvi aqui com meu gerente… achamos uma maneira de simplificar este problema rsrrs, uma gambiarrinha como sempre!
mas… voltano a aquele assundo do enum, nao entendi o objetivo da declaracao dete metodo em sua classe de exemplo:

NivelHierarquicoUGEnum(String descricao){ this.descricao = descricao; }

matheus306

isto ai vc pode tirar! serve para alterar o valor. mas é muito raro ocorrer.

rodrigo.fai
matheus306:
isto ai vc pode tirar! serve para alterar o valor. mas é muito raro ocorrer.

ah tah! soh nao entendi direto como ficaria no meu caso, pois sua classe enum eh meio diferente!

da uma olhada como defini a minha:

package br.com.faespsenar.sicp.model;

public enum TipoDeParticipante {
	PRODUTOR, TRABALHADOR, FAMILIAR_DO_PRODUTOR, FAMILIAR_DO_TRABALHADOR;
}
matheus306
1. package br.com.faespsenar.sicp.model;  
   2.   
   3. public enum TipoDeParticipante {  
   4.     PRODUTOR("produtor").....
   5. }

o que vai dentro do parentese e a string descrição que vc declarou

D

Pessoal, me desculpe a entrada nesse assunto, mas pelo que percebi, e já havia concluido antes, não é necessário fazer o que estão propondo.
Estão coçando a orelha esquerda com a mão direita sem necessidade.
Os parâmetros podem passar objetos de diversos tipos, mas se for passar um list apenas para exibir uma informação, esqueça.
Acho que, para o que precisam, estão querendo usar o JRBeanCollectionDataSource, onde transmitimos um List, ArrayList e por ai vai.
Uso este objeto quando estou trabalhando com Spring e JPA ou Hibernate.
Você monta o relatório sem conexão e depois transmite as informações alimentando os Fields criados.
Pesquisem que com certeza irão aprender sobre isso e, se não quiserem perder tempo pesquisando, compre um livro, como eu fiz.
Abraços

rodrigo.fai

djemacao:
Pessoal, me desculpe a entrada nesse assunto, mas pelo que percebi, e já havia concluido antes, não é necessário fazer o que estão propondo.
Estão coçando a orelha esquerda com a mão direita sem necessidade.
Os parâmetros podem passar objetos de diversos tipos, mas se for passar um list apenas para exibir uma informação, esqueça.
Acho que, para o que precisam, estão querendo usar o JRBeanCollectionDataSource, onde transmitimos um List, ArrayList e por ai vai.
Uso este objeto quando estou trabalhando com Spring e JPA ou Hibernate.
Você monta o relatório sem conexão e depois transmite as informações alimentando os Fields criados.
Pesquisem que com certeza irão aprender sobre isso e, se não quiserem perder tempo pesquisando, compre um livro, como eu fiz.
Abraços

pois eh… to usando o JRBeanArrayDataSource, para um objeto do tipo List! Funcionou em um relatorio que tinha feito a algum tempo, porem, quando executo esse novo nao está sendo exibido! Parece que esta em um loop infinito! Ja debuguei o codico e esta tudo correto. O problema esta na hora da geracao, quando estao sendo executadas as consultas!
Vo tentar usar esta nova Classe que mencionou p/ ver funciona…

vlw

rodrigo.fai
matheus306:
1. package br.com.faespsenar.sicp.model;  
   2.   
   3. public enum TipoDeParticipante {  
   4.     PRODUTOR("produtor").....
   5. }
o que vai dentro do parentese e a string descrição que vc declarou

eai kra, blz?
Veja c vc consegue me dizer oq pode estar aconteceno...

Antes da exibicao do relatorio, eu verifico os tipos de particpantes e os separo em 3 Collections kda, certo?
No meu relatorio principal eu criei 3 subrelatorios(um p/ kda tipo de participante), onde eu passo as respectivas Collections. Até ai blz... porem, quando mando exibir o bendito relatório nao acontece nada, somente uns barulhos estranhos no HD! Eh como se estivesse em loop infinito! Ja debuguei o codico e esta tudo correto. O problema esta na hora da geracao, quando estao sendo executadas as consultas, talvez!
Aí, depois de muito tempo eh exibida a seguinte msm de erro:

25/09/2008 11:30:29 org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet vraptor2 threw exception java.lang.OutOfMemoryError: Java heap space 25/09/2008 11:30:33 org.apache.catalina.connector.CoyoteAdapter service SEVERE: An exception or error occurred in the container during the request processing java.lang.OutOfMemoryError: Java heap space

oq pode estar aconteceno? c puder me ajudar novamente...

Obrigado.

faelcavalcanti

rodrigo.fai:
matheus306:
hehehehe… Gambiarra mermo!! kkkkkkkkkk…
acho que sim…

vc tem algum método público no enum que retorne o valor?

tenho nao! precisa ser criado?
mas como seria este metodo? nunca ouvi falar de um metodo dentro de uma classe enum, que retornasse o valor!


faça este método público e use-o como se fosse uma classe ao acessar. simples, preste bastante atenção na sua sintaxe.

Criado 23 de setembro de 2008
Ultima resposta 25 de set. de 2008
Respostas 27
Participantes 4