[Resolvido] Linkar relatório com subrelatório no iReport 3.7.4

8 respostas
Guevara

Oi pessoal!
Estou tendo dificuldades em linkar o relatório master com o subrelatório, tenho a query dos dois feitas em HQL:
Relatório master:

from Proprietario p

Subrelatório:

from Imovel i where i.idProprietario = $P{idProprietario}
// tentei tb assim:
from Imovel i where i.proprietario.idProprietario = $P{proprietario.idProprietario}

Tô seguindo o livro The definitive guide to iReport da Apress de 2007, na página 109 é que fala sobre o assunto, mas as janelas lá não batem com o que eu tenho na versão 3.7.4.
O problema é que os parâmetros que o Hibernate usam são diferentes dos usados em SQL, tentei passando proprietario.idProprietario e apenas idProprietario, não aceita nenhum dos dois.

Hibernate session opened
Error filling print... Error evaluating expression :      Source text : $P{idProprietario} 
 Hibernate:      select         proprietar0_.id_proprietario as id1_650_,         proprietar0_.data_inclusao as data2_650_,         proprietar0_.email as email650_,         proprietar0_.id_endereco as id4_650_,         proprietar0_.id_pessoa as id5_650_      from         Proprietario proprietar0_,         Pessoa pessoa1_      where         proprietar0_.id_pessoa=pessoa1_.id_pessoa      order by         pessoa1_.nome Hibernate:      select         endereco0_.id_endereco as id1_651_0_,         endereco0_.bairro as bairro651_0_,         endereco0_.cep as cep651_0_,         endereco0_.cidade as cidade651_0_,         endereco0_.complemento as compleme5_651_0_,         endereco0_.estado as estado651_0_,         endereco0_.logradouro as logradouro651_0_,         endereco0_.numero as numero651_0_,         endereco0_.pais as pais651_0_      from         Endereco endereco0_      where         endereco0_.id_endereco=? Hibernate:      select         pessoa0_.id_pessoa as id1_648_0_,         pessoa0_.celular as celular648_0_,         pessoa0_.cpf as cpf648_0_,         pessoa0_.data_nascimento as data4_648_0_,         pessoa0_.estado_civil as estado5_648_0_,         pessoa0_.nacionalidade as nacional6_648_0_,         pessoa0_.naturalidade as naturali7_648_0_,         pessoa0_.nome as nome648_0_,         pessoa0_.rg as rg648_0_,         pessoa0_.telefone as telefone648_0_      from         Pessoa pessoa0_      where         pessoa0_.id_pessoa=? net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression :      Source text : $P{idProprietario}

Alguém sabe orientar como ficaria a id do proprietário pra resolver isso?
Abraço!!

8 Respostas

Guevara

Consegui!
Ficou assim as Querys em HQL:
Query do relatório Master:

from Proprietario p where p.idProprietario = $P{proprietario.idProprietario}

Query do subrelatório:

from Imovel i where i.proprietario.idProprietario = $P{proprietario.idProprietario}

Crie o parâmetro no relatório Master que deseja usar para passar como parâmetro, no meu caso ficou:

proprietário.idProprietário

Faça o mesmo pro subrelatório.
Depois, clique nas propriedades desse parâmetro e escolha em “Parameter Class”:

java.lang.Long

Ainda no relatório Master, clique no subrelatório, vá em “Propriedades”, em “Parameters” clique em “Copy from Master”, ou seja, vai usar a id do proprietário usada no relatório Master como parâmetro para realizar a query do subrelatório e mostrar td junto no relatório Master.
Agora é a parte que faz o “link” entre os dois relatórios, ainda nas propriedades do subrelatório existe a opção “Parameters Map Expression”, clique lá e selecione:

$P{REPORT_PARAMETERS_MAP}

É essa opção que faz a passagem de parâmetros pro subrelatório, o resultado final é este:

Eu não estava conseguindo pq estava fazendo com se fosse sql puro, pegando a chave estrangeira como parâmetro, igual aos exemplos do livro, ou seja, $F{idProprietario}.
Agora vou tentar melhorar essa query de proprietario, pq Hibernate em relação OneToOne, consegue pegar os objetos relacionados, talvez não precise do subrelatório. Mas mesmo que precisasse, os parâmetros seriam passados com o report_parameters_map e nas propriedades do subrelatório usar o “Copy from Master”.
Dúvidas ou críticas é só falar. =)

Abraço!

THIAGOANALISTA

tem como me ajudar com os relatorios com hibernate, tipo um passo a passo ou um arquivo de exmplo?

Guevara

Olá thiago!
Onde vc está tendo problemas exatamente? Acho que se vc explicar qual é a dúvida fica mais fácil de vc ir montando o seu relatório.
[]s

THIAGOANALISTA

eu fiz um selec * from tb_… com jdbc, agora não sei fazer com hibernate, eu precido de um relatório com todos os campos da minha tabela, e depois tbem não sei como fazer para chamar meu relatório via java hibernate, também preciso criar relatórios com filtros, criar os parametros no sistema para chamar o relatório com um filtro, por exemplo relatório de clientes por data digitada, ou lançamento de uma despesa pela data.

Guevara

Beleza, comece colocando o jar do Hibernate e o conector do seu banco em /opt/iReport-3.7.4/ireport/libs, no caso eu uso linux, mas é só adicionar os dois jar’s dentro da pasta /libs do iReport.
No seu relatório Master, crie uma query que puxe td, vou usar o meu caso como exemplo:

from Proprietario p

Quando ele carregar td ai sim vc coloca os campos no relatório, adicionando as variáveis vc vai clicando em “propriedades” e vai apontando pros atributos corretos.
Quando terminar de montar o relatório, ai vc edita aquela primeira query para puxar o que vc quer passando algo como parâmetro, tipo, quero um relatório de proprietários por período, ou seja, data de inclusão, então preciso montar a sequinte query:

from Proprietario p where p.dataInclusao between $P{dataInicio} and $P{dataFim}

Agora preciso declarar esses dois parâmeros que estou passando, clique em “Parameters” ali do lado esquerdo e crie dois novos parâmetros:

Clique em cima deles e vá em "propriedades, em “parameters class” selecione “java.util.Date”, agora clique no campo do seu relatório que mostra a data e vá em “field pattern”, selecione Data.
Clique em “Preview”, informe a dataInicio e dataFim, vai mostrar o relatório de proprietários dentro do período informado.

Agora, lá na sua query da aplicação vc pode fazer:

public List<Proprietario> getProprietarioPorPeriodo(Date dataInicio, Date dataFim) {
		Criteria crit = session.createCriteria(Proprietario.class);
		crit.add(Restrictions.between("dataInclusao", dataInicio, dataFim));
		return crit.list();	
	}

Um detalhe importante, eu tô usando o JasperMaker do Lavieri para gerar relatório pela aplicação, o único problema até agora é quanto a subrelatórios, que por enquando não está trazendo automáticamente, estou esperando o Lavieri responder lá pra ver o que pode ser feito, mas para gerar relatório Master tá vindo na boa:
http://www.guj.com.br/posts/list/201107.java

[]s

THIAGOANALISTA

valeu, mas minha aplicação é desktop, não sei se funciona igual web, valeu mesmo!!

Guevara

Então, ai vai ser diferente mesmo, mas o código pra vc colocar na aplicação vc acha fácil, é o que mais têm, depois eu posto o que eu tenho aqui, enquanto isso vc vai fazendo o relatório pelo iReport.
Detalhe, consegui puxar o subrelatório junto com o Master, a resposta está no link que passei pro JasperReport do Lavieri.
[]s

R

Cara eu to com um caso semelhante a esse, a questão é que não uso HQL e sim criteria. E não seu como fazer o list do Subrelatório!

Seu puder da uma passada no tópico:

http://www.guj.com.br/java/241490-hibernate--ireport--subrelatorio

Valeu!

Criado 18 de setembro de 2010
Ultima resposta 13 de mai. de 2011
Respostas 8
Participantes 3