Mathues, você é o cara!!! Valeu mesmo pela dica. Funcionou beleza!! Foi um
erro de principiante mesmo!!! Mas eu nem sou programador profissional!!
Faço mais como hobby e porque gosto mesmo! Tudo que aprendi sobre Lógica,
Java, SQL, PostgreSQL e iReport foi pela Net em apostilas e vídeo aulas.
Graças a pessoas como vc, em fóruns de discussão sobre esses assuntos que
eu adquiro mais conhecimentos. Minha formação profissional é de
Farmacêutico-Bioquímico. Esse relatório faz parte de um programinha que
desenvolvi para o meu trabalho, para facilitar a minha vida e a dos meus
colegas farmacêuticos, com a finalidade de levantar os atendimentos
diários, mensais e anuais, uma estatística de receitas atendidas por dia,
mês e ano (SUS e Particular), análise percentual (SUS x Particular) por
Período, Máximo e Mínimo de Atendimentos por Período, pois o  sistema que
possuímos na farmácia, apensar de capturar essas informações, não apresenta
nenhum relatório para mostrá-las, sendo que essa coleta de informação antes
era realizada manualmente em uma planilha e compilada no fim do mês para
ser enviada à matriz.

um grande abraço


Em 30 de outubro de 2013 12:16, Matheus de Oliveira <
[email protected]> escreveu:

>
>
>
> 2013/10/30 Ramiro Pamponet <[email protected]>
>
>> Bom dia Pessoal,
>>
>> utilizo a seguinte query abaixo para montar um relatório no 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)
>>
>> -------------------------------------------------------------------------------------------------------------
>> ... onde os parâmetros $P{ano_ini}, $P{ano_fim}, $P{mes_ini} e
>> $P{mes_fim} são passados pelo programa com DOUBLE e na configuração dos
>> parâmetros no relatório eu os declaro  assim - new Double(valor).
>>
>> O relatório funciona perfeitamente, se for considerado um período entre
>> os meses de 1 a 12 dentro do mesmo ano ou se for considerado todos os meses
>> de vários anos, mesmo o ano não tendo acabado ainda.
>>
>> Para minha surpresa, estava realizando alguns teste no programa e percebi
>> o seguinte bug: considerando o mês inicial = 1, o ano inicial = 2005, o mês
>> final = 5 e o ano final = 2006 (por exemplo), o relatório rea montado da
>> seguinte forma ...
>>
>> Ano           Mês            Atendimentos
>> 2005          1                xxx
>> 2005          2                xxx
>> 2005          3                xxx
>> 2005          4                xxx
>> 2005          5                xxx
>> 2006          1                xxx
>> 2006          2                xxx
>> 2006          3                xxx
>> 2006          4                xxx
>> 2006          5                xxx
>>
>> ... pulando os meses 6 a 12 do ano de 2005 (por exemplo).
>>
>>
>
> O seu erro nesse caso é considerar a parte de mês - EXTRACT(MONTH FROM
> data) - e ano - EXTRACT(YEAR FROM data) - de forma independente, e não
> uni-los numa mesma verificação.
>
>
>
>> Em um fórum do GUJ fui orientado a modificar minha query da seguinte
>> forma ...
>>
>> -------------------------------------------------------------------------------------------------------------
>> 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) || extract(month from dat_emissao)
>> between $P{ano_ini} || $P{mes_ini} and $P{ano_fim} || $P{mes_fim}
>> group by dat_emissao, nom_filial, est_filial order by dat_emissao) as
>> registro
>> where extract(year from dat_emissao) || extract(month from dat_emissao)
>> between $P{ano_ini} || $P{mes_ini} and $P{ano_fim} || $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)
>>
>> -------------------------------------------------------------------------------------------------------------
>> ... que resolveu meu problema em parte, pois dessa forma pega todos os
>> meses do intervalo de ano selecionado, mas no último ano, se ainda não
>> tiver sido concluído (exemplo 2013) ele pega apenas o 1º e o último mês do
>> intervalo, pulando todos os outros meses do ano, mas se considerar apenas o
>> ano de 2013 e os meses de 1 a 10, o relatório sai correto, ou se considerar
>> apenas anos que já foram concluídos, ou então, sempre considerar o mês
>> inicial = 1 e o mês final = 12.
>>
>>
> Nesse caso solucionaria o problema que citei, mas agora você gerou outro
> problema, está concatenando campos do tipo inteiro, o que significa que
> resultaram num tipo texto (string), daí as verificações de ordenação e no
> BETWEEN irão considerar a ordem alfabética, por exemplo, a Fevereiro de
> 2013 vem antes (é menor) que Novembro de 2013, mas se considerarmos a
> concatenação de strings, teremos '20132' para Fevereiro e '201311' para
> Novembro, daí se ordenarmos alfabeticamente vamos ter que Fevereiro depois
> (maior que) de Novembro.
>
>
>
>> Existe alguma forma de juntar o que está dando certo no 1º relatório com
>> o que está dando certo no 2º relatório?
>>
>> As sugestões serão bem vidas!
>>
>>
> Quanto às soluções, temos infinitas, uma delas é adicionar um 0 para os
> meses menores que Outubro (10), por exemplo, Fevereiro de 2013 ficaria
> '201302' e não '20132'. Para gerar a string dessa forma, podemos usar a
> função to_char:
>
> 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 to_char(CAST(dat_emissao AS timestamp), 'YYYYMM')
>     between to_char($P{ano_ini}, '0000') || to_char($P{mes_ini}, '00')
>         and to_char($P{ano_fim}, '0000') || to_char($P{mes_fim}, '00')
>  group by dat_emissao, nom_filial, est_filial order by dat_emissao
> ) as registro
> where to_char(CAST(dat_emissao AS timestamp), 'YYYYMM')
>     between to_char($P{ano_ini}, '0000') || to_char($P{mes_ini}, '00')
>         and to_char($P{ano_fim}, '0000') || to_char($P{mes_fim}, '00')
> group by extract(year from data), extract(month from data), unidade, estado
> order by extract(year from data), extract(month from data)
>
>
> Outra possível solução seria usando o date_trunc, mas a acima me parece
> mais simples e eficaz.
>
>
>
>> Obrigado aos que puderem me dar essa ajuda
>>
>>
>
> Sussa.
>
> PS: Não analisei sua consulta inteira (só foquei nos filtros de data), mas
> tem certeza que precisa dessa sub-consulta aí? Parece que podia fazer
> direto.
>
> Abraços.
> --
> Matheus de Oliveira
> Analista de Banco de Dados
> Dextra Sistemas - MPS.Br nível F!
> www.dextra.com.br/postgres
>
>
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a