Olá Rodolfo! Pelo que entendi é o mesmo relatório que as vezes pode ter a data como filtro e as vezes não. Certo? Eu visualizo duas formas de você fazer isso, veja só: 1) Eu tenho um relatório em que além de determinados parâmetros que SEMPRE são passados, tenho a data de vencimento inicial e final que PODE OU NÃO ser informada. Para contornar esse problema fiz da seguinte forma (estou colocando parte do meu select para que entenda):
select ....
FROM tabela
where loja = $P{parLoja}
and data >= $P{parDataInicial}
and data <= $P{parDataFinal}
and .....
/* filtro pelos vencimentos quando eles tiverem sido informados */
and (case $P{parVInicial} when "N" then true else (vencto >= $P{parVenctoInicial}) end)
and (case $P{parVFinal} when "N" then true else (vencto <= $P{parVenctoFinal}) end)
and ...
order by ...
Não sei se entendeu, mas para cada data (parVenctoInicial e parVenctoFinal) eu criei um parâmetro extra (parVInicial e parVFinal) que é na verdade um flag para saber se deve ser feito o filtro pela data. Então se meu parâmetro parVInicial estiver como "N" ("Não") eu coloco TRUE e ele passa qualquer. filtro, caso contrário eu faço o filtro com o campo vencto e o parVenctoInicial.
Bem, foi uma forma que encontrei de contornar o problema.
2) Outra forma seria realmente passar um SQL dinâmico (que no seu caso, como no meu, se for só o filtro de uma data que muda eu acho que nem vale a pena, mas ai você que decide). Eu nunca fiz isso, mas descobri algo que pode te ajudar.
Estamos acostumados a passar os parâmetros assim: $P{parParametro}
Isso faz com que o conteúdo de parParametro substitua a tag $P{parParametro}. Porém existe outra forma de passar esse parâmetro que é menos usada. A forma seria: $P!{parParametro}
Para você perceber a diferença imagine que parParametro seja do tipo String e que parParametro = "10";
No relatório eu coloco:
select * from tabela where campo = $P{parParametro}
Isso montaria algo como:
select * from tabela where campo = "10"
Mas se eu fizer:
select * from tabela where campo = $P!{parParametro}
Isso montaria algo como:
select * from tabela where campo = 10
Digamos que usando $P!{parametro} você estará "macrosubstituindo" o conteúdo no SQL.
Tudo isso para te dizer que eu não testei ainda, mas eu tenho quase absoluta certeza de que se você declarar um parâmetro do tipo String e passar para ele algo assim:
if (suaCondicao)
parameters.put("parSQL", "select * from tabela");
else
parameters.put("parSQL","select * from tabela where campo = 1");
No relatório você pode simplesmente colocar assim no campo destinado a query:
$P!{parSQL} E tudo deve funcionar exatamente como você deseja, com um SQL "dinâmico". Espero ter ajudado! Boa sorte! :lol: Renata