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
Powered by vBulletin® Version 4.2.5 Copyright © 2023 vBulletin Solutions Inc. All rights reserved.