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.