Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

The Power BI Data Visualization World Championships is back! It's time to submit your entry. Live now!

Reply
Syndicate_Admin
Administrator
Administrator

Cálculo de la expresión basándose en tablas relacionadas

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.

Enlace PBI

El resultado:

ingredient_name = Ingredients_list[ingredient_name]

quantity_forecast = CALCULAR(SUMA(Previsión[cantidad]), RESUMIR(Ingredientes, Previsión[product_name], Ingredientes[ingredient_name]))
ratio_forecast = PROMEDIO(Ingredientes[ratio])
quantity_ingredients = [quantity_forecast] * [ratio_forecast]
ratio_components = PROMEDIO(Componentes[ratio])
quantity_components = [quantity_ingredients] * [ratio_components]
quantity_components_i debería conseguir = ???
ingredient_namequantity_forecastratio_forecastquantity_ingredientsratio_componentsquantity_componentsquantity_components_i debería conseguir
Vaca 0,99 35,07
Bien1270,5063,5
Queso5060,1996,1
Masa5060,46232,8
Harina 0,95 221,12
Lechuga2770,2876,2
Carne1270,2126,7
Aceite5060,0735,40,301111,64
Cebolla1270,1012,7
Salami5060,1155,7
Sal 0,01 0,35
Salsa2770,0719,4
Especias 0,20 3,79
Salsa de tomate5060,1786,0
Tomates1500,5075,00,947180,86

previsión:

product_nameproduct_idcantidad
Ensalada100150
Pizza101506
Hamburguesa102127
Emparedado10312

ingredientes:

product_nameproduct_idingredient_nameingredient_idproporción
Ensalada100Lechuga10,45
Ensalada100Tomates20,5
Ensalada100Salsa30,05
Pizza101Masa110,46
Pizza101Salsa de tomate120,17
Pizza101Aceite2020,07
Pizza101Queso130,19
Pizza101Salami140,11
Hamburguesa102Bien160,5
Hamburguesa102Lechuga180,1
Hamburguesa102Cebolla190,1
Hamburguesa102Salsa30,09
Hamburguesa102Carne220,21

Componentes:

ingredient_nameingredient_idcomponent_namecomponent_idproporción
Salsa3Especias2010,2
Salsa3Aceite2020,8
Masa11Harina2030,95
Masa11Aceite2020,05
Salsa de tomate12Tomates20,94
Salsa de tomate12Aceite2020,06
Carne22Vaca2060,99
Carne22Sal2090,01

ingredients_list:

ingredient_nameingredient_id
Especias201
Aceite202
Harina203
Tomates2
Vaca206
Sal209
Lechuga1
Salsa3
Masa11
Salsa de tomate12
Queso13
Salami14
Bien16
Lechuga18
Cebolla19
Carne22

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]

1 ACCEPTED SOLUTION
Syndicate_Admin
Administrator
Administrator

@EvinMensler ,

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:

  1. Demanda directa: Cuando el producto utiliza el producto directamente (por ejemplo, la pizza usa aceite).

  2. 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 + IndirectDemand

Cómo funciona:

  1. DirectDemand: Mantiene tu lógica existente para el uso de Nivel 1.

  2. IndirectDemand: Analiza la tabla de Componentes. Si se selecciona "Aceite", aparece filas donde el aceite es un componente (padres: Masa, Salsa, etc.).

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

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

View solution in original post

4 REPLIES 4
Syndicate_Admin
Administrator
Administrator

@EvinMensler ,

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:

  1. Demanda directa: Cuando el producto utiliza el producto directamente (por ejemplo, la pizza usa aceite).

  2. 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 + IndirectDemand

Cómo funciona:

  1. DirectDemand: Mantiene tu lógica existente para el uso de Nivel 1.

  2. IndirectDemand: Analiza la tabla de Componentes. Si se selecciona "Aceite", aparece filas donde el aceite es un componente (padres: Masa, Salsa, etc.).

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

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

Helpful resources

Announcements
FabCon Atlanta 2026 carousel

FabCon Atlanta 2026

Join us at FabCon Atlanta, March 16-20, for the ultimate Fabric, Power BI, AI and SQL community-led event. Save $200 with code FABCOMM.