Uso de variables de periodo en indicadores MDX.

4 03 2008

Por Noé Zavala 

En Artus, es posible utilizar variables de periodos que sirvan para modificar, dinámicamente, el comportamiento de los indicadores.  Estas son variables de Artus que toman el valor de las fechas de los periodos insertados y los convierten a un formato comprensible para el motor de MDX.

@FECHA_INI y @FECHA_FIN son 2 de las variables de Artus que pueden ser útiles para hacer calculaos.  Por ejemplo, si se requiere la cantidad de meses transcurridos en el periodo podemos utilizar la función MONTH de MDX, la cual se usa de la siguiente manera:

MONTH(CDATE(“@FECHA_INI”))

A la función MONTH se le debe pasar como parámetro una variable tipo Date, en este caso el valor que contiene @FECHA_INI. Pero @FECHA_INI no contiene, per se, una variable tipo Date, sino la fecha contenida en una cadena con formato yyyy-mm-dd. Por lo tanto se debe convertir a tipo Date y para eso usamos la función CDATE, la cual debe recibir como parámetro un String y para eso le indicamos que se trata de un cadena de caracteres: “@USEFECHA_INI”.  Con estas funciones y estas variables, ya podemos utilizar las fechas para hacer cálculos básicos o tan complejos como sea necesario. 

Ejemplo:

[Measures].[Store Sales]/(MONTH(CDATE(“@FECHA_FIN”)) – MONTH(CDATE(“@FECHA_INI”)) + 1)

@USEFECHA_INI y @USEFECHA_FIN son otras 2 variables de Artus que se pueden utilizar en conjunto con las funciones de tiempo de MDX. Ambas variables, convierten las fechas en el UniqueName correspondiente al periodo. Por ejemplo, si la fecha contiene el  valor ‘2008/Enero/01′ podría ser convertida en el member [Time].[All Time].[2008].[Enero].[01]  (Este UniqueName se obtiene a partir del formato que haya sido establecido en los niveles en la dimensión de tiempo al importar un cubo de AS).   En conjunto con una de las funciones de MDX podemos lograr comportamientos interesantes como el siguiente:

([Measures].[Store Sales], ClosingPeriod([Time].[Month], @USEFECHA_INI))

La función ClosingPeriod devuelve el último member del Nivel indicado en el primer parámetro. En el ejemplo, devolvería el último mes relacionado con el Member resultante en @USEFECHA_INI.  

Si el valor de @USEFECHA_INI es  [Time].[2008] (el periodo en el que se navega está en el level Year), ClosingPeriod devolvería el mes Diciembre por ser el último mes del año. 

Si el valor de @USEFECHA_INI es [Time].[2008].[Q1]  (el level es Quarter), ClosingPeriod devolvería el mes Marzo por ser el último mes del Trimestre.

Si el valor de @USEFECHA_INI es [Time].[2008].[Q1].[1]  (el level es Month), ClosingPeriod devolvería el mismo mes.

Así como la función ClosingPeriod, existen otras muy útiles como OpeningPeriod, ParallelPeriod, Cousin, PeriodsToDate, etc.


Acciones

Información

3 respuestas

28 11 2008
Pedro Sanchez

Otros ejemplos usando
Indicador calculado que obtiene la mayor venta de un periodo de tiempo con la siguiente funcion

MAX({@USEFECHA_INI:@USEFECHA_FIN}, [Measures].[Ventas]) ,

¿Como puedo hacerle para que en lugar de cajas me de el mes donde se encuentra esa mayor venta?.

Es decir si el rango de fechas es de Enero2005 a Enero2006 y la mayor venta esta en Junio2005 el indicador me muestre dicho mes

En Artus Administrator crea un indicador con formula avanzada

CSTR(FILTER ({@USEFECHA_INI:@USEFECHA_INI}, [Measures].[Unit Sales] = MAX({@USEFECHA_INI:@USEFECHA_INI}, [Measures].[Unit Sales]) ).ITEM(0).Properties(“Name”))

Aquí estamos usando la función FILTER, a la cual le decimos que se traiga los members cuyo valor en el indicador [Measures].[Unit Sales] sea igual al MAX.
La función FILTER trae un conjunto de members, así que le decimos con la función ITEM que solo queremos el primero de ellos.

En la función PROPERTIES le estamos pidiendo la propiedad “Name”. También le podemos pedir la propiedad “Key ” o “UniquName”

28 11 2008
Pedro Sanchez

1.- Inventario Promedio
(Unidades)([Measures].[Inventario Unidades]/ {@USEFECHA_INI.FirstChild:@USEFECHA_FIN.LastChild}.Count)

2.- Articulos con Inventario Mayor a 120 Dias
IIF( ([Measures].[Inventario Entre Ventas] * {@USEFECHA_INI.FirstChild:@USEFECHA_FIN.LastChild}.Count ) > 120,
([Measures].[Inventario Entre Ventas] * {@USEFECHA_INI.FirstChild:@USEFECHA_FIN.LastChild}.Count),
0)

3.- Venta Neta Año Anterior
([Measures].[Venta Neta], ParallelPeriod(@USEFECHA_INI.Parent.Level, -1, @USEFECHA_INI) )

4.- Venta Neta Acumulada
Sum(PeriodsToDate(@USEFECHA_INI.Parent.Level),[Measures].[Venta Neta])

5.- Tiempo Convenido De Surtido Año Anterior
([Measures].[Tiempo Convenido De Surtido], ParallelPeriod(@USEFECHA_INI.Parent.Level, -1, @USEFECHA_INI) )

6.- Ventas Totales Unidades Año Anterior
([Measures].[Ventas Totales Unidades], ParallelPeriod(@USEFECHA_INI.Parent.Level, -1, @USEFECHA_INI) )

7.- Pedidos Completos Acumulado
Sum(PeriodsToDate(@USEFECHA_INI.Parent.Level),[Measures].[Pedidos Completos])

8.- Compras Pesos Acumulado
Sum(PeriodsToDate(@USEFECHA_INI.Parent.Level),[Measures].[Compras Pesos])

9.- Utilidad Bruta Año Anterior
([Measures].[Venta Neta], ParallelPeriod(@USEFECHA_INI.Parent.Level, -1, @USEFECHA_INI) ) –
([Measures].[Costo Venta],ParallelPeriod(@USEFECHA_INI.Parent.Level, -1, @USEFECHA_INI) )

10.- Inventario final ( este ya lo dijiste )
([Measures].[Inventario], ClosingPeriod([Fecha1].[Day], @USEFECHA_INI))

11,. Venta Neta Acumulada. Usando Ancestor.
SUM({Ancestor(@USEFECHA_INI, @USEFECHA_INI.Parent.Level).FirstChild:[Time].[1997].[Q1].[3]} ,[Measures].[Store Sales])

13.- Acumulado del inicio de año a la fecha YTD
Sum( YTD( @USEFECHA_INI) , [Measures].[indicador] )

14.- Acumulado del inicio de año al ultimo dia del mes anterior
Sum( YTD( ParallelPeriod(@USEFECHA_INI.Parent.Level, 1, @USEFECHA_INI.Parent) ),[Measures].[Ind1])

15.- Numero de elementos de una dimension ( numero de hijos )
( {[Dimension].CurrentMember.FirstChild:[Dimension].CurrentMember.LastChild}.Count )

16.- Uso de IIF para evitar divisiones entre cero o nulo
iif ( isempty ( [Measures].[Ind2] ) OR [Measures].[Ind2] = 0 , 0, ([Measures].[Ind1]) / ([Measures].[Ind2]) )

17.- Valor Maximo de un indicador
MAX({@USEFECHA_INI:@USEFECHA_FIN}, [Measures].[Indicador])

18.- Mismo dia del mes anterior
([Measures].[Ind1], ParallelPeriod(@USEFECHA_INI.Parent.Level, +1, @USEFECHA_INI) )

19.- Mismo mes año anterior
Sum( MTD(@USEFECHA_INI.Parent.lag(12 ) ) ,[Measures].[Ind1])

20.- Valor de un indicador para solo un elemento
([Measures].[Ind1], [Dimension].&[Elemento] )

21.- Periodo anterior
([Measures].[Ind1], ParallelPeriod(@USEDATE_BEGIN.Level, 1, @USEDATE_BEGIN) )

22.- Promedio
([Measures].[Ind1] / {[Dimension].CurrentMember.FirstChild:[Dimension].CurrentMember.LastChild}.Count)

23,. Dia, Mes, Año. de la fecha inicial
(DAY(CDATE(“@FECHA_INI “)))
(MONTH(CDATE(“@FECHA_INI “)))
(YEAR(CDATE(“@FECHA_INI “)))

Espero que alguna de ellas le sea utiles a alguien

5 03 2009
teremaria

uso de variables y funciones

Dejar un comentario