Dúvida Query iReport

Bom tarde Pessoal! Possuo a seguinte query abaixo em um relatório desenvolvido pelo iReport para meu programa

select distinct unidade, estado, extract(year from data) as ano, extract(month from data) as mes, sum(vendas) as atendimentos from(
select distinct nom_filial as unidade, est_filial as estado, (dat_emissao) as data, count(dat_emissao) as vendas 
from cadcvend, cadfilia
where cadfilia.cod_filial = cadcvend.cod_filial
and flg_excluido is null 
and num_nf is null
and extract(year from dat_emissao) between $P{ano_ini} and $P{ano_fim}
and extract(month from dat_emissao) between $P{mes_ini} and $P{mes_fim}
group by dat_emissao, nom_filial, est_filial order by dat_emissao) as registro
where extract(year from data) between $P{ano_ini} and $P{ano_fim}
and extract(month from data) between $P{mes_ini} and $P{mes_fim}
group by extract(year from data), extract(month from data), unidade, estado
order by extract(year from data), extract(month from data)

acontece que percebi recentemente uma falha grave nele, pois quando se quer um período que não o ano inteiro (meses de 1 a 12) o relatório pula os meses não considerados.

Ex: mês inicial = 1 ano ; inicial = 2005 ; mês final = 7 ; ano final = 2006

Resultado: 01/2005 - 02/2005 - 03/2005 - 04/2005 - 05/2005 - 06/2005 - 07/2005 - 01/2006 - 02/2006 - 03/2006 - 04/2006 - 05/2006 - 06/2006 - 07/2006

Existe alguma forma de incluir os meses que foram ocultados na pesquisa anterior?

Ex: mês inicial = 1 ; ano inicial = 2005 ; mês final = 7 ; ano final = 2006

Resultado: 01/2005 - 02/2005 - 03/2005 - 04/2005 - 05/2005 - 06/2005 - 07/2005 - 08/2005 - 09/2005 - 10/2005 - 11/2005 - 12/2005 - 01/2006 - 02/2006 - 03/2006 - 04/2006 - 05/2006 - 06/2006 - 07/2006

Agradeço aos que puderem me ajudar

Não analisei totalmente a sua query, mas vou dar uma sugestão: use uma concatenação ano||mes, por exemplo:

e compare com a mesma coisa:

Ajeite a sintaxe do que eu escrevi que você consegue resolver seu problema.

Resolveu meu problema. Obrigado pela Ajuda!

Na verdade Resolveu em Parte! O ano de 2013 só está pegando o mês de janeiro e o último mês, no caso, outubro. Está pulando todos os outros meses do ano. Para os anos anteriores que já encerraram, está pegando tudo direito do mês 1 ao 12. Concatenei na query interna e externa, só na interna, só na externa e o problema continua. O ano de 2013 não está listando os atendimentos dos meses 2 (fevereiro) a 9 (setembro). Tem mais alguma sugestão? Agradeço!

Falei que tinha que ajustar… não funcionou porque seu parâmetro está mandando “1” em vez de “01”.

Mas existem muitas alternativas. Por exemplo, se for MySQL, use a função LPAD para colocar um zero antes dos dígitos únicos.

Olá Roselito, não posso passar o valor “01” para o parâmetro mes_ini ou mes_fim porque eles são o retorno da função extract (dat_part from date) que é um double. Então tenho que utilizar os valores 1 a 12. Na configuração do parâmetro no iReport eu os declaro assim

new Double(Valor); // sendo o Valor entre 1 e 12

Quando passo o valor para o o valor do parâmetro pelo Java utilizo a sintaxe abaixo

try {
                con = new ConexaoBD();
                parametros = new HashMap();
                parametros.put("mes_ini", Double.parseDouble(tfMesInicial.getText()));                
                parametros.put("ano_ini", Double.parseDouble(tfAnoInicial.getText()));
                parametros.put("mes_fim", Double.parseDouble(tfMesFinal.getText()));
                parametros.put("ano_fim", Double.parseDouble(tfAnoFinal.getText()));
                jp = JasperFillManager.fillReport("./Relatorios/recmensal.jasper", 
parametros, con.conecta());
                jrv = new JasperViewer(jp, false);
                jrv.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
                jrv.setVisible(true);
                jrv.setExtendedState(MAXIMIZED_BOTH);

            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "Erro ao Tentar Imprimir Relatório.");
                e.printStackTrace();
            }finally{
                con.desonecta();
            }

Do modo como eu estava fazendo, pegava apenas os meses entre o mes_ini e mes_fim do período de ano selecionado entre ano_ini e ano_fim, pulando alguns meses do ano, mas se eu considerar sempre os meses 1 e 12 o relatório sai certo. Do jeito que vc me aconselhou pegar todos os meses dos anos que já se encerraram mas no ano em curso pega apenas o primeiro mês e o mês atual, pulando todos os outros meses. Mas se eu considerar o mês final como sendo o ultimo mês já encerrado, no caso setembro, o relatório imprime todos os meses do ano já encerrados mas também imprime o mês de outubro em curso, o que não era para acontecer. Será que existe alguma forma de aproveitar o que funciona em ambos os relatórios? Dessa forma o relatório sairia certo e somente me daria o período desejado!

Obrigado pelo esforço e pelas dicas

Tem muitas maneiras de contornar. Se o seu parâmetro é gerado por um extract do banco, coloque uma função do banco onde isso acontece para gerar o que você quer. Por exemplo:

LPAD(EXTRACT(MONTH FROM data),2,“0”)

Se não aceitar LPAD para double, faça um cast.