Função que retorna as semanas entre duas datas em AdvPL

Função que retorna as semanas entre duas datas em AdvPL

Olá pessoal…

Hoje vou mostrar uma rotina que desenvolvi em AdvPL, que traz informações de semanas entre duas datas.

Basicamente a rotina pessoal, recebe duas datas, e através de uma data de corte (por exemplo sábado), quebra em semanas, então é retornado um array, contendo o dia inicial da semana, o dia final da semana, e a semana inteira separada por ponto e vírgula.

Abaixo um print do VarInfo da rotina:

Conteúdo do array com os dados das semanas
Conteúdo do array com os dados das semanas

//Bibliotecas
#Include "Protheus.ch"

/*/{Protheus.doc} zSemanas
Retorna as semanas entre duas datas
@author Atilio
@since 15/01/2015
@version 1.0
	@param dDataIni, Data, Data Inicial para verificação
	@param dDataFim, Data, Data Final para verificação
	@param lQuebDif, Lógico, Define se a quebra da semana será conforme o primeiro dia (dDataIni) ou se será o padrão (sábado)
	@return aSemanas, Array com as datas da semana
	@example
	u_zSemanas(dDatabase,dDatabase)
@obs Estrutura do array aSemanas:
	aSemanas [X][1] ==> Dia Inicial
	aSemanas [X][2] ==> Dia Final
	aSemanas [X][3] ==> Todos os dias da semana em formato texto separado por ;
/*/

User Function zSemanas(dDataIni, dDataFim, lQuebDif)
	Local aArea			:= GetArea()
	Local aSemanas		:= {}
	Local dDataAtu		:= dDataBase
	Local cDiaQueb		:= "saturday"
	Default dDataIni	:= DaySub(dDataBase, 15)
	Default dDataFim	:= DaySum(dDataBase, 15)
	Default lQuebDif	:= .F.

	//Definindo o dia de quebra
	If lQuebDif
		cDiaQueb := Alltrim(Lower(cDoW(dDataIni)))
	EndIf
	
	//Zerando variáveis
	dDataAtu := dDataIni
	aAdd(aSemanas, {dDataAtu, dDataAtu, dToS(dDataAtu)+";"})
	nAtual := 1
	
	//Enquanto o dia atual for diferente do último dia
	While dDataAtu <= dDataFim
		//Se for sábado, quebra a semana
		If Alltrim( Lower( cDow(dDataAtu) ) ) == cDiaQueb
			aSemanas[nAtual][2] := dDataAtu
			aSemanas[nAtual][3] += dToS(dDataAtu)+";"
			dDataAtu := DaySum(dDataAtu, 1)
			aAdd(aSemanas, {dDataAtu, dDataAtu, ""})
			nAtual++
		EndIf
	
		aSemanas[nAtual][2] := dDataAtu
		aSemanas[nAtual][3] += dToS(dDataAtu)+";"
		dDataAtu := DaySum(dDataAtu, 1)
	EndDo
	
	RestArea(aArea)
Return aSemanas

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.

About 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. Autor do projeto Terminal de Informação, onde são postados tutoriais e notícias envolvendo o mundo da tecnologia.

Deixe uma resposta

%d blogueiros gostam disto: