Forum Discussion

Syndicate_Admin's avatar
Syndicate_Admin
Icon for Administrator rankAdministrator
4 years ago
Solved

¿Variable parece romper modelo?

Ok tengo el siguiente modelo simple:

vckbx_0-1651607880303.png

He creado la siguiente medida en la tabla registro:

Active = 
var _date = FIRSTDATE('Date'[Date])
var _start = SELECTEDVALUE('Registration'[StartDate])
var _end = SELECTEDVALUE('Registration'[EndDate])
return
IF(
    _start <= _date
    && OR(_end >= _date,_end=BLANK())
    ,1,0
    )

Mi medida funciona como se esperaba:

vckbx_1-1651607969036.png

vckbx_2-1651608008368.png

Pero se rompe cuando saco un campo de "Equipos" a la Tabla:

vckbx_3-1651608055901.png

¡Gracias por su ayuda!

  • Hola @vckbx ,

    Cambiar su medida a la siguiente resolverá el problema:

    Active = 
    VAR _date = FIRSTDATE('Date'[Date])
    VAR _start = SELECTEDVALUE('Registration'[StartDate])
    VAR _end = SELECTEDVALUE('Registration'[EndDate])
    RETURN
    SWITCH ( TRUE (),
        ISEMPTY ( Registration ), BLANK (),
        _start <= _date && ( _end >= _date || _end=BLANK() ), 1,
        0
        )


    Enviaré un seguimiento tratando de explicar por qué estás golpeando este problema en primer lugar.

5 Replies

  • ¿Puede compartir el archivo (publicar un enlace a una unidad / buzón, etc.)

    Parece que algo es extraño en la tabla de sus equipos o en la relación entre ellos.

    En su defecto, puede pegar algunos datos de demostración en un formato de tabla para cada tabla.

  • Enviaré un archivo para demostrarlo, pero su medida devuelve un valor independientemente de si existe o no una combinación entre las dos tablas.

  • Hola @vckbx ,

    Cambiar su medida a la siguiente resolverá el problema:

    Active = 
    VAR _date = FIRSTDATE('Date'[Date])
    VAR _start = SELECTEDVALUE('Registration'[StartDate])
    VAR _end = SELECTEDVALUE('Registration'[EndDate])
    RETURN
    SWITCH ( TRUE (),
        ISEMPTY ( Registration ), BLANK (),
        _start <= _date && ( _end >= _date || _end=BLANK() ), 1,
        0
        )


    Enviaré un seguimiento tratando de explicar por qué estás golpeando este problema en primer lugar.

    • Syndicate_Admin's avatar
      Syndicate_Admin
      Icon for Administrator rankAdministrator

      Así que lo primero es recrear el problema con el DAX más simple posible. Si reemplaza su medida "Activo" por

      Active = 1

      Encontrarás que obtienes exactamente las mismas filas en el visual. En efecto, su medida es devolver cada combinación (un producto de unión cruzada / cartesiana) entre el equipo y el registro. La alteración que sugerí a su medida verifica si para un equipo en particular la tabla de registro está vacía, y devuelve en blanco si es lo que impide que ocurra esta unión cruzada.

      Todo esto se debe a la consulta que Power BI escribe debajo de la superficie contra su motor. La ejecución del analizador de rendimiento y la limpieza de la consulta muestran que el objeto visual de la tabla ejecuta algo como:

      DEFINE
        VAR FilterTable = 
          FILTER(
            KEEPFILTERS(VALUES('Date'[Date])),
            'Date'[Date] >= DATE(2022, 4, 2)
          )
      
        VAR Result = 
          SUMMARIZECOLUMNS(
            'Registration'[Person],
            'Registration'[Start Date],
            'Registration'[End Date],
            'Team'[Mascot],
            'Team'[Team],
            FilterTable,
            "Active", [Active]
          )
      
      EVALUATE
        Result

      En relación con la Guía DAX, hay la siguiente nota con respecto a SUMMARIZECOLUMNS:

      "Los filtros en SUMMARIZECOLUMNS solo se aplican a las columnas agrupadas de la misma tabla y a las medidas. No se aplican a las columnas de grupo por de otras tablas directamente, sino indirectamente a través del filtro implícito no vacío de las medidas. Para aplicar un filtro a la columna de grupo por incondicionalmente, aplique el filtro a través de una función CALCULATETABLE que evalúa SUMMARIZECOLUMNS."

      El filtro de fecha no se aplica directamente a ninguna columna, por lo que literalmente está formando un producto caresiano de Registros y Equipos para el cual su medida "Activa" original siempre devolverá un valor. La única forma de corregir esto es forzar que la medida regrese en blanco en las filas que no queremos.

      Otra forma de ver lo que está haciendo SUMMARIZECOLUMNS es crear una tabla calculada en PowerBI con el siguiente DAX:

      Test Table = 
       SUMMARIZECOLUMNS(
            'Registration'[Person],
            'Registration'[Start Date],
            'Registration'[End Date],
            'Team'[Mascot],
            'Team'[Team]
          )

      Escribí una solución similar en el siguiente blog: SUMMARIZECOLUMNS and Filters – Dobbs On Data

      Citando a Alberto "SUMMARIZECOLUMNS es probable que sea el rey de las travesuras de DAX"