En cualquier modelo de datos es relativamente frecuente la necesidad de analizar un mismo parámetro en función de fechas distintas que describen un mismo evento. Por ejemplo, podemos disponer de una tabla de pedidos donde, para cada uno de ellos, tengamos una fecha de pedido, una de entrega y una de envío. Pueden existir varias relaciones entre dos tablas en un modelo tabular, pero solo una de ellas puede permanecer activa durante la realización de un cálculo determinado, requiriendo la desactivación de las demás:

Image 3

La situación se complica cuando queremos mostrar en una misma visualización los datos para las 3 fechas al mismo tiempo. Para ello, podemos recurrir a la función USERELATIONSHIP() , que especifica la relación que va a ser usada en un determinado cálculo como la única relación existente entre las columnas especificadas como argumentos de dicha función, cambiando la relación activa en el contexto de filtro definido por CALCULATE(). De esta manera, USERELATIONSHIP() anula, cuando sea necesario, la relación activa por defecto entre las dos tablas, activando posteriormente la relación detallada en los parámetros de la función.

Por ejemplo, en la vista de relaciones de la imagen anterior podemos observar que la relación activa entre las tablas ‘Pedidos’ y ‘Calendario’ corresponde al campo que especifica la fecha del pedido correspondiente, quedando las otras 2 relaciones inactivas.

Image 5

Si queremos segmentar las ventas en función de las 3 fechas (pedido, envío y entrega) necesitaremos construir las siguientes medidas:

VentasPorEntrega =
CALCULATE (
[Ventas];
    USERELATIONSHIP ( Pedidos[FechaEntrega]; Calendario[Fecha]  )
)

VentasPorEnvio =
CALCULATE (
[Ventas];
    USERELATIONSHIP ( Pedidos[FechaEnvio]; Calendario[Fecha]  )
)

De esta forma, DAX activa la relación inactiva especificada en los argumentos de la función durante la evaluación del parámetro de expresión de la función CALCULATE(), desactivando (en el mismo momento), la relación activa por defecto que en nuestro caso es la correspondiente a la fecha de pedido, y con la que se calcula la medida [Ventas]. Ahora podemos utilizar las 3 medidas en una misma visualización, de manera que cada una de ellas muestre correctamente los datos segmentados por los periodos definidos en el contexto de filtro:

Image 6

Es importante entender que el estado de la relación no interviene en el uso de la función USERELATIONSHIP() ; es decir, aun cuando la relación especificada se encuentre inactiva en el modelo de datos, se usará y anulará cualquier otra relación activa presente entre las 2 tablas y no mencionada en los argumentos de la función.

Existen multitud de escenarios empresariales en los que tendremos más de una fecha describiendo un mismo evento, ejemplos típicos pueden ser:

  • Fechas de entrada y salida de producción en un taller de fabricación.
  • Fechas de ingreso y de alta en un hospital.
  • Fechas de pedido, envío y entrega en empresas de transporte.
  • Etc.

Un caso de especial interés para mi es el que se genera al usar la contabilidad financiera de una empresa como origen de datos, donde por un lado tendremos un libro diario con las fechas de los asientos contables y por el otro las fechas de los libros de IVA soportado y repercutido. Modelar esta situación con una relación inactiva entre nuestra dimensión temporal y nuestra tabla de registro de IVA soportado por ejemplo, como se muestra en la siguiente imagen, nos permitirá segmentar los datos numéricos por periodos, tanto para cálculos relacionados con los ingresos y gastos de la empresa como para aquellos relacionados con las liquidaciones de impuestos.

Image 1

Por ejemplo, para calcular el IVA soportado del primer trimestre del año 2018 podemos usar el siguiente código:

IVAsop1T =
CALCULATE (
    SUM ( ‘Registro IVAsop'[IVA] );
    USERELATIONSHIP ( ‘Registro IVAsop'[Fecha]; Calendario[Fecha] );
Calendario[Trimestre] = «T1 2018»
)

De este modo, utilizando los importes acumulados de los registros de IVA, nos será posible la creación de visualizaciones que informen del estado de las liquidaciones del impuesto de manera provisional, facilitando así la gestión de la tesorería.

Todo el código DAX de este artículo ha sido formateado con «DAX Formatter»
DAX Formatter by SQLBI