No artigo de hoje, vamos mostrar uma função que foi desenvolvida para retornar o quinto dia útil do mês.
A lógica para desenvolver a rotina foi basicamente:
- Receber uma data por parâmetro, por exemplo, 20/05/2021
- A partir disso, encontrar a primeira data do mês, por exemplo, 01/05/2021
- Com isso, é feito um laço de repetição, até que atinja 5, e toda vez que a data não for válida (feriado ou fim de semana), irá diminuir 1 (nesse exemplo, vai pular os dias 01/05/2021 e 02/05/2021)
- Por último, define a data de retorno para a função
Abaixo o código fonte desenvolvido, conforme lógica demonstrada acima:
//Bibliotecas
#Include "TOTVS.ch"
/*/{Protheus.doc} User Function zQuinto
Função que retorna o quinto dia útil de um mês
@type Function
@author Atilio
@since 20/05/2021
@version version
@param dDataRef, Date, Data do mês de referência
@return dQuintoDia, Date, Data do quinto dia útil
@example
dData := u_zQuinto(sToD("20210401"))
/*/
User Function zQuinto(dDataRef)
Local aArea := GetArea()
Local dQuintoDia
Local dDataAux
Local nDiaUtil := 1
Default dDataRef := Date()
//Define a data auxiliar como o primeiro dia do mês
dDataAux := FirstDate(dDataRef)
//Enquanto o dia útil for menor que 5
While nDiaUtil < 5
//Se for fim de semana ou feriado, subtrai um do contador do While
If DataValida(dDataAux) != dDataAux
nDiaUtil--
EndIf
//Incrementa um dia na data auxiliar
dDataAux := DaySum(dDataAux, 1)
nDiaUtil++
EndDo
//Define o quinto dia, conforme a data que finalizou no While
dQuintoDia := DataValida(dDataAux) //dica do Jose Alberto, caso caia exatamente em um sábado ou feriado
RestArea(aArea)
Return dQuintoDia
Bom pessoal, por hoje é só.
Abraços e até a próxima.
SHOW!!! SHOW!!!
Opa, obrigado pelo feedback jovem.
Abraços.
Sugiro que na linha 39 coloque
dQuintoDia := DataValida(dDataAux) // se por acaso cair exatamente no sabado ou feriado.
Opa, obrigado pela contribuição Jose, já atualizei o artigo.
Grande abraço.