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

Microsoft is giving away 50,000 FREE Microsoft Certification exam vouchers. Get Fabric certified for FREE! Learn more

Reply
Syndicate_Admin
Administrator
Administrator

Native Matrix Visual Glitch - Los botones de expansión/contracción no funcionan

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:

PedroMorbey_1-1713806138685.png

2. Así es como se muestra cuando intento expandir el primer elemento en el objeto visual usando el botón de alternancia:

PedroMorbey_2-1713806201062.png

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:

PedroMorbey_3-1713806366680.png

¿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

2 REPLIES 2
Syndicate_Admin
Administrator
Administrator

@v-yifanw-msft ,

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

Syndicate_Admin
Administrator
Administrator

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:

  1. Intente simplificar la métrica para ver si el problema persiste. Esto ayuda a determinar si la complejidad de la métrica es realmente la causa raíz. Puede comenzar dividiendo la métrica en partes más pequeñas y simples y probando la funcionalidad de expansión/contracción de cada parte.
  2. Asegúrese de que las relaciones entre las tablas estén correctamente definidas. Las relaciones incorrectas o inactivas pueden dar lugar a un comportamiento inesperado de los objetos visuales. Para obtener más información, consulte:
    Guía de solución de problemas de relaciones: Power BI | Microsoft Learn
  3. Intente crear una métrica explícita simple (por ejemplo, la suma de las ventas) y vea si la función expandir/contraer funciona como se espera. Esto ayuda a aislar el problema de la métrica DAX específica que ha creado. Para obtener más información sobre las métricas explícitas e implícitas, consulte:
    Descripción del esquema de estrella y la importancia de Power BI - Power BI | Microsoft Learn

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.

Helpful resources

Announcements
PBIApril_Carousel

Power BI Monthly Update - April 2025

Check out the April 2025 Power BI update to learn about new features.

Notebook Gallery Carousel1

NEW! Community Notebooks Gallery

Explore and share Fabric Notebooks to boost Power BI insights in the new community notebooks gallery.

April2025 Carousel

Fabric Community Update - April 2025

Find out what's new and trending in the Fabric community.

Top Kudoed Authors