Ir para conteúdo
  • 0

Validação de Contexto de Horas - Entrada e Saída - Duas datas de referência de relacionamento


Mateus_Silva
Ir para solução Solucionado por Erick Oliveira ,

Pergunta

  • Alunos

Olá, bom dia!

Gostaria de pedir ajuda com um problema específico no meu modelo de dados. Estou tentando calcular o número de horas entre a data de entrada e a data de saída das Ordens de Serviço (O.S.) de um determinado mês, utilizando um relacionamento inativo. O objetivo é obter a quantidade de horas em manutenção em cada mês para gerar indicador de indisponibilidade.

O problema é que as O.S. que entraram em um mês e saíram no outro, para calcular o total de horas de manutenção de cada mês. Esse cálculo é essencial para obter um indicador de desempenho de disponibilidade de frota.

 

image.png.378b16342caa19ff4fa2461a2877af6e.png

Estou enfrentando dificuldades para extrair o valor correto das horas. O método que estou utilizando não está funcionando como esperado. Aqui estão alguns detalhes adicionais sobre o meu problema:

  1. ID_DATA: Data em que a O.S. foi iniciada.
  2. DAT_FINAL: Data em que a O.S. foi finalizada.
  3. Relacionamento Inativo: Utilizo um relacionamento inativo entre as tabelas para tentar calcular a diferença de horas com referência a data de saída.
    1. image.png.c5f73a525be4e2098e6d48e5ed8dfbc3.png
  4. Medida Atual: A medida que estou usando não está retornando os valores corretos.

Preciso de ajuda para ajustar essa medida e conseguir calcular corretamente a quantidade de horas de manutenção para cada mês.

Agradeço antecipadamente pela colaboração.

HorasManutencao =  
VAR MesFiltrado = MAX(dCalendario[MesAno])
VAR AnoFiltrado = LEFT(MesFiltrado, 4)
VAR MesFiltradoNumero = RIGHT(MesFiltrado, 2)
VAR DataInicioMes = DATE(VALUE(AnoFiltrado), VALUE(MesFiltradoNumero), 1)
VAR DataFimMes = EOMONTH(DataInicioMes, 0)
 
RETURN
SUMX(
 FILTER(
 duvida_import,
 (duvida_import[ID_DATA] <= DataFimMes) &&
 (duvida_import[DAT_FINAL] >= DataInicioMes)
 ),
 VAR EntradaAjustada = MAX(DataInicioMes, duvida_import[NewStartDate])
 VAR SaidaAjustada = MIN(DataFimMes, duvida_import[DAT_FINAL])
 VAR HorasAtivas = DATEDIFF(EntradaAjustada, SaidaAjustada, HOUR)
 
 RETURN
 HorasAtivas
)
+
CALCULATE (
 SUMX (
 FILTER(
 duvida_import,
 (duvida_import[ID_DATA] <= DataFimMes) &&
 (duvida_import[DAT_FINAL] >= DataInicioMes)
 ),
 VAR EntradaAjustada = MAX(DataInicioMes, duvida_import[NewStartDate])
 VAR SaidaAjustada = MIN(DataFimMes, duvida_import[DAT_FINAL])
 RETURN DATEDIFF(EntradaAjustada, SaidaAjustada, HOUR)
 ),
 USERELATIONSHIP(duvida_import[DAT_FINAL], dCalendario[Data])
)

Modelo Dúvida Disponibilidade.pbix

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 1
  • Alunos
  • Solução

Bom dia, @Mateus_Silva;

Modifiquei a construção da base, particionando as datas End e Start em seus respectivos meses. Então esse exemplo que mostrou acabou virando duas linhas:


image.png.09261638283787112da92b14879b2695.png

Assim o valor final não se altera e é possível ver o valor de cada mês.

let   
 fxStartEndMonth = (StartDate as date, EndDate as date, optional InitialList as list) =>
        let
            StartMonth = Date.StartOfMonth(StartDate),
            EndMonth = DateTime.From(Date.EndOfMonth(StartDate)) + #duration(0, 23, 59, 0),
            VerifiedList = if InitialList = null then {DateTime.From(StartMonth), EndMonth} else InitialList,
            DateAdded = if StartDate <= EndDate then Date.AddMonths(StartMonth, 1) else Date.StartOfMonth(EndDate),
            List =
                if StartDate <= EndDate then
                    List.Union({VerifiedList, {DateTime.From(StartMonth), EndMonth}})
                else
                    VerifiedList,
            Out = if StartDate <= DateAdded then @fxStartEndMonth(DateAdded, EndDate, List) else List
        in
            List.Sort(Out),
    StartEndMonth = Table.AddColumn(
        Source,
        "StartEndMonth",
        each
            let
                _ListDates = fxStartEndMonth(
                    Date.From(Date.StartOfMonth([NewStartDate])), Date.From(Date.StartOfMonth([NewEndDate])), null
                ),
                _ReplaceStartEnd = {[NewStartDate]}
                    & List.RemoveLastN(List.RemoveFirstN(_ListDates, 1), 1)
                    & {[NewEndDate]},
                _ListCombine = List.Split(_ReplaceStartEnd, 2)
            in
                _ListCombine,
        type {
            date
        }
    ),
    StartEndMonthExpand = Table.ExpandListColumn(StartEndMonth, "StartEndMonth"),
    TransformRows = Table.FromRecords(
        Table.TransformRows(
            StartEndMonthExpand,
            (r) =>
                Record.TransformFields(
                    r,
                    {
                        {"ID_DATA", each Date.From(r[StartEndMonth]{0})},
                        {"NewStartDate", each r[StartEndMonth]{0}},
                        {"NewEndDate", each r[StartEndMonth]{1}}
                    }
                )
        ),
        Value.Type(StartEndMonthExpand)
    ),
    RemoveColumns = Table.RemoveColumns(TransformRows, {"StartEndMonth"})
in
    RemoveColumns

Modelo Dúvida Disponibilidade.pbix

  • Like 1
Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
Em 25/06/2024 em 08:13, Erick Oliveira disse:

Bom dia, @Mateus_Silva;

Modifiquei a construção da base, particionando as datas End e Start em seus respectivos meses. Então esse exemplo que mostrou acabou virando duas linhas:


image.png.09261638283787112da92b14879b2695.png

Assim o valor final não se altera e é possível ver o valor de cada mês.

let   
 fxStartEndMonth = (StartDate as date, EndDate as date, optional InitialList as list) =>
        let
            StartMonth = Date.StartOfMonth(StartDate),
            EndMonth = DateTime.From(Date.EndOfMonth(StartDate)) + #duration(0, 23, 59, 0),
            VerifiedList = if InitialList = null then {DateTime.From(StartMonth), EndMonth} else InitialList,
            DateAdded = if StartDate <= EndDate then Date.AddMonths(StartMonth, 1) else Date.StartOfMonth(EndDate),
            List =
                if StartDate <= EndDate then
                    List.Union({VerifiedList, {DateTime.From(StartMonth), EndMonth}})
                else
                    VerifiedList,
            Out = if StartDate <= DateAdded then @fxStartEndMonth(DateAdded, EndDate, List) else List
        in
            List.Sort(Out),
    StartEndMonth = Table.AddColumn(
        Source,
        "StartEndMonth",
        each
            let
                _ListDates = fxStartEndMonth(
                    Date.From(Date.StartOfMonth([NewStartDate])), Date.From(Date.StartOfMonth([NewEndDate])), null
                ),
                _ReplaceStartEnd = {[NewStartDate]}
                    & List.RemoveLastN(List.RemoveFirstN(_ListDates, 1), 1)
                    & {[NewEndDate]},
                _ListCombine = List.Split(_ReplaceStartEnd, 2)
            in
                _ListCombine,
        type {
            date
        }
    ),
    StartEndMonthExpand = Table.ExpandListColumn(StartEndMonth, "StartEndMonth"),
    TransformRows = Table.FromRecords(
        Table.TransformRows(
            StartEndMonthExpand,
            (r) =>
                Record.TransformFields(
                    r,
                    {
                        {"ID_DATA", each Date.From(r[StartEndMonth]{0})},
                        {"NewStartDate", each r[StartEndMonth]{0}},
                        {"NewEndDate", each r[StartEndMonth]{1}}
                    }
                )
        ),
        Value.Type(StartEndMonthExpand)
    ),
    RemoveColumns = Table.RemoveColumns(TransformRows, {"StartEndMonth"})
in
    RemoveColumns

Modelo Dúvida Disponibilidade.pbix 108.47 kB · 1 download

@Erick Oliveira, boa tarde!

 

Muito obrigado.

 

Att

 

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