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.

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”
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
uso de variables y funciones
Cuando utilizo medidas calculadas que hacen referencia al currentmember de tiempo e incluso cuando utilizo @Fecha_ini, me funcionan solo en Artus Designer y no en el sitio (cuando utilizo tiempo.jerarquia.currentmember, toma como si currentmember fuera “all” (porque construye el mdx filtrando en los “with member” y no en el “where”) cuando utilizo @Fecha_ini, ni siquiera me me despliega el campo en la tablita)
…capture con profiler los MDX del sitio y del Artus Designer y efectivamente (obviamente) son diferentes (ArtusD como comentaba filtra en el where y el sitio solo en los with members )
Les agradecería mucho su ayuda .
Saludos
Rogelio
Thank God! Somnoee with brains speaks!
Rogelio, las variables que debes usar es @USEFECHA_INI y @USEFECHA_FIN. @FECHA_INI contiene la fecha tal cual. @USEFECHA_INI contiene el UniqueName del member de tiempo.
Si requieres ayuda personalizada puedes comunicarte al departamento de soporte.
Saludos.
Ok usando efectivamente @usefecha_ini.
Incluso si pongo código identico a uno de los posts de arriba me funciona en el designer pero no funciona una vez que exporto a PHP): Sum(PeriodsToDate(@USEFECHA_INI.Parent.Level)
, [Measures].[Venta]
)
desde luego todo lo demás que exporto si me funciona.
Por cierto perdón por el comentario puesto aqui, supongo que no entendí tampoco el proposito del sitio.
Roosevelt FTW?!
Corine
Saludos, muy bueno este blog, tengo una duda en mdx, algo que es muy trivial en SQL, sabes que deseo hacer una consulta tal que en el where yo pueda indicar
como condicion los nombres de los productos que comiencen por la letra ‘C’, sabemos que en SQL con el comando LIKE sale de un tiro, pero en mdx parece que es mas complicado, me han dicho que use el comando filter pero no entendo aun su funcionalidad, si puedes dar un ejemplo te lo agradeceria… trato de hacer algo asi:
Select [Measure].[Medida] on columns ……….. Where [Producto] “Empiece por C”
Hola, asumo que no estas usando Artus (Artus lo resuelve).
Puedes usar la función filter y ponerle una condición donde indiques lo que quieres obtener:
Select
{[Measures].[Internet Sales Amount]} On Columns,
{Filter({[Product].[Product].[Product].AllMembers},
Left([Product].[Product].CurrentMember.Name, 1) =”C”) } On Rows
From [Adventure Works]
[...] in spanish: in [DMQY]TD, Closing period , parallelperiod. In indonesian: prevmember (google translates it, but the code is self [...]