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: