Ireport - Criação de template

Boa tarde,

Estou com a seguinte situação: Na empresa em que trabalho tem vários sistemas que utilizam o Ireport.
Até aí tudo bem . :smiley:
O problema é que gostaria de criar algo parecido com um template, ou seja, que tenha um cabeçalho e um rodapé e que os sistemas chamassem esse template que teria um parâmetro para receber o nome do .jasper do ‘corpo’ do relatório.
Assim teria na empresa certeza que todos os relatórios teriam a mesma ‘cara’.
Bom criei um relatório com cabeçalho e um rodapé que tem a logo da empresa, um parâmetro chamado nomeSistema, nomeRelatorio e um parâmetro chamado rodapé .
Como sou novata no uso do ireport, gostaria de saber qual a melhor forma de tratar esse parâmetro de corpo, ou se existe uma outra solução para o meu dilema. :?:

Utilizo a versão: iReport 3.0.0

grata,

Renata

Renata,

Você pode tratar esse corpo do relatório usando subreport, na chamada do subreport você passa esse parametro que você criou com o nome do relatório “.jaspe”.

No sistema você pode criar uma classe de enumaração com os nomes do seu relatório, e toda vez que for chamar um relatório vc chama essa classe para passar para o parêmetro do iReport.
Uma outra forma também seria criar um arquivo properties e mapear lá os nomes dos relátorios para serem passados como parâmetro para o iReport.
Vai depender também se sua aplicação é web ou desktop para escolher a melhor forma.

Se não estiver muito claro mande mais detalhes do que está utilizando p/ eu tentar detalhar mais…

T+

Obrigada por me ajudar !!!

Mas ainda não entendi isso certinho …
Que tipo de detalhe … :?:
Pois ainda tenho duvidas :cry:

No meu arquivo de template não tem nada que use conexão com o banco.
Já na parte que vai ser o corpo ou seja os sub relatórios eu tenho que usar uma conexão.
Quando mando pegar a conexão do template e o ireport não gera nada : paginas geradas = 0.

Quando tento por no detail do meu template um subrelario abri uma tela com as seguintes opções:
Criar um novo relatório ? Essa opção eu posso utilizar pois os relatório que irá compor o corpo já existe.
Usando um relatório existente ? Aqui não posso passar uma parâmetro
Just create de supreport element ? Usei essa opção e na abas de propriedades eu coloquei assim:
Na aba de subrelatorio estou usando o $P{REPORT_CONNECTION} para usar a aconexão do relatório.
Na aba subrelatorio Outro ? uso uma string como expressão: $P{SUBREPORT_DIR} + $P{NOMERELATORIO}
Ele compila sem erro . mas quando vou executar usando conexão ativa o ireport aparece
Preenchendo relatório …
Região: português (Brasil)
Fuso Horário:
Padrão Tempo de execução do preenchimento do relatório: 500. (páginas geradas: 0 )

Ele não gera nada, agora se executar, o template sem corpo funciona e se gerar o corpo sem template funciona e ele mostra os registro vindo do banco.

         :idea:  Uma luz por favor !!! Não sei onde estou errando. 

grata,

Renata

[quote=renatams]Obrigada por me ajudar !!!

Mas ainda não entendi isso certinho …
Que tipo de detalhe … :?:
Pois ainda tenho duvidas :cry:

No meu arquivo de template não tem nada que use conexão com o banco.
Já na parte que vai ser o corpo ou seja os sub relatórios eu tenho que usar uma conexão.
Quando mando pegar a conexão do template e o ireport não gera nada : paginas geradas = 0.

Quando tento por no detail do meu template um subrelario abri uma tela com as seguintes opções:
Criar um novo relatório ? Essa opção eu posso utilizar pois os relatório que irá compor o corpo já existe.
Usando um relatório existente ? Aqui não posso passar uma parâmetro
Just create de supreport element ? Usei essa opção e na abas de propriedades eu coloquei assim:
Na aba de subrelatorio estou usando o $P{REPORT_CONNECTION} para usar a aconexão do relatório.
Na aba subrelatorio Outro ? uso uma string como expressão: $P{SUBREPORT_DIR} + $P{NOMERELATORIO}
Ele compila sem erro . mas quando vou executar usando conexão ativa o ireport aparece
Preenchendo relatório …
Região: português (Brasil)
Fuso Horário:
Padrão Tempo de execução do preenchimento do relatório: 500. (páginas geradas: 0 )

Ele não gera nada, agora se executar, o template sem corpo funciona e se gerar o corpo sem template funciona e ele mostra os registro vindo do banco.

         :idea:  Uma luz por favor !!! Não sei onde estou errando. 

grata,

Renata

[/quote]

Olá xará! :wink:

Então, se eu entendi direito, vc tem um jasper que vc chama de template que tem o cabeçalho e o rodapé, tudo padronizadinho e ai, onde seria o corpo do relatório vc chama outros jaspers usando subrelatório, né? Achei legal a idéia, fica sempre padronizado.

Bom, seu problema está que se chama só o template funciona e se chama só o jasper do corpo do relatório tb funciona. Não funciona quando chama os dois juntos. Bem, esse problema é característico quando por algum motivo o relatório principal (o seu template) está deixando de enviar algo necessário ao subrelatorio (seu corpo).

Bem, não entendi direito como vc fez, mas vamos lá, eu faço assim:

  • adiciono um component subreport no relatório principal
  • vou nas propriedades dele
  • na aba subreport, no campo connection/data source expression coloque $P{REPORT_CONNECTION}
  • na aba subreport (other), na subreport expression eu passo o caminho do relatório que deverá ser chamado e se tiver algum parâmetro que vc precise passar pro corpo (como algo que possa ser usado nos filtros, etc…) vc passa ali na subreport parameters.

É bem simples e me parece que foi justamente o que vc fez. Eu desconfio que o seu problema esteja no caminho do sub-relatório.
Parece que vc passa isso: $P{SUBREPORT_DIR} + $P{NOMERELATORIO}
Tente colocar isso ai pra imprimir em algum canto do seu relatório template, para que vc possa visualizar se ele está montando o caminho certo.

Bem, tente ai, qq coisa vc grita denovo.

Boa sorte! :wink:

Oi Xará :smiley: ,

Vc entendeu direitinho o que eu quero fazer.
Já estou cansada e não descubro o que estou fazendo errado.
Fiz exatamente como vc falou que vc faz, e NADA :cry: .

Imprimi os valores de $P{SUBREPORT_DIR} + $P{NOMERELATORIO} e apareceu certo:
$P{SUBREPORT_DIR} = D:\Sistemas\TESTE - Projeto\relatorios
$P{NOMERELATORIO} = T_master.jasper.

Vc tem alguma outra idéia ?

Vc disse que qdo roda o corpo sem o template ele funciona, certo?

Me diga, pra rodar o corpo sem template, vc passa algum valor de parâmetro pra ele? Como vc faz na verdade?

Renata,

Quando rodo o corpo sem o template ele funciona.

O corpo é um relatório que tbm tem um subrelatorio, ou seja o corpo é composto de um relatório chamado T_master.jasper que chama o subrelatorio T_filho.jasper.

No subrelatorio do template faço assim: Na expressão de sub-relatório passo os seguintes parâmetros: $P{SUBREPORT_DIR} + $P{NOMERELATORIOCORPO} e só não passo mais parâmetro nenhum.

O [i]T_master.jasper[/i]  tem um parâmetro chamado SUBREPORT_DIR. 
E o  [i]T_filho.jasper[/i]. tem um parâmetro que é o EQA_NU . que é o valor que liga ele com o [i]T_master.jasper[/i].

E o relatório template tem 4 parâmetros :
[list]NOMESISTEMA[/list] Que recebe o nome do sistema que o relatório faz parte para aparecer no cabeçalho .
[list]NOMERELATORIO[/list] Que recebe o nome do relatório que será gerado como corpo para aparecer no cabeçalho .
[list]RODAPE[/list] mensagem que será exibida no rodapé do relatório
[list]SUBREPORT_DIR.[/list] Caminho aonde esta o subrelatorio
[list]NOMERELATORIOCORPO[/list] nome do .jasper do relatório que ira compor o corpo. Nesse caso o T_master.jasper.

Mas nada acontece. :roll: Será que estou passando algo errado ou será que falta passar algo ?

O que será que falta fazer ? :?

Att,

Renata

renatams

… tente fazer alguns testes do tipo retirar os parâmetros que você passa para o subrelatório e colocar valores fixos.

eu já tive alguns problemas com parâmetros na ligação de subreports não sei se pelo fato de usarmos Windows em algums máquinas e Linux em outras. ( sem explicação )… enfim…

OI,

Tentei setando oso valores e mesmo assim , não deu certo.
Acho que deve ser algo na conexão ativa do relatório.
Será que tenho que setar algo …

att,

Renata

renatams

… fiz o seguinte teste aqui:

  • criei um relatório principal e um subrelatório como você fez aí.
  • No relatório principal eu não coloquei nehuma SQL e ao executar o relatório não trazia nenhuma onformação.
  • criei uma SQL no relatório principal “selec * from tabela_pequena” e ao executar o relatório me trouxe os dados como eu queria.

:lol: FUNCIONOU !!! :lol:

Obrigada !!!

:?: Só que não entendi pq ?
Se no meu relatorio_template eu não uso nenhuma query, porque ele tem que fazer uma para funcionar ? :?:
Eu coloque um select que não tem nada a ver com o relatório. E ele funcionou bonitinho !!!

Att,

Rê.

Legal…

… também não sei explicar…

Se alguém souber o segredo de tostines, posta aê p/ gente…

T+

:shock: …Mistério … :shock:

Olá ,

Um colega me deu a seguinte explicação:

é isso pessoal !!!

intê.
Renata

[quote=augusto_ab]Legal…

… também não sei explicar…

Se alguém souber o segredo de tostines, posta aê p/ gente…

T+[/quote]

A explicação até q é fácil.

Cada relatório só é gerado se ele tiver algo para iterar (1,2,3,4… registros).

no caso de ele não possuir nenhum registro para ser iterado, o iReport toma uma das seguintes decisões:

  • Gera um relatório normalmente (ex.: PDF) , porém sem nenhum conteúdo. (quando vc tentar abrir, receberá uma mensagem do Adobe)
  • Gera 1 página em branco sem registro algum.
  • Gera 1 página com todas as Bandas (exceto a banda Detail, afinal, não há dados para serem iterados)
  • Gera o relatório com os dados que estiverem na banda NO-DATA-SECTION

Isso, vc pode configurar em:
Editar => Propriedades do Relatório => Mais… => Quando Sem Informações

Vale lembrar que, caso vc queira, por exemplo, utilizar o 1° jasper apenas como “ponte” para chegar nos outros jasper, e evitar que ele diga que não há dados, vc pode forçar ele a iterar pelo menos 1 vez.

Pra isso, vc precisa usar nele uma “fonte de dados vazia”:

Vá em:
Data => Conexões => Novo => Fonte de Dados Vazia

No input, basta vc selecionar quantos registros “vazios” vc quer.

no seu caso, basta ter 1.

Espero ter ajudado de alguma forma…

Abraços,
Daniel