Microsoft is giving away 50,000 FREE Microsoft Certification exam vouchers. Get Fabric certified for FREE! Learn more
Hola
Actualmente tengo una medida DAX que está desencadenando un comportamiento bastante extraño en el objeto visual nativo de Matrix.
Estoy usando 4 campos que pertenecen a la misma tabla (Dim_Product) en las filas y que miden en los valores.
Aparentemente , la medida devuelve los valores correctos, pero deshabilita la funcionalidad del botón Expandir y contraer del objeto visual.
Ejemplo:
1. Este es el estado de lo visual sin ninguna expansión de campo:
2. Así es como se muestra cuando intento expandir el primer elemento en el objeto visual usando el botón de alternancia:
Como puede ver arriba, el estado del botón cambia (de [+] a [-]), pero no se expande ninguna fila relacionada a continuación. Sin embargo, cuando usamos el icono de encabezado "Expandir todo hacia abajo en un nivel en la jerarquía", muestra todas las filas expandidas del segundo campo en la jerarquía de filas con los valores correctos:
¿Es este comportamiento algo de lo que alguna vez has oído hablar y sabes cómo lidiar?
Como referencia, estoy usando un esquema de copo de nieve bastante simple con una tabla de hechos y la medida que desencadena el comportamiento que acabo de describir es la siguiente:
9Box_Cluster_NS_by_Formulation =
// 9-Box Thresholds
// Net Sales Absolute Thresholds
VAR _Net_Sales_Absolute_Low_Threshold = [NS_Or_Vol_Absolute_Lower_Threshold]
VAR _Net_Sales_Absolute_High_Threshold = [NS_Or_Vol_Absolute_Higher_Threshold]
// Net Sales Relative Thresholds
VAR _Net_Sales_Relative_Low_Threshold = [NS_Or_Vol_Relative_Lower_Threshold]
VAR _Net_Sales_Relative_High_Threshold = [NS_Or_Vol_Relative_Higher_Threshold]
// Threshold Type
VAR _Threshold_Type = SELECTEDVALUE( 'AUX_9Box_Y_Axis_Threshold_Type'[Threshold Type] )
// Gross Margin Thresholds
VAR _Gross_Margin_High_Threshold = [Gross_Margin_Higher_Threshold]
VAR _Gross_Margin_Low_Threshold = [Gross_Margin_Lower_Threshold]
// Base Tables
VAR _Base_Table =
FILTER(
CALCULATETABLE (
ADDCOLUMNS (
SUMMARIZE (
FCT_Sales_by_GMN_and_ProfitCentre, 'DIM_Product'[Formulation] ),
"@Net Sales", [Net Sales],
"@Gross Margin", [% Gross Margin]
),
ALLSELECTED ( 'DIM_Product' ),
ALLSELECTED ( 'DIM_Production_Technology_Group'),
ALLSELECTED ( DIM_Site ),
ALLSELECTED ( DIM_Profit_Centre ),
ALLSELECTED ( 'Date' ),
ALLSELECTED ( DIM_Product_Status ),
ALLSELECTED ( DIM_BU )
),
NOT( 'DIM_Product'[Formulation] IN {"Cx Only","N/A", "0", "Missing Formulation", "Multiple Formulation", "No Formulation"} )
)
VAR AllSales =
SUMX( _Base_Table, [@Net Sales] )
VAR _Final_Table =
// Add the cumulative percentage of Net Sales
ADDCOLUMNS (
_Base_Table,
"@CumulatedPct",
VAR CurrentSalesAmt = [@Net Sales]
VAR CumulatedSales =
FILTER (
_Base_Table,
[@Net Sales] >= CurrentSalesAmt
)
VAR CumulatedSalesAmount =
SUMX (
CumulatedSales,
[@Net Sales]
)
VAR Perc =
DIVIDE (
CumulatedSalesAmount,
AllSales
)
RETURN
MIN ( Perc, 1 ) -- Avoid >100% in case of rounding issues
)
// Filter tables
VAR _Filter_HighHigh =
FILTER(
_Final_Table,
IF(
"High x High" IN VALUES(AUX_9Box_Cluster_Performance_Slicer[Performance Cluster]),
IF( _Threshold_Type = "Absolute",
_Net_Sales_Absolute_High_Threshold < [@Net Sales] && _Gross_Margin_High_Threshold < [@Gross Margin],
[@CumulatedPct] < _Net_Sales_Relative_High_Threshold && _Gross_Margin_High_Threshold < [@Gross Margin]
),
False
)
)
VAR _Filter_HighMedium =
FILTER(
_Final_Table,
IF(
"High x Medium" IN VALUES(AUX_9Box_Cluster_Performance_Slicer[Performance Cluster]),
IF( _Threshold_Type = "Absolute",
_Net_Sales_Absolute_High_Threshold < [@Net Sales] && ((_Gross_Margin_Low_Threshold <= [@Gross Margin]) && ([@Gross Margin] <= _Gross_Margin_High_Threshold)),
[@CumulatedPct] < _Net_Sales_Relative_High_Threshold && ((_Gross_Margin_Low_Threshold <= [@Gross Margin]) && ([@Gross Margin] <= _Gross_Margin_High_Threshold))
),
False
)
)
VAR _Filter_HighLow =
FILTER(
_Final_Table,
IF(
"High x Low" IN VALUES(AUX_9Box_Cluster_Performance_Slicer[Performance Cluster]),
IF( _Threshold_Type = "Absolute",
_Net_Sales_Absolute_High_Threshold < [@Net Sales] && [@Gross Margin] < _Gross_Margin_Low_Threshold,
[@CumulatedPct] < _Net_Sales_Relative_High_Threshold && [@Gross Margin] < _Gross_Margin_Low_Threshold
),
False
)
)
VAR _Filter_MediumHigh =
FILTER(
_Final_Table,
IF(
"Medium x High" IN VALUES(AUX_9Box_Cluster_Performance_Slicer[Performance Cluster]),
IF( _Threshold_Type = "Absolute",
((_Net_Sales_Absolute_Low_Threshold <= [@Net Sales]) && ([@Net Sales] <= _Net_Sales_Absolute_High_Threshold)) && _Gross_Margin_High_Threshold < [@Gross Margin],
(([@CumulatedPct] >= _Net_Sales_Relative_High_Threshold) && ([@CumulatedPct] <= _Net_Sales_Relative_Low_Threshold)) && _Gross_Margin_High_Threshold < [@Gross Margin]
),
False
)
)
VAR _Filter_MediumMedium =
FILTER(
_Final_Table,
IF(
"Medium x Medium" IN VALUES(AUX_9Box_Cluster_Performance_Slicer[Performance Cluster]),
IF( _Threshold_Type = "Absolute",
((_Net_Sales_Absolute_Low_Threshold <= [@Net Sales]) && ([@Net Sales] <= _Net_Sales_Absolute_High_Threshold)) && ((_Gross_Margin_Low_Threshold <= [@Gross Margin]) && ([@Gross Margin] <= _Gross_Margin_High_Threshold)),
(([@CumulatedPct] >= _Net_Sales_Relative_High_Threshold) && ([@CumulatedPct] <= _Net_Sales_Relative_Low_Threshold)) && ((_Gross_Margin_Low_Threshold <= [@Gross Margin]) && ([@Gross Margin] <= _Gross_Margin_High_Threshold))
),
False
)
)
VAR _Filter_MediumLow =
FILTER(
_Final_Table,
IF(
"Medium x Low" IN VALUES(AUX_9Box_Cluster_Performance_Slicer[Performance Cluster]),
IF( _Threshold_Type = "Absolute",
((_Net_Sales_Absolute_Low_Threshold <= [@Net Sales]) && ([@Net Sales] <= _Net_Sales_Absolute_High_Threshold)) && ([@Gross Margin] < _Gross_Margin_Low_Threshold),
(([@CumulatedPct] >= _Net_Sales_Relative_High_Threshold) && ([@CumulatedPct] <= _Net_Sales_Relative_Low_Threshold)) && ([@Gross Margin] < _Gross_Margin_Low_Threshold)
),
False
)
)
VAR _Filter_LowHigh =
FILTER(
_Final_Table,
IF(
"Low x High" IN VALUES(AUX_9Box_Cluster_Performance_Slicer[Performance Cluster]),
IF( _Threshold_Type = "Absolute",
([@Net Sales] < _Net_Sales_Absolute_Low_Threshold) && (_Gross_Margin_High_Threshold < [@Gross Margin]),
[@CumulatedPct] > _Net_Sales_Relative_Low_Threshold && (_Gross_Margin_High_Threshold < [@Gross Margin])
),
False
)
)
VAR _Filter_LowMedium =
FILTER(
_Final_Table,
IF(
"Low x Medium" IN VALUES(AUX_9Box_Cluster_Performance_Slicer[Performance Cluster]),
IF( _Threshold_Type = "Absolute",
[@Net Sales] < _Net_Sales_Absolute_Low_Threshold && ((_Gross_Margin_Low_Threshold <= [@Gross Margin]) && ([@Gross Margin] <= _Gross_Margin_High_Threshold)),
[@CumulatedPct] > _Net_Sales_Relative_Low_Threshold && ((_Gross_Margin_Low_Threshold <= [@Gross Margin]) && ([@Gross Margin] <= _Gross_Margin_High_Threshold))
),
False
)
)
VAR _Filter_LowLow =
FILTER(
_Final_Table,
IF(
"Low x Low" IN VALUES(AUX_9Box_Cluster_Performance_Slicer[Performance Cluster]),
IF( _Threshold_Type = "Absolute",
([@Net Sales] < _Net_Sales_Absolute_Low_Threshold) && ([@Gross Margin] < _Gross_Margin_Low_Threshold),
[@CumulatedPct] > _Net_Sales_Relative_Low_Threshold && ([@Gross Margin] < _Gross_Margin_Low_Threshold)
),
False
)
)
VAR _final_filter =
UNION(
_Filter_HighHigh,
_Filter_HighMedium,
_Filter_HighLow,
_Filter_MediumHigh,
_Filter_MediumMedium,
_Filter_MediumLow,
_Filter_LowHigh,
_Filter_LowMedium,
_Filter_LowLow
)
-- Measure Return
RETURN
CALCULATE(
[Net Sales],
KEEPFILTERS(
_final_filter
)
)
P.D: Sé que la medida es enrevesada, pero dejando a un lado las optimizaciones, está devolviendo los valores deseados en todos los niveles de la jerarquía visual.
P.D.2: Esto está sucediendo con esta medida, pero no está sucediendo con otras medidas más simples, lo que me lleva a creer que debe ser el brebaje del DAX el que está desencadenando el comportamiento. De todos modos, estoy en tus manos 🙏
Saludos
Pedro
De hecho, después de intentar simplificarlo/alterarlo para ver algunos cambios, pude llegar al comportamiento visual normal de Matrix. Cambié el cálculo FILTER de las tablas virtuales intermedias de un IF anidado a una evaluación booleana regular y funcionó.
Partí de este enfoque inicial en el que la condición FILTER de las tablas intermedias tenía algunos IF anidados:
// Filter tables VAR _Filter_HighHigh = FILTER( _Final_Table, IF( "High x High" IN VALUES(AUX_9Box_Cluster_Performance_Slicer[Performance Cluster]), IF( _Threshold_Type = "Absolute", _Net_Sales_Absolute_High_Threshold < [@Net Sales] && _Gross_Margin_High_Threshold < [@Gross Margin], [@CumulatedPct] < _Net_Sales_Relative_High_Threshold && _Gross_Margin_High_Threshold < [@Gross Margin] ), False ) )
A este más sencillo:
// Filter tables
VAR _Filter_HighHigh_Abs =
FILTER(
_Final_Table,
"High x High" IN _Selected_9Box_Clusters
&& _Threshold_Is_Absolute
&& _Net_Sales_Absolute_High_Threshold < [@Net Sales] && _Gross_Margin_High_Threshold < [@Gross Margin]
)
Esta medida está lejos de estar optimizada, pero por ahora está funcionando según lo previsto sin mayores problemas de rendimiento. Gracias por responderme.
Saludos
Hola @PedroMorbey ,
En función de la información que ha proporcionado, la funcionalidad de expansión o contracción de un objeto visual de matriz puede verse afectada por el modelo de datos y las métricas de DAX que se le aplican. Hay varios pasos que puede seguir para solucionar y resolver el problema:
Saludos
Ada Wang
Si esta publicación ayuda, considere Aceptarlo como la solución para ayudar a los otros miembros a encontrarlo más rápidamente.
Check out the April 2025 Power BI update to learn about new features.
Explore and share Fabric Notebooks to boost Power BI insights in the new community notebooks gallery.