Cálculo de días restantes

Un usuario Pregunto ✅

rohitkalane

Hola,

Soy bastante nuevo en las funciones de DAX y estoy tratando de calcular una medida que me dé la cantidad de días hábiles restantes para un mes en particular o hasta una fecha en particular. Todos los días excepto los fines de semana son laborables.

Tengo 2 tablas: una tabla de pedidos donde tengo clientes, la cantidad de ejes a enviar y la fecha programada del envío. Tengo una tabla de fecha oscura que me he unido a mi tabla de pedidos en la fecha programada.

Mi objetivo principal es calcular una medida que dé el promedio de ejes a realizar por día hábil, por lo que solo estoy tratando de dividir la suma de la cantidad por el número de días hábiles distintos que caen dentro de un marco de tiempo seleccionado.

El problema al que me enfrento es cuando un cliente en particular tiene una fecha de envío programada atrasada en su contra.

por ejemplo, si se selecciona septiembre de 2018 como filtro y el Cliente A tiene alguna cantidad (digamos 50 ejes) que se suponía que se enviarían el 05/09/2018 y aún no se han enviado, lo que hace que se refleje en mi tabla de pedidos como vencidos, entonces mi medida WorkingDays muestra que está en blanco o cero y esto hace que mi medida average_axles_per_day sea infinita. Supongo que esto sucede porque cuando selecciono septiembre de 2018 y el Cliente A como filtros, mi tabla de pedidos se filtra para mostrar solo los datos que coinciden con la condición y solo tiene 1 fecha de envío programada que está vencida.

Entonces, ¿cómo puedo mostrar la medida WorkingDays para mostrar siempre solo la cantidad de días hábiles que quedan en ese período de tiempo en particular (a partir de hoy, 17/09/2018, mi número de días hábiles que quedan en septiembre de 2018 debería ser 10). y mi suma de cantidad vencida debe dividirse por este número de días hábiles (en este caso, 50 dividido por 10).

Agradezco cualquier ayuda brindada.

Gracias.

Greg_Deckler

En respuesta a rohitkalane

Oh, eso se debe al TODO en esa fórmula. Puede intentar cambiar eso a ALLSELECTED y eso podría resolverlo.

Measure 6 = 
VAR __today = TODAY()
VAR __max = MAX('Table14'[Schedule Date])
VAR __total = SUMX(ALLSELECTED(Table14),Table14[New Qty])
VAR __workdays = SUMX(FILTER(ALL('Calendar'),[Date]>=__today && [Date]<=__max),[IsWorkDay])
RETURN DIVIDE(__total,__workdays,0)

O puede que tenga que utilizar ALLEXCEPT. O puede usar SUMX (Table14, Table14[New Qty]) dependerá exactamente de lo que esté intentando hacer.

Greg_Deckler

Leí esto varias veces y no estoy seguro de lo que está pasando. Los datos de muestra y las fórmulas siempre son muy útiles.

Consulte esta publicación sobre cómo obtener una respuesta rápida a su pregunta: https://community.powerbi.com/t5/Community-Blog/How-to-Get-Your-Question-Answered-Quickly/ba-p/38490

Dicho todo esto, he escrito una serie de medidas rápidas de duración del trabajo como:

https://community.powerbi.com/t5/Quick-Measures-Gallery/Net-Work-Duration/mp/481543

https://community.powerbi.com/t5/Quick-Measures-Gallery/Net-Work-Days/mp/367362

rohitkalane

En respuesta a Greg_Deckler

Hola @Greg_Deckler

Entonces, aquí estoy tratando de calcular una medida que me dará el número de días laborales que quedan en un período de tiempo seleccionado. Esta medida se utilizará luego para calcular Average_axles_per day = (Suma de nueva cantidad) / (Número de días laborables restantes).

Los días laborables se consideran días laborables (se ignoran los días festivos)

Mis datos tienen 2 tablas:

Gestión de pedidos Dim Date
Cliente Valor de fecha
Fecha de programacion Año fiscal
Nueva cantidad Trimestre fiscal
Mes fiscal

Semana fiscal

Me he unido a estas mesas en Fecha de programación *: 1 Fecha Valor los campos.

A continuación se muestran datos de muestra para el mes de septiembre de 2018:

Nombre del cliente Fecha de programacion Nueva Cant.
Cliente 3 3/9/2018 1
Cliente 1 3/9/2018 6
Cliente 7 4/9/2018 3
Cliente 4 5/9/2018 4
Cliente 7 5/9/2018 49
Cliente 7 6/9/2018 1
Cliente 9 10/09/2018 1
Cliente 4 10/09/2018 26
Cliente 7 10/09/2018 11
Cliente 3 11/09/2018 4
Cliente 10 11/09/2018 5
Cliente 7 11/09/2018 2
Cliente 3 12/9/2018 4
Cliente 5 12/9/2018 2
Cliente 7 12/9/2018 55
Cliente 3 13/09/2018 43
Cliente 5 13/09/2018 7
Cliente 2 13/09/2018 4
Cliente 7 13/09/2018 44
Cliente 9 14/9/2018 1
Cliente 3 14/9/2018 137
Cliente 8 14/9/2018 6
Cliente 5 14/9/2018 13
Cliente 11 14/9/2018 2
Cliente 1 14/9/2018 7
Cliente 2 14/9/2018 118
Cliente 7 14/9/2018 43
Cliente 3 15/9/2018 12
Cliente 9 17/09/2018 12
Cliente 4 17/09/2018 67
Cliente 3 17/09/2018 366
Cliente 8 17/09/2018 44
Cliente 5 17/09/2018 57
Cliente 11 17/09/2018 2
Cliente 1 17/09/2018 166
Cliente 2 17/09/2018 489
Cliente 7 17/09/2018 44
Cliente 6 17/09/2018 84
Cliente 3 18/9/2018 462
Cliente 8 18/9/2018 62
Cliente 5 18/9/2018 142
Cliente 1 18/9/2018 285
Cliente 2 18/9/2018 470
Cliente 7 18/9/2018 29
Cliente 6 18/9/2018 281
Cliente 9 19/9/2018 12
Cliente 3 19/9/2018 574
Cliente 8 19/09/2018 60
Cliente 5 19/09/2018 121
Cliente 1 19/9/2018 460
Cliente 2 19/09/2018 527
Cliente 7 19/09/2018 106
Cliente 6 19/09/2018 273
Cliente 3 20/9/2018 794
Cliente 8 20/9/2018 49
Cliente 5 20/9/2018 122
Cliente 1 20/9/2018 391
Cliente 2 20/9/2018 515
Cliente 7 20/9/2018 39
Cliente 6 20/9/2018 283
Cliente 9 21/09/2018 10
Cliente 3 21/09/2018 663
Cliente 8 21/09/2018 49
Cliente 5 21/09/2018 131
Cliente 11 21/09/2018 12
Cliente 1 21/09/2018 452
Cliente 2 21/09/2018 556
Cliente 7 21/09/2018 24
Cliente 6 21/09/2018 273
Cliente 3 22/09/2018 377
Cliente 1 22/09/2018 342
Cliente 9 24/9/2018 48
Cliente 4 24/9/2018 49
Cliente 3 24/9/2018 892
Cliente 8 24/9/2018 52
Cliente 5 24/9/2018 128
Cliente 1 24/9/2018 458
Cliente 2 24/9/2018 655
Cliente 7 24/9/2018 80
Cliente 6 24/9/2018 277
Cliente 9 25/9/2018 10
Cliente 3 25/9/2018 792
Cliente 8 25/9/2018 49
Cliente 5 25/9/2018 135
Cliente 1 25/9/2018 415
Cliente 2 25/9/2018 626
Cliente 7 25/9/2018 24
Cliente 6 25/9/2018 270
Cliente 9 26/9/2018 2
Cliente 3 26/9/2018 735
Cliente 8 26/9/2018 99
Cliente 5 26/9/2018 106
Cliente 10 26/9/2018 1
Cliente 1 26/9/2018 376
Cliente 2 26/9/2018 570
Cliente 7 26/9/2018 30
Cliente 6 26/9/2018 275
Cliente 9 27/9/2018 40
Cliente 3 27/9/2018 665
Cliente 8 27/9/2018 53
Cliente 5 27/9/2018 126
Cliente 11 27/9/2018 2
Cliente 1 27/9/2018 350
Cliente 2 27/9/2018 623
Cliente 7 27/9/2018 21
Cliente 6 27/9/2018 275
Cliente 9 28/9/2018 58
Cliente 3 28/9/2018 688
Cliente 8 28/9/2018 97
Cliente 5 28/9/2018 99
Cliente 1 28/9/2018 416
Cliente 2 28/9/2018 595
Cliente 7 28/9/2018 3
Cliente 6 28/9/2018 277
Cliente 3 29/9/2018 421
Cliente 1 29/9/2018 345

En este caso, considerando hoy () = 18/09/2018, podemos ver que hay algunos pedidos que están vencidos. Me gustaría calcular una medida que me dé la cantidad de días laborables que se encuentran entre hoy y la fecha de Programación máxima en la lista de pedidos, y luego dividir la suma total de la cantidad nueva (incluida la cantidad vencida) por esa cantidad de trabajo dias.

En otro caso en el que colocamos un filtro en un Cliente, digamos Cliente 10 sin ningún filtro de mes fiscal, a continuación se muestran los datos de muestra:

Nombre del cliente Fecha de programacion Nueva Cant.
Cliente 10 11/09/2018 5
Cliente 10 26/9/2018 1
Cliente 10 17/10/2018 8
Cliente 10 31/10/2018 4

En este caso, 1 de las fechas está vencida, por lo que me gustaría calcular los días hábiles entre hoy y el 31/10/2018 (fecha máxima de programación en la lista).

En un caso especial cuando un cliente tiene solo 1 pedido y ya está vencido, esa cantidad vencida se dividirá por los días hábiles restantes del mes actual.

Espero que esta información ayude a comprender el escenario. Por favor, avíseme si necesita información adicional.

Aprecio tu ayuda.

Gracias.

Greg_Deckler

En respuesta a rohitkalane

Lo siento, ¿cómo sabemos que un pedido está vencido o hay algo en esta tabla con una fecha de programación anterior al vencimiento de hoy? ¿Ya tiene una columna en su tabla de calendario que identifica los días como días laborables o no?

rohitkalane

En respuesta a Greg_Deckler

@Greg_Deckler Disculpas, debería haber mencionado eso. Sí, cualquier pedido que tenga una fecha de programación anterior a hoy está vencido.

En lo que respecta al día de trabajo, creé una columna calculada que asignará 0 a los fines de semana y 1 a los días de la semana y luego la usé como una bandera para identificar un día de trabajo.

IsWorkDay = SWITCH(WEEKDAY([Schedule Date]),1,0,7,0,1)

Greg_Deckler

En respuesta a rohitkalane

Entonces, ¿algo como esto?

Measure 6 = 
VAR __today = TODAY()
VAR __max = MAX('Table14'[Schedule Date])
VAR __total = SUMX(ALL(Table14),Table14[New Qty])
VAR __workdays = SUMX(FILTER(ALL('Calendar'),[Date]>=__today && [Date]<=__max),[IsWorkDay])
RETURN DIVIDE(__total,__workdays,0)

rohitkalane

En respuesta a Greg_Deckler

@Greg_Deckler

la parte donde calcula el Número de días laborables restantes funciona perfectamente, sin embargo, el promedio de ejes por día no se calcula con precisión.

Supongo que el problema es que el Cantidad total La variable no cambia de valor incluso si selecciono un cliente en particular. el total en esta medida siempre sigue siendo la Suma de Cant. para todos los clientes.

Gracias.

Greg_Deckler

En respuesta a rohitkalane

Oh, eso se debe al TODO en esa fórmula. Puede intentar cambiar eso a ALLSELECTED y eso podría resolverlo.

Measure 6 = 
VAR __today = TODAY()
VAR __max = MAX('Table14'[Schedule Date])
VAR __total = SUMX(ALLSELECTED(Table14),Table14[New Qty])
VAR __workdays = SUMX(FILTER(ALL('Calendar'),[Date]>=__today && [Date]<=__max),[IsWorkDay])
RETURN DIVIDE(__total,__workdays,0)

O puede que tenga que utilizar ALLEXCEPT. O puede usar SUMX (Table14, Table14[New Qty]) dependerá exactamente de lo que esté intentando hacer.

rohitkalane

En respuesta a Greg_Deckler

@Greg_Deckler

Estaba probando un escenario como se menciona en mi declaración de problema, donde para un cliente en particular, si solo tengo registros vencidos, entonces, en tal caso, mi cantidad total vencida debe dividirse por la cantidad de días hábiles restantes en el mes actual. .

La medida que proporcionó no me proporcionó días hábiles en tal caso. Simplemente apareció en blanco.

Ejemplo:

Región Nombre del cliente Fecha de programacion Nueva Cant.
México Cliente A 5/9/2018 0:00 4
México Cliente A 10/09/2018 0:00 24
México Cliente A 17/09/2018 0:00 67

En este caso, todos mis pedidos para el cliente A están vencidos, y dado que estamos en el mes de septiembre, la cantidad total vencida debe dividirse por los días hábiles restantes en septiembre, es decir, debe ser como (4 + 24 + 67) / 6.

En este caso, los días laborables que quedan parte del cálculo vuelven en blanco.

¿Podrías ayudarme por favor?

Gracias.

Greg_Deckler

En respuesta a rohitkalane

Bien, ¿estamos trabajando con esta versión de la fórmula?

Measure 6 = 
VAR __today = TODAY()
VAR __max = MAX('Table14'[Schedule Date])
VAR __total = SUMX(ALLSELECTED(Table14),Table14[New Qty])
VAR __workdays = SUMX(FILTER(ALL('Calendar'),[Date]>=__today && [Date]<=__max),[IsWorkDay])
RETURN DIVIDE(__total,__workdays,0)

Lo que estoy pensando que está sucediendo aquí es que el problema es la variable __max. Creo que lo que estaba pensando era que el [Schedule Date] tabla tendría el último día del mes, pero supongo que eso es un poco tonto ahora que lo pienso, así que tal vez algo como:

Measure 6 = 
VAR __today = TODAY()
VAR __maxSchedule = MAX('Table14'[Schedule Date])
VAR __maxMonth = MAX('Table14'[Schedule Date])
VAR __maxYear = MAX('Table14'[Schedule Date])
VAR __max = MAXX(FILTER('Calendar',YEAR([Date])=__maxYear && MONTH([Date])=__maxMonth),[Date])
VAR __total = SUMX(ALLSELECTED(Table14),Table14[New Qty])
VAR __workdays = SUMX(FILTER(ALL('Calendar'),[Date]>=__today && [Date]<=__max),[IsWorkDay])
RETURN DIVIDE(__total,__workdays,0)

Entonces, básicamente, obtenga el MÁXIMO de la fecha programada. Calcula el año y el mes para esa fecha. Utilice esos valores para calcular el último día del mes en la tabla Calendario.

rohitkalane

En respuesta a Greg_Deckler

@Greg_Deckler

hola, probé la última fórmula que proporcionaste, pero no funciona. Simplemente da todos mis promedios como cero, así que supongo que algo no está funcionando bien en esa fórmula.

La idea básica es ver primero la fecha de Programación máxima, si esa fecha es mayor que la de hoy, entonces calcule los días entre esa fecha de Programación máxima y hoy.

O si

La fecha de programación máxima es anterior a hoy, averigüe cuál es el mes actual y luego calcule los días laborables que quedan en el mes actual.

rohitkalane

En respuesta a Greg_Deckler

Sí, acabo de eliminar la función de filtro Todo. Todo funciona perfectamente ahora. Muchas gracias por tu ayuda.

rohitkalane

En respuesta a Greg_Deckler

@Greg_Deckler Lamento que la publicación sea confusa. Yo mismo estaba confundido acerca de cómo publicar esto de una mejor manera. Intentaré poner algunos datos de muestra y una fórmula que le ayudará a comprender mejor el problema.

Gracias por las referencias y disculpas por la publicación no tan bien formateada.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *