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

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.

Deixe uma resposta

Terminal de Informação