iReport - Paginas com layouts diferentes mas com mesmo cabecalho+rodape  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
RafaelVS
JavaEvangelist
[Avatar]

Membro desde: 13/12/2006 09:50:16
Mensagens: 405
Localização: Recife - PE
Offline

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:

<relatorio>
<pagina id="1" cabecalho="cabecalho" rodape="rodape" layoutcorpo="layout1" dadosCorpo="dados1" >
<pagina id="2" cabecalho="cabecalho" rodape="rodape" layoutcorpo="layout2" dadosCorpo="dados2" >
<pagina id="3" cabecalho="cabecalho" rodape="rodape" layoutcorpo="layout3" dadosCorpo="dados3" >
<pagina id="4" cabecalho="cabecalho" rodape="rodape" layoutcorpo="layout4" dadosCorpo="dados4" >
</relatorio>

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

- Mestrando em Engenharia de Software no CIn/UFPE;
- Pós-Graduado em Engenharia de Software na POLI/UPE;
- Bacharel em Ciência da Computação na UNICAP (Universidade Católica de Pernambuco);
- Sun Certified Programmer for the Java 2 Platform, Standard Edition 5.0 (score 95%);
- Sun Certified Web Components Developer for J2EE 1.4 Platform (score 89%)
RenataFA
Virtual Machine Man
[Avatar]

Membro desde: 24/08/2006 08:15:10
Mensagens: 698
Offline

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:



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...

[]'s, Renata
[Email]
RafaelVS
JavaEvangelist
[Avatar]

Membro desde: 13/12/2006 09:50:16
Mensagens: 405
Localização: Recife - PE
Offline

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

- Mestrando em Engenharia de Software no CIn/UFPE;
- Pós-Graduado em Engenharia de Software na POLI/UPE;
- Bacharel em Ciência da Computação na UNICAP (Universidade Católica de Pernambuco);
- Sun Certified Programmer for the Java 2 Platform, Standard Edition 5.0 (score 95%);
- Sun Certified Web Components Developer for J2EE 1.4 Platform (score 89%)
faelcavalcanti
GUJ Ranger
[Avatar]

Membro desde: 03/05/2006 13:16:25
Mensagens: 960
Localização: Recife-PE
Offline

Gostaria de ver como ficou esta implementação.


--
http://faelcavalcanti.wordpress.com/ :: http://pe.debianbrasil.org/
--
Acredite um pouco mais na força de sua própria intuição. Muitas vezes deixamos de realizar algo de bom ou que nos favoreça simplesmente porque achamos tudo muito difícil e por isso nem começamos. Moral da história: A vida é o caminho e não o destino, você é o arquiteto do seu caminho!
--
Obrigado, Rafa Rocha!
[WWW]
RenataFA
Virtual Machine Man
[Avatar]

Membro desde: 24/08/2006 08:15:10
Mensagens: 698
Offline

Sim, tb quero ver...

- não precisa colocar LASTPAGEFOOTER -> essa eu quero ver como vc faz
- 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 -> é 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
- 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....

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

[]'s, Renata
[Email]
RafaelVS
JavaEvangelist
[Avatar]

Membro desde: 13/12/2006 09:50:16
Mensagens: 405
Localização: Recife - PE
Offline

faelcavalcanti wrote:
Gostaria de ver como ficou esta implementação.


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.

RenataFA wrote:
- 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....


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

- Mestrando em Engenharia de Software no CIn/UFPE;
- Pós-Graduado em Engenharia de Software na POLI/UPE;
- Bacharel em Ciência da Computação na UNICAP (Universidade Católica de Pernambuco);
- Sun Certified Programmer for the Java 2 Platform, Standard Edition 5.0 (score 95%);
- Sun Certified Web Components Developer for J2EE 1.4 Platform (score 89%)
RenataFA
Virtual Machine Man
[Avatar]

Membro desde: 24/08/2006 08:15:10
Mensagens: 698
Offline

RafaelVS wrote:
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.


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!

[]'s, Renata
[Email]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team