Ir para conteúdo
  • 0

Cálculo Diferença de Dias Úteis.


machadolndr
Ir para solução Solucionado por Vitor Peralva ,

Pergunta

  • Alunos

Bom dia!

Tenho a seguinte função na query.

/*
   A função tem como objetivo extrair a quantidade de horas úteis entre duas datas
   excluindo feriados informados como parâmetro e também um expediente ( hora de inicio e fim)

*/


(InicioExpediente, FimExpediente, Abertura, Fechamento, ListaFeriados) =>

let 

DiaDaAbertura   = Number.From(DateTime.Date(Abertura)),
DiaDoFechamento = Number.From(DateTime.Date(Fechamento)),

HorarioDaAbertura   = Number.From(DateTime.Time(Abertura)),
HorarioDoFechamento = Number.From(DateTime.Time(Fechamento)),

// Lista dos dias sem Sábados e Domingos
ListaDeDatas = List.Select({DiaDaAbertura..DiaDoFechamento}, each Number.Mod(_,7)>1),

// Lista dos dias sem Sábados, Domingos e Feriádos.
// Retorna apenas os números diferentes não existentes na tabela feriado, ou seja apenas não feriados.
ListaDiasUteis = List.Difference(ListaDeDatas,ListaFeriados),


SomaHorasUteis = 
        // Verifica se o dia da abertura é igual ao dia do fechamento
        if DiaDaAbertura = DiaDoFechamento then
                if DiaDaAbertura = List.First(ListaDiasUteis) then
                        // Verifica se o dia de abertura não é feriado. (DtAbertura = DtFechamento)
                        List.Median({InicioExpediente,FimExpediente,HorarioDoFechamento}) - List.Median({InicioExpediente,FimExpediente,HorarioDaAbertura})
                else 0
        else (
                if DiaDaAbertura = List.First(ListaDiasUteis) then
                        // Verifica se o dia da abertura é dia útil (DtAbertura <> DtFechamento)
                        FimExpediente - List.Median({InicioExpediente,FimExpediente,HorarioDaAbertura})
                else 0
        )
        +
        (       
                if DiaDoFechamento = List.Last(ListaDiasUteis) then 
                        // Verifica se o dia de fechamento é dia útil (DtAbertura <> DtFechamento)
                        List.Median({InicioExpediente,FimExpediente,HorarioDoFechamento}) - InicioExpediente
                else 0
        )
        +
        (
                //Soma to total de horas úteis excluindo (DiaAbertura, DiaFechamento, Feriados, Sábados e Domingos)
                List.Count(List.Difference(ListaDiasUteis,{DiaDaAbertura,DiaDoFechamento}))*(FimExpediente - InicioExpediente)
        )

in 

SomaHorasUteis

Atualmente a função faz o cálculo entre datas, considerando apenas dias úteis. (Desconsidera Sáb/Dom/Feriados).
A função foi feita com parâmetros de InicioExpediente e FimExpediente com os horários 00:01 e 23:59 respectivamente.
Porém preciso adaptar essa função, me deparei com o problema de que o cálculo deve ser por horário de funcionamento por cada filial, no total são 24 e cada uma tem seu horário específico.
Ex: Filial 1: Funciona de 06:00 ás 23:00
       Filial 2: Funciona de 10:00 ás 20:00

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 1
  • Alunos
  • Solução

Bom Dia, @machadolndr!

 

Vou tentar explicar melhor.

 

Você tem uma função no Power Query, que é a que colou.

Vamos supor que o nome dela seja "fxSuaFuncao", depois basta substituir onde tiver "fxSuaFuncao" pelo nome de sua função.

Esta função tem 5 argumentos, que são:

1 - InicioExpediente

2 - FimExpediente

3 - Abertura

4 - Fechamento

5 - ListaFeriados

 

Este argumentos são os que estão nesta parte do seu código:

"(InicioExpediente, FimExpediente, Abertura, Fechamento, ListaFeriados) =>"

 

Desta forma, para usar a função, você teria que usar o seu nome e dentro dos parênteses, informar os argumentos, mais ou menos assim:

= fxSuaFuncao(Argumento1, Argumento2, Argumento3, Argumento4, Argumento5)

 

Pelo que descreveu, somente os argumentos 1 (InicioExpediente) e 2 (FimExpediente) é que diferem de uma filial para outra.

Então, a minha sugestão é que criasse a coluna personalizada e nela, você criasse uma sequência de "if" para montar a função de acordo com a filial.

 

Seria algo assim:

if [ColunaFilial] = 1 then fxSuaFuncao(InicioExpedienteFilial1, FimExpedienteFilial1, ColunaAbertura, ColunaFechamento, ListaFeriados) 
else if [ColunaFilial] = 2 then fxSuaFuncao(InicioExpedienteFilial2, FimExpedienteFilial2, ColunaAbertura, ColunaFechamento, ListaFeriados) 
else fxSuaFuncao(InicioExpedienteFilial3, FimExpedienteFilial3, ColunaAbertura, ColunaFechamento, ListaFeriados)

 

Veja que o que mudaria de uma linha para outra é o número da filial e seus argumentos 1 e 2, que é o que varia de filial para filial.

Se existem filiais com o mesmo horário, você ainda poderia agrupar elas usando o "List.Contains", mas isto pode complicar um pouco já que não conhece tanto de M.

 

Espero que tenha ficado mais claro.

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos

Bom Dia, @machadolndr!

 

Neste caso, se vc tem uma coluna que indica a filial, pode ir fazendo as condicionais de que: if [ColunaFilial] = 1 then fxSuaFuncao(Parâmetros Para Filial 1) else if [ColunaFilial] = 2 then fxSuaFuncao(Parâmetros Para Filial 2) else fxSuaFuncao(Parâmetros Para Filial 3).

Fiz considerando 3 filiais, mas vc adapta para a sua quantidade.

 

Espero ter ajudado.

Link para o comentário
Compartilhar em outros sites

Faça login para comentar

Você vai ser capaz de deixar um comentário após fazer o login



Entrar Agora
×
×
  • Criar Novo...