Earn a 50% discount on the DP-600 certification exam by completing the Fabric 30 Days to Learn It challenge.
Hola a todos,
Publicando aquí de nuevo, ya que todavía no puedo obtener una respuesta, agradezco sinceramente todas las ideas.
Me gustaría tener una fórmula que cree la columna "Stock de apertura después" para la semana actual que se deriva de restar la demanda de la semana anterior del stock de apertura de la semana anterior después y agregar el envío propuesto de la semana anterior. (por ejemplo, para G52314 Semana 34 Acciones de apertura después de -> 113-70 + 40 = 83) (por ejemplo, para G52314 Semana 37 Acciones de apertura después de -> 0-40 + 100 = 60).
Sin embargo, para el número de semana más pequeño (Semana 31), ya que no hay datos para la semana anterior, el Stock de Apertura Después es siempre igual al Stock de Apertura.
El Stock de apertura después nunca debe ser un valor negativo (por ejemplo, si el valor es negativo, devuelva 0 en su lugar). Si el stock de apertura después de la semana anterior es negativo, se debe usar 0 en el cálculo del stock de apertura de la semana actual después (por ejemplo, X78321 El cálculo de la semana 37 debe ser 0-49 + 60 = 11).
Único | Número de semana | Apertura de stock | Envío propuesto | Demanda | Opening Stock After |
G52314 | 31 | 120 | 0 | 35 | 120 |
G52314 | 32 | 120 | 70 | 42 | 85 |
G52314 | 33 | 120 | 40 | 70 | 113 |
G52314 | 34 | 120 | 40 | 130 | 83 |
G52314 | 35 | 120 | 80 | 140 | 0 |
G52314 | 36 | 120 | 100 | 40 | 0 |
G52314 | 37 | 120 | 40 | 36 | 60 |
X78321 | 31 | 200 | 0 | 57 | 200 |
X78321 | 32 | 200 | 20 | 48 | 143 |
X78321 | 33 | 200 | 90 | 120 | 115 |
X78321 | 34 | 200 | 60 | 150 | 85 |
X78321 | 35 | 200 | 60 | 150 | 0 |
X78321 | 36 | 200 | 60 | 49 | 0 |
X78321 | 37 | 200 | 60 | 52 | 11 |
cómo se ve en las fórmulas de Excel:
Una vez más, gracias por toda la ayuda.
Buenos días @bluerooster
Consulte el archivo de muestra adjunto con la solución.
Tengo que mencionar que esta solución no es perfecta. Podría haber algunos casos en los que podría no proporcionar resultados correctos, sin embargo, tales casos son extremadamente raros. De todos modos, la solución ya es compleja y vincular para mejorar aún más dará como resultado una solución aún más compleja y menos eficiente que supongo que no será necesaria. Por favor, hágamelo saber si tiene más preguntas.
Opening Stock After =
VAR CurrentWeek1 = Data[Week Number]
VAR OpeningStock1 = Data[Opening Stock]
VAR CurrentUniqueTable = CALCULATETABLE ( Data, ALLEXCEPT ( Data, Data[Unique] ) )
VAR StockAfterTable =
ADDCOLUMNS (
CurrentUniqueTable,
"@StockAfter",
VAR CurrentWeek2 = [Week Number]
VAR TableBefore2 = FILTER ( CurrentUniqueTable, [Week Number] < CurrentWeek2 )
VAR Value1 =
SUMX (
TableBefore2,
[Proposed Shipment] - [Demand]
)
VAR Value2 = Value1 + OpeningStock1
RETURN
IF ( Value2 < 0, 0, Value2 )
)
VAR CurrentRecord = FILTER ( StockAfterTable, [Week Number] = CurrentWeek1 )
VAR PreviousRecord = FILTER ( StockAfterTable, [Week Number] = CurrentWeek1 - 1 )
VAR OpeningStock2 = MINX ( CurrentRecord, [@StockAfter] )
VAR Result =
IF ( OpeningStock2 = 0, SUMX ( PreviousRecord, [Proposed Shipment] - [Demand] ), OpeningStock2 )
RETURN
IF ( Result < 0, 0, Result )
Buenos días @tamerj1
Muchas gracias por su respuesta!! El código funciona casi perfectamente, sin embargo, descubrí que si agregué más semanas después de la semana 37, el código no devuelve las respuestas correctas. Agregué nuevos datos para la semana 38 y la semana 39 y experimenté con el código.
El resultado deseado con los datos de la semana 38 y 39:
Único | Número de semana | Apertura de stock | Envío propuesto | Demanda | Apertura de stock después |
G52314 | 31 | 120 | 0 | 35 | 120 |
G52314 | 32 | 120 | 70 | 42 | 85 |
G52314 | 33 | 120 | 40 | 70 | 113 |
G52314 | 34 | 120 | 40 | 130 | 83 |
G52314 | 35 | 120 | 80 | 140 | 0 |
G52314 | 36 | 120 | 100 | 40 | 0 |
G52314 | 37 | 120 | 40 | 36 | 60 |
G52314 | 38 | 120 | 50 | 38 | 64 |
G52314 | 39 | 120 | 60 | 40 | 76 |
X78321 | 31 | 200 | 0 | 57 | 200 |
X78321 | 32 | 200 | 20 | 48 | 143 |
X78321 | 33 | 200 | 90 | 120 | 115 |
X78321 | 34 | 200 | 60 | 150 | 85 |
X78321 | 35 | 200 | 60 | 150 | 0 |
X78321 | 36 | 200 | 60 | 49 | 0 |
X78321 | 37 | 200 | 60 | 52 | 11 |
X78321 | 38 | 200 | 50 | 30 | 19 |
X78321 | 39 | 200 | 60 | 25 | 39 |
El resultado en PBI:
Para las semanas 38 y 39, el código tomó el Envío propuesto - Demanda de la semana anterior sin agregar el Stock de apertura después de la semana anterior.
Gracias una vez más por su ayuda hasta ahora... 🙏
@bluerooster HI
Pude obtener números correctos de las filas agregadas. Sin embargo, fui más allá y agregué aún más filas y me di cuenta de que el ciclo entre positivo a negativo a positivo más de una vez hará que la solución DAX sea imposible de lograr. Lo que se puede lograr con una función simple en Excel no se puede lograr con DAX. En general, DAX no admite cálculos recursivos, pero en algunos casos hay soluciones alternativas que aparentemente no en este caso.
Ya veo, muchas gracias @tamerj1 por su generosa ayuda... Si hay una solución alternativa, creando nuevas medidas u otras columnas calculadas para lograr el resultado deseado, soy todo oídos ...
@tamerj1
No, es aleatorio dependiendo de la Demanda / Envío Propuesto para la semana actual, así como el Stock de Apertura después de la semana anterior.
Sé que es aleatorio pero en general podemos decir que esto no puede suceder por ejemplo más de 5 veces o puede ser mucho más?
@tamerj1
En realidad, sí, se podría decir que los ciclos de reinicio máximos son el número de semanas que abarca el conjunto de datos actual (por ejemplo, semana 31-37, ciclos de reinicio máximos = 6).
Encontrará el archivo de muestra modificado adjunto. Tenga en cuenta que el rendimiento sería probablemente malo.Opening Stock After =
VAR CurrentWeek = Data[Week Number]
VAR OpeningStock = Data[Opening Stock]
VAR CurrentUniqueTable =
CALCULATETABLE ( Data, ALLEXCEPT ( Data, Data[Unique] ) )
VAR T1 =
ADDCOLUMNS (
CurrentUniqueTable,
"@StockAfter1",
VAR WeekNumber = [Week Number]
VAR TableBefore =
FILTER ( CurrentUniqueTable, [Week Number] < WeekNumber )
VAR Value1 =
SUMX ( TableBefore, [Proposed Shipment] - [Demand] )
VAR Value2 = Value1 + OpeningStock
RETURN
Value2
)
VAR R1 = TOPN ( 1, FILTER ( T1, [@StockAfter1] < 0 ), [Week Number], ASC )
VAR W1 = MINX ( R1, [Week Number] )
VAR V1 = MINX ( R1, [@StockAfter1] )
VAR T2 = ADDCOLUMNS ( T1, "@StockAfter2", IF ( [Week Number] < W1, [@StockAfter1], [@StockAfter1] - V1 ) )
VAR R2 = TOPN ( 1, FILTER ( T2, [@StockAfter2] < 0 ), [Week Number], ASC )
VAR W2 = MINX ( R2, [Week Number] )
VAR V2 = MINX ( R2, [@StockAfter2] )
VAR T3 = ADDCOLUMNS ( T2, "@StockAfter3", IF ( [Week Number] < W2, [@StockAfter2], [@StockAfter2] - V2 ) )
VAR R3 = TOPN ( 1, FILTER ( T3, [@StockAfter3] < 0 ), [Week Number], ASC )
VAR W3 = MINX ( R3, [Week Number] )
VAR V3 = MINX ( R3, [@StockAfter3] )
VAR T4 = ADDCOLUMNS ( T3, "@StockAfter4", IF ( [Week Number] < W3, [@StockAfter3], [@StockAfter3] - V3 ) )
VAR R4 = TOPN ( 1, FILTER ( T4, [@StockAfter4] < 0 ), [Week Number], ASC )
VAR W4 = MINX ( R4, [Week Number] )
VAR V4 = MINX ( R4, [@StockAfter4] )
VAR T5 = ADDCOLUMNS ( T4, "@StockAfter5", IF ( [Week Number] < W4, [@StockAfter4], [@StockAfter4] - V4 ) )
VAR R5 = TOPN ( 1, FILTER ( T5, [@StockAfter5] < 0 ), [Week Number], ASC )
VAR W5 = MINX ( R5, [Week Number] )
VAR V5 = MINX ( R5, [@StockAfter5] )
VAR T6 = ADDCOLUMNS ( T5, "@StockAfter6", IF ( [Week Number] < W5, [@StockAfter5], [@StockAfter5] - V5 ) )
RETURN
MAXX ( FILTER ( T6, [Week Number] = CurrentWeek ), [@StockAfter6] )
Buenos días @tamerj1
He probado el código anterior y lo he ajustado en consecuencia al número máximo de semanas que mi conjunto de datos podría abarcar y hasta ahora funciona! No puedo agradecerte lo suficiente por tu gran ayuda de corazón en los últimos días ... hiciste mi semana y espero que tengas un gran fin de semana por delante, gracias 😃
Sé que es aleatorio pero en general podemos decir que esto no puede suceder por ejemplo más de 5 veces o puede ser mucho más?
@tamerj1
O podría decir que los ciclos de reinicio máximos son el número de semanas que abarca el conjunto de datos actual (por ejemplo, semana 31-37, ciclos de reinicio máximos = 6).
cuando llegué a la parte en la que dijiste "Si el Stock de Apertura después de la semana anterior es negativo, se debe usar 0 en el cálculo de la semana actual " estaba como 😅
No creo que vaya a ser fácil. Sin embargo, tengo algo en mente, permítanme intentar aplicarlo mañana por la mañana. De todos modos, esto no va a ser eficiente de ninguna manera, así que espero que sus datos no sean tan grandes.