iReport - Paginas com layouts diferentes mas com mesmo cabecalho+rodape

Pessoal,

Estou desenvolvendo meu primeiro relatório utilizando iReport e to me quebrando todinho hehe…

Estou precisando fazer um relatorio que segue a seguinte estrutura:

1 cabecalho;
1 rodape;
4 paginas, cada ums com seu proprio layout e conteudo, mas todas as 3 com o mesmo cabecalho e rodape.

fazendo apenas uma analogia, em xml seria algo como isso:

ou seja, todas as 4 paginas tem o mesmo cabecalho e rodape e o corpo de cada pagina tem seu proprio layout e sua propria fonte de dados.

pelo que pesquisei por aih (posso estar enganado) parece que a melhor opcao é eu fazer um relatorio separado para cada pagina e entao faria um relatorio com o cabecalho e rodape e apenas colocaria as pagians como subrelatorios. Então, fiz os subrelatorios apenas com textos estaticos para testar e nao estou conseguindo exibir cada subrelatorio em uma pagina diferente. Tb tentei inserir quebra de pagina e nao tive sucesso… no desenho do relatorio fica o elemento quebra de pagina, mas quando executo o relatorio aparece todo o conteudo numa mesma pagina.

alguem sabe como resolver?

[]'s

Bom, vamos tentar… rs…

Olha, vc comecou certo. Então vamos lá, por partes ver se conseguimos fazer o que vc quer. Eu tenho um caso aqui que faço exatamente o que vc tá precisando, mas no meu caso tenho 7 layouts diferentes! Enfim, fiz assim: (OBS: as bandas q eu não falar nada é pq nao coloquei nada)

PAGEHEADER:
Coloquei o cabeçalho que desejo que apareça sempre

PAGEFOOTER e LASTPAGEFOOTER:
Coloquei o rodapé que desejo que apareça sempre (tb acho ridículo isso, mas se coloco só no pagefooter ele mostra em todas as páginas menos na última, então tem que repetir o rodapé nessas duas bandas… :? )

QUEBRA:
Criei uma quebra pro meu relatório, alguns chamam de “agrupamento”, sei lá, como quiser. Especifiquei que ele deve quebrar sempre que o campo “layout” mudar. Coloque nela as opções “Start on a new page” e “Print header on each page”.

DETAIL:
Coloquei meus 7 subrelatorios. No seu caso, os seus 4. Coloque todos os 4 dentro desse detail, um grudadinho no outro, um embaixo do outro. Pra cada um deles vc configura os parâmetros e o jasper que deve chamar normalmente como vc já deve ter feito. Além disso, o “pulo do gato” é marcar a opção “Remove line when blank” e tb preencher a opção “Print when expression”. Para essa última, utilize em cada um dos subrelatorios uma condição assim:
$F{layout} == 1 // para o primeiro subrelatorio
$F{layout} == 2 // para o segundo subrelatorio
$F{layout} == 3 // para o terceiro subrelatorio
$F{layout} == 4 // para o quarto subrelatorio

Bem, agora qto a selecao dos dados, nos subrelatorios vc faz o layout que desejar e seleciona os dados como desejar. Agora, o outro “pulo do gato” está no SQL do relatório principal. Eu fiz o meu de forma q ele retorne os dados que precisam ser passados pros subrelatorios (pra q eles façam seus selects) e tb retorne qual o layout que deve ser usado. Isso é muito importante.

Então, só pra te dar um exemplo, no meu select tem algo assim:

Select mov.*, (case when mov.campo1 = 'blablabla' then 1 when mov.campo1 = 'xxx' and mov.campo2 = 'zzz' then 2 when mov.campo3 = 'zica' then 3 else 4 end) as layout from tabela mov where ....

Bom, em resumo é isso ai, te garanto que funciona pq faço aqui. Se não entender ou enroscar em algo grita! Eu não sei se consegui explicar direito minha idéia… :oops:

Oi, Renata!

Então… depois de pesquisar bastante e não achar nenhuma solução, fiquei pensando, pensando, pensando… rss… até que bolei uma solução… é bem parecida com a sua mas acho que tem algumas vantagens, como:

  • não precisa colocar LASTPAGEFOOTER
  • não precisa colocar 4 subreports
  • não precisa pedir pra limpar as linhas em branco
  • não precisa colocar a condição em “Print when expression”
  • não preciso do SQL pra saber qual relatório exibir
  • funciona para n páginas (não fica limitado a 4 ou 7 páginas)

Como fonte de dados estou usando um JRDataSource pra cada subreport, ao invés de conexão com o banco e, basicamente, o que eu fiz foi criar uma hierarquia de classes e uma classe que faz todo esse trabalho pra controlar as quebras de página.

Como não estou mais no trabalho, n tou nem com o código aqui pra dar mais detalhes. Mas vou ver se consigo preparar um artigo e posto no GUJ como uma alternativa pra o pessoal resolver esse problema.

Bjs

Gostaria de ver como ficou esta implementação.

Sim, tb quero ver…

  • não precisa colocar LASTPAGEFOOTER [color=red]-&gt essa eu quero ver como vc faz[/color] :wink:
  • não precisa colocar 4 subreports
  • não precisa pedir pra limpar as linhas em branco
  • não precisa colocar a condição em "Print when expression"
  • não preciso do SQL pra saber qual relatório exibir [color=red]-&gt é que no meu caso o SQL não serve só pra isso, eu uso um campo a mais nele pra isso, mas eu pego diversas outras informações que preencho no cabeçalho e no header da quebra[/color]
  • funciona para n páginas (não fica limitado a 4 ou 7 páginas) [color=red]-&gt ah vc nao entendeu, não estou limitada a 4 ou 7 páginas, estou limitada a 4 ou 7 LAYOUTS. Ele imprime qtas paginas forem necessárias no total de registros…[/color]

Enfim, depois post aqui pra vermos a nova solução. :smiley:

E ae, fael, blz? Então… criei uma hierarquia com uma quantidade considerável de classes… Foi praticamente uma extensão do framework JasperReports que criei pra facilitar o desenvolvimento dos relatórios aqui da empresa. Criei umas implementações default para JRDataSource e criei umas classes que simulam o relatório com vários layouts. Tem várias classes utilitárias, várias classes abstratas e várias classes que implementam alguns casos comuns. Ainda estou fechando o pacote e como tem várias classes, pretendo depois escrever um artigo detalhando melhor, mostrando os diagramas em UML das classes e explicando basicamente a funcionalidade de cada uma. Como pretendo fazer esse trabalho um pouco mais bem elaborado e agora tou meio apertado no prazo do projeto, pois demorei um tempinho pra bolar essa estrutura, talvez demore um pouco pra sair o artigo.

[quote=RenataFA]

  • funciona para n páginas (não fica limitado a 4 ou 7 páginas) -> ah vc nao entendeu, não estou limitada a 4 ou 7 páginas, estou limitada a 4 ou 7 LAYOUTS. Ele imprime qtas paginas forem necessárias no total de registros… [/quote]

Eu entendi sim hehehe, eh que eu me expressei errado… onde tem “n páginas” leia-se “n layouts” mesmo… Para conseguir isso, ao invés de eu colocar varios SubReports e colocar a lógica para alternar entre os SubReports dentro do iReport, o caminho para o SubReport vem da aplicação Java… Assim só preciso colocar um subreport e consigo escolher o .jasper a ser carregado dinamicamente, ao invés de precisar pre definir na página do ireport. E como só tem um, não preciso me preocupar em limpar os espaços em branco.

[]'s

[quote=RafaelVS]
Eu entendi sim hehehe, eh que eu me expressei errado… onde tem “n páginas” leia-se “n layouts” mesmo… Para conseguir isso, ao invés de eu colocar varios SubReports e colocar a lógica para alternar entre os SubReports dentro do iReport, o caminho para o SubReport vem da aplicação Java… Assim só preciso colocar um subreport e consigo escolher o .jasper a ser carregado dinamicamente, ao invés de precisar pre definir na página do ireport. E como só tem um, não preciso me preocupar em limpar os espaços em branco.[/quote]

Hum! Entendi!

Pensei aqui e no meu caso não daria certo, é eu imprimo no mesmo relatório os diferentes layouts, depende de que registro foi selecionado pelo SQL do relatório principal, ai eu tenho uma quebra e o detalhe dessa quebra pode assumir qq um dos meus 7 layouts. Por isso não dá pra fazer como vc pensou. Mas no seu caso fica bom msm!

Parabéns! :lol: