PDA

View Full Version : Verificar se é Feriado



Benedito
5-Nov-2019, 10:17 AM
Boa tarde,

Pessoal, tenho uma View com campos tipo "Fim da Vigência" e "Data de Comprovação"
PRECISO verificar se "Fim da Vigência" não é sábado, Domingo ou feriado, para isto vou usar a minha tabela de feriados. tenho esta Procedure para RELATÓRIOS, agora quero usar numa View. Alguem tem alguma coisa nestye sentido que possa me ajudar?

Salvadori
5-Nov-2019, 12:10 PM
Boa tarde,

Pessoal, tenho uma View com campos tipo "Fim da Vigência" e "Data de Comprovação"
PRECISO verificar se "Fim da Vigência" não é sábado, Domingo ou feriado, para isto vou usar a minha tabela de feriados. tenho esta Procedure para RELATÓRIOS, agora quero usar numa View. Alguem tem alguma coisa nestye sentido que possa me ajudar?


não sei se entendi direito mas o processo mais ou menos é:

1º Carrega uma variável com a data que o usuário informou.
2º Testa o DateGetDayOfWeek da sua váriavel data ele não pode ser 7, nem 1. ((DateGetDayOfWeek(dDataCaixa) <> 7) and (DateGetDayOfWeek(dDataCaixa) <> 1))
3º Posiciona a tua tabela com essa data, não pode achar registros na tabela.

como não sei se teu db é embedded ou sql vou fazer no db nativo que funciona em ambos db (não testei então ignora erros básicos por favor)

por ex:





Date dDataAtual

Sysdate dDataAtual

Get fValidaDataUtilFeriado dDataAtual to bContinuar

Function fValidaDataUtilFeriado Date pdData Returns Boolean
If ((DateGetDayOfWeek(pdData) = 7) or (DateGetDayOfWeek(pdData) = 1)) Function_Return False

Clear FERIADO
Move pdData to FERIADO.DATA
Find Eq FERIADO by 1
If (Found) Function_Return False

Function_Return True
End_Function



se ficou confuso me deixe saber, um abraço

Vitor_MS
8-Nov-2019, 08:48 AM
Olá Benedito..

Eu tenho uma tabela chamada "MesDia" com todos os dias dos meses cadastrados.
A geração desse "calendário" é automática com rotina.
Nessa tabela eu marco os dias que não são úteis. (Sáb,Dom,Feriados)

Dessa forma, sempre que vou fazer um lançamento no contas a pagar verifico se é dia útil, prorrogando o prazo da previsão do pagamento para o próximo dia útil disponível.

Att. Vitor

Benedito
20-Nov-2019, 10:42 AM
Continuando, fiz esta procedure mas está faltando alguma coisa, alguem se habilita?

Procedure PrepararData

Move true to bFeriado
Repeat
Clear Feriados
Move (Cadconcessao.Fim_da_Vigencia) to Feriados.Data
Find eq Feriados by 1
If (Found) Move (Cadconcessao.Inicio_da_Vigencia + 60) to Cadconcessao.Fim_da_Vigencia
Else Move False to bFeriado
Until(not(bFeriado))
If ((DateGetDayOfWeek(Cadconcessao.Fim_da_Vigencia)) = 1) Move (Cadconcessao.Fim_da_Vigencoa + 1) to Cadconcessao.Fim_da_Vigencia
If ((DateGetDayOfWeek(Cadconcessao.Fim_da_Vigencia)) = 7) Move (Cadconcessao.Fim_da_Vigencia + 2) to Cadconcessao.Fim_da_Vigencia
Move True to bDataBoa
Clear Feriados
Move Cadconcessao.Fim_da_Vigencia to Feriados.Data
Find eq Feriados by 1
If (Found) Move False to bDataBoa
If (((DateGetDayOfWeek(Cadconcessao.Fim_da_vigencia)) = 1) or ((DateGetDayOfWeek(Cadconcessao.Fim_da_Vigencia)) = 7 Move False to bDataBoa
Until (bDataBoa)
Set Value of (Cadconcessao.Fim_da_Vigencia) to Cadconcessao.Fim_da_Vigencia
End_Procedure


Se Alguem puder melhorar a Procedure fico agradecido, pois ela não esta funcionando como eu quero

Salvadori
20-Nov-2019, 12:36 PM
Continuando, fiz esta procedure mas está faltando alguma coisa, alguem se habilita?

Procedure PrepararData

Move true to bFeriado
Repeat
Clear Feriados
Move (Cadconcessao.Fim_da_Vigencia) to Feriados.Data
Find eq Feriados by 1
If (Found) Move (Cadconcessao.Inicio_da_Vigencia + 60) to Cadconcessao.Fim_da_Vigencia
Else Move False to bFeriado
Until(not(bFeriado))
If ((DateGetDayOfWeek(Cadconcessao.Fim_da_Vigencia)) = 1) Move (Cadconcessao.Fim_da_Vigencoa + 1) to Cadconcessao.Fim_da_Vigencia
If ((DateGetDayOfWeek(Cadconcessao.Fim_da_Vigencia)) = 7) Move (Cadconcessao.Fim_da_Vigencia + 2) to Cadconcessao.Fim_da_Vigencia
Move True to bDataBoa
Clear Feriados
Move Cadconcessao.Fim_da_Vigencia to Feriados.Data
Find eq Feriados by 1
If (Found) Move False to bDataBoa
If (((DateGetDayOfWeek(Cadconcessao.Fim_da_vigencia)) = 1) or ((DateGetDayOfWeek(Cadconcessao.Fim_da_Vigencia)) = 7 Move False to bDataBoa
Until (bDataBoa)
Set Value of (Cadconcessao.Fim_da_Vigencia) to Cadconcessao.Fim_da_Vigencia
End_Procedure


Se Alguem puder melhorar a Procedure fico agradecido, pois ela não esta funcionando como eu quero

boa tarde meu amigo Benedito, vamos aos poucos ajustando para ficar da maneira que você precisa, um detalhe que notei por cima é que você soma na data de inicio da vigencia direto 60, tenta utilizar a função para acrescentar dias a uma data que é a:



Move (DateAddDay(Cadconcessao.Inicio_da_Vigencia,60)) to Cadconcessao.Inicio_da_Vigencia


assim que eu tiver mais tempo eu volto para analisarmos mais a tua procedure um abraço.

Renato.Antonacci
20-Nov-2019, 01:40 PM
Boa tarde Benedito

Esta procedure que você postou esta em Loop já no primeiro Repeat, e também creio que não esteja compilando, pois tem um Until "Solto" no final.


Fiz uma Função rapidamente aqui para te ajudar. Teste e faça as adaptações que necessitar.



Function fRetornaProximoDiaUtil DateTime dData Returns DateTime
Repeat
//Testa por final de semana
If (DateGetDayOfWeek(dData)=7) Move (DateAddDay(dData,2)) to dData //Sabado
If (DateGetDayOfWeek(dData)=1) Move (DateAddDay(dData,1)) to dData //Domingo
//Teste de feriado
Clear Feriados
Move dData to Feriados.Data
Find eq Feriados by 1
If (Found) Move (DateAddDay(dData,1)) to dData
Until (FindErr)
Function_Return dData
End_Function


Em sua aplicação, basta colocar:



DateTime dDataUtil
Get fRetornaProximoDiaUtil <<DataQueQuerTestar>> to dDataUtil


Deve funcionar. Não testei.

Abraço