Função que retorna o quinto dia útil do mês

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:

  1. Receber uma data por parâmetro, por exemplo, 20/05/2021
  2. A partir disso, encontrar a primeira data do mês, por exemplo, 01/05/2021
  3. 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)
  4. 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.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

4 Responses

  1. Jose Alberto disse:

    Sugiro que na linha 39 coloque
    dQuintoDia := DataValida(dDataAux) // se por acaso cair exatamente no sabado ou feriado.

Deixe uma resposta para Jose AlbertoCancelar resposta

Terminal de Informação