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.