Função que retorna o número de dias úteis entre duas datas utilizando AdvPL

Olá pessoal…

Hoje vou mostrar uma função desenvolvida que retorna o número de dias úteis entre duas datas utilizando a linguagem AdvPL.

AdvPL

AdvPL

Esta rotina para a contagem dos dias, desconsidera sábados, domingos e feriados (cadastrados na tabela 63 da SX5), então por exemplo, entre os dias 30/10/2016 até 05/11/2016, quantos dias são úteis?

A rotina no caso retorna 4, que representa o número de dias úteis entre as duas datas de referência.

Abaixo a rotina completa.

//Bibliotecas
#Include "Protheus.ch"

/*/{Protheus.doc} zDiasUteis
Função que retorna a quantidade de dias úteis entre duas datas
@author Atilio
@since 25/10/2016
@version 1.0
@type function
	@param dDtIni, date, Data inicial a ser considerada
	@param dDtFin, date, Data final a ser considerada
	@example u_zDiasUteis(sToD("20161001"), sToD("20161025"))
	u_zDiasUteis(FirstDate(dDataBase), LastDate(dDataBase))
	@obs Quanto as feriados, eles devem estar cadastrados na SX5, tabela "63"
/*/

User Function zDiasUteis(dDtIni, dDtFin)
	Local aArea    := GetArea()
	Local nDias    := 0
	Local dDtAtu   := sToD("")
	Default dDtIni := dDataBase
	Default dDtFin := dDataBase
	
	//Enquanto a data atual for menor ou igual a data final
	dDtAtu := dDtIni
	While dDtAtu <= dDtFin
		//Se a data atual for uma data Válida
		If dDtAtu == DataValida(dDtAtu) 
			nDias++
		EndIf
		
		dDtAtu := DaySum(dDtAtu, 1)
	EndDo
	
	RestArea(aArea)
Return nDias

Esses e outros códigos, estão disponíveis gratuitamente no nosso GitHub, acesse em github.com/dan-atilio/AdvPL.

Bom pessoal, por hoje é só.
Abraços e até a próxima.

Dan_Atilio
Analista e desenvolvedor de sistemas. Técnico em Informática pelo CTI da Unesp. Graduado em Banco de Dados pela Fatec Bauru. Entusiasta de soluções Open Source e blogueiro nas horas vagas.

2 Responses

  1. Rodriog disse:

    Parabéns pelos posts, tem alguma funcao que retorno o 5. dia util do mes?

    • Dan_Atilio disse:

      Boa noite Rodrigo, tudo bem?
      De cabeça desconheço, o que você poderia fazer é:

      dDataRef := Date() //Pega a data de referência
      dPrimDia := FirstDate(dDataRef) //Pega o primeiro dia do mês
      d5Dias := DaySum(dPrimDia, 4) //Soma mais 4 dias no primeiro dia do mês
      dQuinto := DataValida(d5Dias)
      

      Seria +- assim eu acho.
      Um grande abraço.

Deixe uma resposta