IReport+Subrelatorio+Hibernate

31 respostas
wagne23

Bom dia, estou tentando desenvolvendo um subrelatorio usando ireport e hibernate mas não ta funcionando, procurei varios exemplos na net mas não deu certo. Tenho uma tabela de cadastro de pacientes e um cadastro de convenios, cada um em sua respectiva tabela, eu preciso imprimir a ficha desse paciente e mostrar tambem qual o convenio que ele foi cadastrado. Na minha tabela de pacientes eu tenho uma FK de convenio.

Eu ja criei o relatorio que mostra o cadastro do paciente e está funcionando perfeitamente, o problema é para poder criar o subrelatorio de convenio. Alguem pode me ajudar?

31 Respostas

wagne23

Outro problema que tenho é que quando recuperdo a data cadastrada no mysql não consigo converter para ##/##/#### mas vem como esta no banco ####-##-##, ja adicionei a mascara no campo do relatorio mas continua errado. Estou usando o ireport 3.7.4.

hvivox

Cara, apesar de conhecer e utilizar hibernate em minhas aplicações, para gerar relatorios utilizo JDBC.

na epoca q tentei gerar relatorio em Hibernate não consegui. por isso utilizo JDBC para manipular consultas para os relatorios e hibernate para cadastro, processamentos e outros

R

Como assim não conseguiu?

Tanto faz Hibernate ou JDBC,no fim o que vai ser passado pro Ireport é um List :smiley:

wagne23

Correto, passo um list para o relatorio, mas como faço com o subrelatorio?

Guevara

Veja se ajuda:
http://www.guj.com.br/posts/list/218802.java
[]s

wagne23

Guevara, eu ja tinha olhado esse seu post mas não funcionou para mim, simplesmente o subrelatorio aparece em branco. Não sei o que pode ser.

R

Na aba ‘Propriedades’ do teu Subreport,o que tem na opção ‘When no Data’?

hvivox

Então, vamos trocar informações, vc me ajuda a utilizar hibernate c/ subrelatorios e te ensino a utilizar os subrelatórios.

vamos ao meu problema e depois ao seu ok.

MEU Problema.
Quando vc gera relatorio vc tem um classe em java q gerar o relatorio. Está classe eu tenho porém ela está configurada para JDBC. não consegui configurar para hibernate, até cheguei a pesguisar a questão do list mas acabei deixando de lado.

Seu problemas
Para que eu possa te ajudar preciso saber qual a versão do teu iReport, tenho uns modelos de subrelatorios que podem te ajudar!
Assim q eu tiver um tempo vou colocar um passo a passo para vc montar um subrelatorio. é bem simples,

att.

wagne23

Ta bom, não sei mais o que fazer. A minha situação é a seguinte:

Tabela Rah (Tabela de Pacientes)

-idRah (PK)
-descricao
-idConvenio (FK)

Tabela Convenio:

-idConvenio
-nome

Ai criei um relatorio pricipal com os dados de Rah e criei um Parametro chamado idConvenio.
Adicionei tambem um subreport nesse relatorio principal(Rah)
Ficou assim as propriedades do sureport:

Ai no meu subrelatorio eu criei apenas com o campo de nome do convenio.
Criei tambem um Parametro chamado idConvenio no subrelatorio.

Mas quando mando gerar ele não gera nada no subrelatorio. Alguem pode me ajudar?

wagne23

Ok hvivox, vc conhece alguma coisa de hibernate? Ou sua duvida é so em como utilizar o hibernate com o ireport?
A minha classe que gera o relatorio está assim:

public class GeraRelatorio {

    JasperPrint jpt = null;

    public void geraRelatorio(Collection data) throws JRException, Exception {
        Map parameters = new HashMap();
        jpt = JasperFillManager.fillReport("RAH.jasper", parameters, new JRBeanCollectionDataSource(data, false));
        JasperViewer.viewReport(jpt, false);
    }
}

Então da minha aplicação eu instancio essa classe e chamo o metodo geraRelatorio passando um list de todos os os cadastros de Rah(Pacientes) que eu busquei com o hibernate.

private DaoRah dao = new DaoRah();
new GeraRelatorio().geraRelatorio(dao.listarTodos());

e a classe daoRah está assim:

public class DaoRah implements DaoGenerica<Rah> {

    private Session session;
    Transaction tx = null;

public List<Rah> listarTodos() {
        List<Rah> p = null;
        try {
            session = HibernateUtil.getSession();
            tx = session.beginTransaction();
            p = this.session.createCriteria(Rah.class).list();
        } catch (HibernateException e) {
            e.printStackTrace();
            tx.rollback();
        } finally {
            session.close();
        }
        return p;
    }

Claro que de modo resumido, esse metodo listarTodos que vai me retornar o list para passar para o relatorio.
Acho que resumindo é isso.

wagne23

Respondendo a sua pergunta raf4ever na opção ‘When no Data’ tem ‘No Pages’.

hvivox

parceiro! faz assim me envie o seu email via mensagem privada aqui msm pelo forum. Dessa forma vou lhe enviar uns modelos de subrelatorio que tenho aqui pronto.
O passo a passo lhe envio a noite sem falta qdo tiver um tempo.

blz

hvivox

Qto ao hibernate nao tenho duvidas, minha duvida é mais no como gerar relatorio c/ hibernate.

R

Mude para ‘All Sections,No Details’ e veja se aparece o relatório.

R

hvivox:
Qto ao hibernate nao tenho duvidas, minha duvida é mais no como gerar relatorio c/ hibernate.

Cara confesso que ainda não consegui entender a dificuldade :lol:

Se no fim das contas vc vai trabalhar com uma lista de objetos,qual a diferença de ser JDBC ou Hibernate?

Vc teria um exemplo de código em q vc tenta gerar o relatório usando Hibernate?

wagne23

raf4ever, mudei como vc disse e continua sem buscar o convenio do paciente. Olha como ficou.
Eu coloquei como teste o parametro idConvenio para imprimir e ele sai como null, e coloquei tambem a propriedade idConvenio e essa sim vem com valor, o que está parecendo é que ele não está ligando o parametro com o valor da propriedade.

hvivox

raf4ever:
hvivox:
Qto ao hibernate nao tenho duvidas, minha duvida é mais no como gerar relatorio c/ hibernate.

Cara confesso que ainda não consegui entender a dificuldade :lol:

Se no fim das contas vc vai trabalhar com uma lista de objetos,qual a diferença de ser JDBC ou Hibernate?

Vc teria um exemplo de código em q vc tenta gerar o relatório usando Hibernate?

Então, minha duvida é especificamente como passar uma LIST por parametro para dentro do relatórios, atualmente trabalho assim:
meu relatorio tem data inicio e fim, para isso passo por parametro um dateInicio e dateFim, apenas isso, minha duvida é como passo um list? para dentro do relatorio? utilizando o hibernate?

att.

wagne23

Então hvivox. vc viu o meu exemplo anterior, la eu mostrei como passar esse list para o relatorio:

Codigo que gera o relatorio passando um list.

JasperPrint jpt = null;

    public void geraRelatorio(Collection data) throws JRException, Exception {
        Map parameters = new HashMap();
        jpt = JasperFillManager.fillReport("RAH.jasper", parameters, new JRBeanCollectionDataSource(data, false));
        JasperViewer.viewReport(jpt, false);
    }

Repare que esse metodo recebe uma collection como parametro, então vc so precisa fazer a sua pesquisa com data inicio e data fim (Com hibernate ou JDBC)e colocar esse retorno dentro de um list, ai vc passa esse list para o metodo, ai é gerado o relatorio

wagne23

So uma observação que ainda continuo com problemas para gerar esse subrelatorio.

R

wagne23:
raf4ever, mudei como vc disse e continua sem buscar o convenio do paciente. Olha como ficou.
Eu coloquei como teste o parametro idConvenio para imprimir e ele sai como null, e coloquei tambem a propriedade idConvenio e essa sim vem com valor, o que está parecendo é que ele não está ligando o parametro com o valor da propriedade.

Vc criou esse ‘idConvenio’ no relatorio pai e no subreport?

wagne23

Sim

R

Então é simples.

Abra a aba Propriedades do seu subreport(clique no subreport dentro do relatório pai) e na opção ‘Parameters’ mapeie o parametro que deseja.

hvivox
wagne23:
Então hvivox. vc viu o meu exemplo anterior, la eu mostrei como passar esse list para o relatorio:

Codigo que gera o relatorio passando um list.

JasperPrint jpt = null;

    public void geraRelatorio(Collection data) throws JRException, Exception {
        Map parameters = new HashMap();
        jpt = JasperFillManager.fillReport("RAH.jasper", parameters, new JRBeanCollectionDataSource(data, false));
        JasperViewer.viewReport(jpt, false);
    }

Repare que esse metodo recebe uma collection como parametro, então vc so precisa fazer a sua pesquisa com data inicio e data fim (Com hibernate ou JDBC)e colocar esse retorno dentro de um list, ai vc passa esse list para o metodo, ai é gerado o relatorio

Entedi a logica do codigo java mas.... no relatorio propriamento dito? como preparar o relatorio para receber um list ao inves de uma Query? no meu caso meu relatorio está configurado assim:

<parameter name="ParanDataInicial" class="java.util.Date">
		<parameterDescription><![CDATA[Data inicial]]></parameterDescription>
		<defaultValueExpression><![CDATA[new Date()]]></defaultValueExpression>
	</parameter>
	<parameter name="ParanDataFinal" class="java.util.Date">
		<parameterDescription><![CDATA[Data final limite do parametro]]></parameterDescription>
		<defaultValueExpression><![CDATA[new Date()]]></defaultValueExpression>
	</parameter>
	<parameter name="DiretorioImagens" class="java.util.List" isForPrompting="false">
		<defaultValueExpression><![CDATA["br/com/sisportaria/visao/resources/icones/"]]></defaultValueExpression>
	</parameter>
	<queryString>
		<![CDATA[SELECT
     visitante.`Vis_nome` AS visitante_Vis_nome,
     setor.`Set_nome` AS setor_Set_nome,
     registrovisita.`Reg_dataVisita` AS registrovisita_Reg_dataVisita,
     registrovisita.`Reg_horaEntrada` AS registrovisita_Reg_horaEntrada,
     registrovisita.`Reg_horaSaida` AS registrovisita_Reg_horaSaida,
     registrovisita.`Reg_usuarioLogado` AS registrovisita_Reg_usuarioLogado
FROM
     `visitante` visitante INNER JOIN `registrovisita` registrovisita ON visitante.`Vis_codigo` = registrovisita.`Reg_Vis_codigo`
     INNER JOIN `colaborador` colaborador ON registrovisita.`Reg_Col_codigo` = colaborador.`Col_codigo`
     INNER JOIN `setor` setor ON colaborador.`Col_Set_codigo` = setor.`Set_codigo`
WHERE
     registrovisita.`Reg_status` = "Encerrado" and
     registrovisita.`Reg_dataVisita` between $P{ParanDataInicial} and $P{ParanDataFinal}
ORDER BY
     registrovisita.`Reg_dataVisita` ASC,
     registrovisita.`Reg_horaEntrada` ASC,
     registrovisita.`Reg_horaSaida` ASC]]>
	</queryString>

Estou utilizando queryString tenho que substituir a list ou coisa parecida essa é minha grande duvida. Alguém se abilita a responder???

att

hvivox

Este link mostra passo-a-passo como criar subrelatorios e além disso ensina atrabalhar com array. http://www.furutani.com.br/2009/02/tutorial-de-jasperreports-usando-arraylist-de-vo/

hvivox

Ainda continuo como duvidas para configurar o relatorio no iReport para receber um list.

Alguém pode ajudar?

wagne23

hvivox , vc viu o exemplo que eu mostrei. La mostra como configurar o ireport para receber um list.

JasperPrint jpt = null;

    public void geraRelatorio(Collection data) throws JRException, Exception {
        Map parameters = new HashMap();
        jpt = JasperFillManager.fillReport("RAH.jasper", parameters, new JRBeanCollectionDataSource(data, false));
       // passa para o metodo fillReport um JRBeanCollectionDataSource
       //com a list que vc recuperou do banco
        JasperViewer.viewReport(jpt, false);
    }
hvivox
jpt = JasperFillManager.fillReport("RAH.jasper", parameters, new JRBeanCollectionDataSource(data, false));

O erro está ocorrendo neste parantro new JRBeanCollectionDataSource(data, false) acredito que seja configuração no relatorio

Não entendo uma coisa! vc tem que ter um consulta para ser mostrado o fieldName, pelo query report depois disso vc associa o fieldname ao TextField correto? se eu nao tiver nenhum consulta então como faço isso??

hvivox

hvivox:
jpt = JasperFillManager.fillReport("RAH.jasper", parameters, new JRBeanCollectionDataSource(data, false));

O erro está ocorrendo neste parantro new JRBeanCollectionDataSource(data, false) acredito que seja configuração no relatorio

Não entendo uma coisa! vc tem que ter um consulta para ser mostrado o fieldName, pelo query report depois disso vc associa o fieldname ao TextField correto? se eu nao tiver nenhum consulta então como faço isso??

alguém pode dar um força ???

wagne23

Mas qual o erro que está dando? Faça Assim no relatorio, no ireport em query report selecione em Query language o tipo para hibernate Query language, e escreva a query em HQL tipo:

Para isso vc tem que ter adicionado o jar da sua aplicação no ireport.
Ai ele vai disponobilizar os campos do seu “bean” para adicionar como variaveis e poder colocar no seu relatorio associando aos TextFields.

hvivox

wagne23:
Mas qual o erro que está dando? Faça Assim no relatorio, no ireport em query report selecione em Query language o tipo para hibernate Query language, e escreva a query em HQL tipo:

Para isso vc tem que ter adicionado o jar da sua aplicação no ireport.
Ai ele vai disponobilizar os campos do seu “bean” para adicionar como variaveis e poder colocar no seu relatorio associando aos TextFields.

Certo! já estou conectando o iReport com o hibernate.

Mas… além do que vc informou é necessario fazer outro tipo de configuração para que o relatorio receba um LIST?

Por que tudo isso q vc informou já estou fazendo. o iReport o relatorio roda. Mas quando executo o relatorio pelo iReport não jogo um list para ele, correto. Mas quando rodo pela aplição eu preciso jogar um LIST para o relatorio.

wagne23

Não ha necessidade de fazer outra configuração. Ele ta retornando algum erro?
Só a observação de que vc tem que passar um JRBeanCollectionDataSource para o metodo fillReport, sendo que o seu List vc passa no construtor do JRBeanCollectionDataSource.

JasperPrint jpt = null; Map parameters = new HashMap(); jpt = JasperFillManager.fillReport("SeuRelatorio.jasper", parameters, new JRBeanCollectionDataSource(seuListPreenchido, false)); JasperViewer.viewReport(jpt, false);

Criado 23 de setembro de 2010
Ultima resposta 1 de out. de 2010
Respostas 31
Participantes 4