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:
//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.
