Agrupar datas por períodos de dias

14/03/2017

0

Bom dia pessoal,

Gostaria da ajuda de vcs para solucionar um problema:
Tenho uma tabela de notas fiscais e preciso criar uma regra para impedir que um determinado serviço seja faturado em um período inferior a N dias:

tabela nf
=======
numnota
datanf
serviço
executante
beneficiario_serviço

ex: o executante 1 na data xx/mm/yyyy realizou o serviço A para o Beneficiario_serviço Z num intervalo de N (2,4, etc) dias ele não poderá executar este mesmo serviço Z para o mesmo beneficiário_serviço. Não é necessária uma verificação quanto ao dia da semana (seg..dom) a validação é sempre sobre o período de dias independente do dia da semana. E se possível realizar a função apenas com o uso de comandos sql. A função seria para oracle e sql server.

Desde já agradeço.
Abel Dias

Abel Dias

Responder

Post mais votado

15/03/2017

Vou postar aqui a solução para oracle que usei para caso alguém necessite. No caso as faixas ficaram de 1 um em 1 dia ex: fx1 de 01/01/2016 a 02/01/2016 fx2 03/01/2016 a 04/01/2016 para outros períodos de tempo além de modificar o que vai ser somado a dt_fim de período deve-se modificar a divisão de faixas no trunc em alguns casos pode ser necessário utilizar mod.

with faixastempo as (select 0 num_periodo,

to_date('01/01/1901', 'DD/MM/YYYY') dt_ini_periodo,
to_date('02/01/1901', 'DD/MM/YYYY') - 1 dt_fim_periodo
from dual
UNION
SELECT LEVEL num_periodo, to_date('01/01/2017', 'DD/MM/YYYY') + 2 * (level - 1) dt_ini_periodo,
(to_date('02/01/2017', 'DD/MM/YYYY') + 2 * (level - 1) - 1) + 1 dt_fim_periodo
FROM dual
connect by level < trunc((to_date('02/02/2017', 'DD/MM/YYYY') - to_date('01/01/2016', 'DD/MM/YYYY')) / 2)
order by 1 asc)

select a.numtiu, fxtmp.num_periodo,
fxtmp.dt_ini_periodo || ' - ' || fxtmp.dt_fim_periodo periodo,
sum(1) totalIZA
from E09_Fatura A,
E09_Fatura_Item B,
faixastempo fxtmp

WHERE b.DTAATN BETWEEN fxtmp.dt_ini_periodo and fxtmp.dt_fim_periodo
AND B.inddonfat = A.inddonfat
AND B.numfat = A.numfat

group by a.numtiu,PE.num_periodo,
fxtmp.dt_ini_periodo || ' - ' || fxtmp.dt_fim_periodo

HAVING SUM(1) >= 2
ORDER BY fxtmpnum_periodo

Abel Dias

Abel Dias
Responder

Mais Posts

14/03/2017

Luiz Santos

Abel, bom dia.

Esses serviços são agendados previamente?
Porque, pensando no processo, você só conseguiria fazer essa verificação quando o prestador fosse executar (ou agendar) esse serviço. OU seja, quando fosse feito o imput no banco de dados.

Acredito que a melhor solução seria resolver isso na aplicação.

Grande abraço
Responder

14/03/2017

Abel Dias

Boa tarde Luiz Fernando,

Obrigado pela resposta, na realidade isto já ocorre hoje na execução, a ideia era ter este select para a realização de uma auditoria sem que a princípio tivesse que desenvolver uma solução dentro do executável.

Abraços.
Responder

14/03/2017

Luiz Santos

Abel, não entendi direito.
Você quer um relatório? Digo uma consulta que te retorne isso?

Exibir essa informação, depois que já foi feito é mais simples do que implementar uma restrição.
Responder

14/03/2017

Abel Dias

Luiz Fernando, na verdade quando fiz o post aqui no fórum eu possuía duas demandas uma para a verificação em tempo de execução e um relatório que verificasse esta mesma informação para todas as notas existentes na base. Acabei implementando a rotina para tempo de execução basicamente verificando se nos 2 ou 4 dias anteriores já foi digitada uma nf para este mesmo beneficiário com este mesmo serviço. A demanda que resta é o relatório (de preferência com comandos sql para não depender de aplicativo) onde o objetivo é verificar em um determinado período de tempo todas as situações onde executores realizaram para um mesmo beneficiário o mesmo serviço em um intervalo de 2 dias.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar