Problemas comrelatorio aonde o field é um objeto (iReport)

8 respostas
L

Amigos estou precisando da ajuda de vcs novamente. Eu tenho as seguintes tabela:
CLIENTE
INTEGER ID
VARCHAR NOMECLI

ITEM
INTEGER ID
VARCHAR NOMEITE

PEDIDO
INTEGER NROPEDIDO
INTEGER CLIENTE (FK COM CLIENTE)

PEDIDOITEM
INTEGER NROPEDIDO (FK COM PEDIDO)
INTEGER ITEMID (FK COM ITEM)
INTEGER SEQUENCIA

Minhas classes javas foram implementadas da seguinte forma:

Cliente

int id;

String nomeCli;
Item

int id;

String nomeIte;
Pedido

int nropedido;

Cliente cliente;
PedidoItem

int nropedido;

int itemId;

int sequencia;

Eu preciso agora no iReport criar um Relatório aonde eu mostre o cabeçalho do pedido (usando as informações da classe Pedido) e um sub-relatório mostrando os item daquele pedido. Não estou utilizando conexão direto com o banco de dados. Utilizarei a técnica de JRBeanCollectionDataSource
que encontrei no site de Furutani (http://www.furutani.eti.br:8080/MostrarArtigo.action?codigo=10), para gerar o relatório.

O meu grande problema está sendo como fazer para mostrar no cabecalho do pedido o nome e o codigo do cliente já que eu tenho uma classe que retorna estes valores.

Cheguei a criar um Field com o nome cliente e class type java.lang.Object, mias não funcionou… Como posso fazer para criar este relatório?

8 Respostas

keller

Você pode passar um objeto "cabeçalho" por parametro.

br.com.keller.relatorio.Cabecalho ( Vai no map de parametros )
br.com.keller.relatorio.Produto ( Vai via JRCollectionDatasource )

Fazemos de conta que o Cabecalho tem getTitulo1 / getTitulo2 / getTitulo3 :

Vamos criar um parametro e tipar ele…

Crie um Parameter [View -&gt Report Parameters -&gt New]
Parameter Name: Cabecalho
Class Type: java.lang.Object
Crie uma Variable [View -&gt Report Variables -&gt New ]
Variable Name: CabecalhoImpl
Class Type: br.com.keller.Cabecalho
Variable Expression: $P{Cabecalho}

Agora basta usar no header do iReport o objeto “cabeçalho”:

$V{CabecalhoImpl}.getTitulo1()
$V{CabecalhoImpl}.getTitulo2()
$V{CabecalhoImpl}.getTitulo3()
  • java.lang.ClassNotFoundException = A classe nao esta no classpath.
    ** As assinaturas dos metodos retornam String ( public String getTitulo1() )

Boa sorte! :thumbup:

L

Olá Guilherme, obrigado pela atanção, porém… OCmo resolver o problema do java.lang.ClassNotFoundException ?

Estou com o jrxml dentro do diretorio D:\workspace\projeto\JavaSource\br\com\dominio\relatorio\pedido e a classe cliente.java está em D:\workspace\projeto\JavaSource\br\com\dominio\cliente

Não sei como resolver este problema…

keller

O seu classpath deve apontar para os “.class”

Você tem que mecher na configuração do classpath do iReport e adicionar o diretorio de compilacao do seu projeto:

por exemplo:

$PROJECT_HOME = /home/guilherme/projetos/ExamploRelatorio/build/classes

A partir do diretorio build/classes estarao as classes:

$PROJECT_HOME/br/com/keller/relatorio/Cabecalho.class
$PROJECT_HOME/br/com/keller/relatorio/Produto.class

Então se achar alguma opção pra adicionar algo ao classpath adicione no caso a “$PROJECT_HOME”.

Pois (in)felizmente não tenho ele instalado aqui e provavelmente não terei ( devido a blacklist do squid tenho poucos sites liberados ) mas tente dar uma olhada no arquivo que inicia o iReport , que se eu nao me engano é um .bat (.sh caso linux) e nas configurações / opcões dele…

Boa sorte! :thumbup:

*A variavel $PROJECT_HOME é ficticia apenas pra explicação você nao precisa declarar ela.

L

Grande Guilherme, deu certo…

Como eu uso o iReport 1.3.1, fui no menu Options -> ClassPath e adicionei a pasta do meu projeto até o diretório classes. No meu caso ficou:

D:\Workspace\Projeto\WebContent\WEB-INF\classes

Depois só fechei e abri o iReport e já conseguiu compilar minha classe.

Só ficou uma dúvida. Como é que eu vou ligar o Cliente que estou mandando por parâmetro com o registro que está sendo impresso? POis eu tô mandando só um objeto (no caso “oCliente”) por parâmetro… e isto não quer dizer que o meu ralatório irá conseguir pegar o nome e o codigo do cliente referente ao pedido que está sendo impresso…

Como ficaria esta amarração ???

keller

Tem como reformular a pergunta em partes e com calma ?
Não consegui entender ( sério ) e seja claro… :slight_smile:

Ja rodou o relatorio pra ver como ficou ?
Acho que daqui pra frente é contigo… :wink:

Boa sorte! :thumbup:

L

Cara suas dicas foram perfeitas… Consegui me virar com elas…

Deu tudo certo, esotu mudando alguns ponto e prometo que qdo terminar, irei disponibilizar a maneira de como gerei meus relat’roios. Muito obrigado pela atençao…

keller

:thumbup:

Opa , promessa é divida hein! :smiley:
Entao depois coloca aqui como ficou…

Boa sorte! :wink:

D

Estou com um problema parecido, porém ainda não consegui fazer esse lance do classPath porque minha versão de iReport é a 0.5.0.

Na verdade queria fazer o seguinte:
Tenho 2 classes:

class Produto{
     private String codigo;
     private String nome;
     private List<Modalidade> modalidades;
}

class Modalidade{
     private String codigo;
     private String nome;
     private Produto produto;
}

Estou mandando uma lista de Modalidades já preenchida com os seus respectivos produtos. Só que não consigo acessar o nome do produto no iReport.

Aguém me ajude pq já tentei de tudo!!!

Criado 3 de abril de 2007
Ultima resposta 15 de mai. de 2008
Respostas 8
Participantes 3