Join us at FabCon Atlanta from March 16 - 20, 2026, for the ultimate Fabric, Power BI, AI and SQL community-led event. Save $200 with code FABCOMM.
Register now!The Power BI Data Visualization World Championships is back! It's time to submit your entry. Live now!
Hola.
Tengo una tabla con la cantidad prevista de algunos productos y otra con sus ingredientes y proporciones.
Ahora puedo obtener las cantidades necesarias de ingredientes basándome solo en estas dos tablas; El problema es que algunos ingredientes también tienen sus componentes y no consigo calcular la cantidad total.
El resultado:
ingredient_name = Ingredients_list[ingredient_name]
| ingredient_name | quantity_forecast | ratio_forecast | quantity_ingredients | ratio_components | quantity_components | quantity_components_i debería conseguir |
| Vaca | 0,99 | 35,07 | ||||
| Bien | 127 | 0,50 | 63,5 | |||
| Queso | 506 | 0,19 | 96,1 | |||
| Masa | 506 | 0,46 | 232,8 | |||
| Harina | 0,95 | 221,12 | ||||
| Lechuga | 277 | 0,28 | 76,2 | |||
| Carne | 127 | 0,21 | 26,7 | |||
| Aceite | 506 | 0,07 | 35,4 | 0,30 | 11 | 11,64 |
| Cebolla | 127 | 0,10 | 12,7 | |||
| Salami | 506 | 0,11 | 55,7 | |||
| Sal | 0,01 | 0,35 | ||||
| Salsa | 277 | 0,07 | 19,4 | |||
| Especias | 0,20 | 3,79 | ||||
| Salsa de tomate | 506 | 0,17 | 86,0 | |||
| Tomates | 150 | 0,50 | 75,0 | 0,94 | 71 | 80,86 |
previsión:
| product_name | product_id | cantidad |
| Ensalada | 100 | 150 |
| Pizza | 101 | 506 |
| Hamburguesa | 102 | 127 |
| Emparedado | 103 | 12 |
ingredientes:
| product_name | product_id | ingredient_name | ingredient_id | proporción |
| Ensalada | 100 | Lechuga | 1 | 0,45 |
| Ensalada | 100 | Tomates | 2 | 0,5 |
| Ensalada | 100 | Salsa | 3 | 0,05 |
| Pizza | 101 | Masa | 11 | 0,46 |
| Pizza | 101 | Salsa de tomate | 12 | 0,17 |
| Pizza | 101 | Aceite | 202 | 0,07 |
| Pizza | 101 | Queso | 13 | 0,19 |
| Pizza | 101 | Salami | 14 | 0,11 |
| Hamburguesa | 102 | Bien | 16 | 0,5 |
| Hamburguesa | 102 | Lechuga | 18 | 0,1 |
| Hamburguesa | 102 | Cebolla | 19 | 0,1 |
| Hamburguesa | 102 | Salsa | 3 | 0,09 |
| Hamburguesa | 102 | Carne | 22 | 0,21 |
Componentes:
| ingredient_name | ingredient_id | component_name | component_id | proporción |
| Salsa | 3 | Especias | 201 | 0,2 |
| Salsa | 3 | Aceite | 202 | 0,8 |
| Masa | 11 | Harina | 203 | 0,95 |
| Masa | 11 | Aceite | 202 | 0,05 |
| Salsa de tomate | 12 | Tomates | 2 | 0,94 |
| Salsa de tomate | 12 | Aceite | 202 | 0,06 |
| Carne | 22 | Vaca | 206 | 0,99 |
| Carne | 22 | Sal | 209 | 0,01 |
ingredients_list:
| ingredient_name | ingredient_id |
| Especias | 201 |
| Aceite | 202 |
| Harina | 203 |
| Tomates | 2 |
| Vaca | 206 |
| Sal | 209 |
| Lechuga | 1 |
| Salsa | 3 |
| Masa | 11 |
| Salsa de tomate | 12 |
| Queso | 13 |
| Salami | 14 |
| Bien | 16 |
| Lechuga | 18 |
| Cebolla | 19 |
| Carne | 22 |
Relaciones:
Ingredients_list[ingredient_id] 1:* Componentes[component_id]
Ingredients_list[ingredient_id] 1:* Ingredientes[ingredient_id]
Ingredientes[product_id] 1:* Pronóstico[product_id]
Solved! Go to Solution.
Este es un escenario clásico de explosión de Ley of Materials (BOM). Es complicado porque se están lidiando con dos capas de demanda simultáneamente:
Demanda directa: Cuando el producto utiliza el producto directamente (por ejemplo, la pizza usa aceite).
Demanda indirecta (derivada): Cuando el producto utiliza un ingrediente (como masa), y ese ingrediente utiliza el producto (aceite).
El problema con tu cálculo actual es el contexto. Cuando seleccionas "Aceite" en tu visual, Power BI filtra todo a "Aceite". No puede "ver" la demanda de "Masa" o "Salsa" a menos que le digamos explícitamente a DAX que busque los Elementos Padres del componente seleccionado.
Así es como puedes calcular la Demanda Indirecta y sumarla a tu total.
La medida de solución
Tenemos que iterar por la tabla de Componentes para encontrar todos los "Padres" del ingrediente seleccionado, calcular su demanda y luego multiplicar por la proporción de componentes.
Total Quantity Required =
VAR DirectDemand = [quantity_ingredients]
VAR IndirectDemand =
SUMX(
-- Iterate through the rows in the Components table (filtered by the selected Ingredient)
'Components',
VAR ComponentRatio = 'Components'[ratio]
VAR ParentID = 'Components'[ingredient_id] -- The ID of the Parent (e.g., Dough)
-- Calculate the demand for the Parent Ingredient
VAR ParentDemand =
CALCULATE(
[quantity_ingredients],
-- Step 1: Remove the filter from the selected Child (Oil)
ALL('Ingredients_list'),
-- Step 2: Apply the filter for the Parent (Dough)
'Ingredients_list'[ingredient_id] = ParentID
)
RETURN ParentDemand * ComponentRatio
)
RETURN DirectDemand + IndirectDemandCómo funciona:
DirectDemand: Mantiene tu lógica existente para el uso de Nivel 1.
IndirectDemand: Analiza la tabla de Componentes. Si se selecciona "Aceite", aparece filas donde el aceite es un componente (padres: Masa, Salsa, etc.).
CALCULATE: Esta es la parte mágica. Usa ALL para ignorar que seleccionaste "Aceite", y luego usa el ParentID para fingir que seleccionamos "Masa". Calcula cuánta masa se necesita usando tu medida actual.
Resultado: multiplica la proporción de demanda de masa * aceite y la suma para todos los padres.
Nota importante: Esta solución asume una jerarquía de 2 niveles (producto > ingrediente > componente). Si tienes niveles más profundos (por ejemplo, Componente > Subcomponente), necesitarías un patrón recursivo más complejo usando funciones PATH o preparación para Python/SQL. Pero para la estructura que compartiste, este patrón DAX es la forma más eficiente.
¡Pruébalo y dime si los números coinciden con tus expectativas!
Si mi respuesta ha resuelto tu duda, por favor márcalo como la Solución Aceptada para ayudar a otros. Además, agradecería un 'Kudos' si te ha resultado útil mi respuesta.
Esta respuesta fue asistida por IA para fines de traducción y formato.
Este es un escenario clásico de explosión de Ley of Materials (BOM). Es complicado porque se están lidiando con dos capas de demanda simultáneamente:
Demanda directa: Cuando el producto utiliza el producto directamente (por ejemplo, la pizza usa aceite).
Demanda indirecta (derivada): Cuando el producto utiliza un ingrediente (como masa), y ese ingrediente utiliza el producto (aceite).
El problema con tu cálculo actual es el contexto. Cuando seleccionas "Aceite" en tu visual, Power BI filtra todo a "Aceite". No puede "ver" la demanda de "Masa" o "Salsa" a menos que le digamos explícitamente a DAX que busque los Elementos Padres del componente seleccionado.
Así es como puedes calcular la Demanda Indirecta y sumarla a tu total.
La medida de solución
Tenemos que iterar por la tabla de Componentes para encontrar todos los "Padres" del ingrediente seleccionado, calcular su demanda y luego multiplicar por la proporción de componentes.
Total Quantity Required =
VAR DirectDemand = [quantity_ingredients]
VAR IndirectDemand =
SUMX(
-- Iterate through the rows in the Components table (filtered by the selected Ingredient)
'Components',
VAR ComponentRatio = 'Components'[ratio]
VAR ParentID = 'Components'[ingredient_id] -- The ID of the Parent (e.g., Dough)
-- Calculate the demand for the Parent Ingredient
VAR ParentDemand =
CALCULATE(
[quantity_ingredients],
-- Step 1: Remove the filter from the selected Child (Oil)
ALL('Ingredients_list'),
-- Step 2: Apply the filter for the Parent (Dough)
'Ingredients_list'[ingredient_id] = ParentID
)
RETURN ParentDemand * ComponentRatio
)
RETURN DirectDemand + IndirectDemandCómo funciona:
DirectDemand: Mantiene tu lógica existente para el uso de Nivel 1.
IndirectDemand: Analiza la tabla de Componentes. Si se selecciona "Aceite", aparece filas donde el aceite es un componente (padres: Masa, Salsa, etc.).
CALCULATE: Esta es la parte mágica. Usa ALL para ignorar que seleccionaste "Aceite", y luego usa el ParentID para fingir que seleccionamos "Masa". Calcula cuánta masa se necesita usando tu medida actual.
Resultado: multiplica la proporción de demanda de masa * aceite y la suma para todos los padres.
Nota importante: Esta solución asume una jerarquía de 2 niveles (producto > ingrediente > componente). Si tienes niveles más profundos (por ejemplo, Componente > Subcomponente), necesitarías un patrón recursivo más complejo usando funciones PATH o preparación para Python/SQL. Pero para la estructura que compartiste, este patrón DAX es la forma más eficiente.
¡Pruébalo y dime si los números coinciden con tus expectativas!
Si mi respuesta ha resuelto tu duda, por favor márcalo como la Solución Aceptada para ayudar a otros. Además, agradecería un 'Kudos' si te ha resultado útil mi respuesta.
Esta respuesta fue asistida por IA para fines de traducción y formato.
¡Eres un mago! ¡Gracias!
¡Jaja, gracias @EvinMensler ! Agradezco las palabras amables.
La transición de contexto DAX a veces puede sentirse como magia oscura. Pero una vez que dominas cómo CALCULAR y TODOS funcionan juntos, eres tú quien controla la varita.
Ya que la fórmula te funciona, ¿podrías marcar la respuesta anterior como Solución Aceptada? Ayuda a otros a encontrar este patrón de listas de materiales rápidamente cuando se quedan atascados con el mismo problema.
¡Feliz reportaje!
En una comprobación de seguimiento parece que el total general no es la suma de todos los ingredientes. ¿Cómo puedo cambiarlo?