En la definición de una fila o columna calculada es posible hacer referencia a los valores de la grilla mediante las etiquetas de los elementos que les corresponden en los ejes.
Para acceder al valor de cierta celda se puede utilizar una expresión del tipo:
[<elemento>]
donde <elemento> es el nombre de unos de los elementos del nivel corriente de la dimensión que se encuentra en el eje al cual se agrega el elemento calculado.
Nota: El uso de columnas calculadas o de filas calculadas en los ejemplos es arbitrario. Todo ejemplo realizado con columnas calculadas puede realizarse con filas y viceversa, utilizando las mismas expresiones.
En el siguiente ejemplo la columna calculada 'California + Florida' fue definida con la expresión:
[California] + [Florida]
El valor de la columna calculada en una fila determinada (por ejemplo el valor 193 de la segunda fila), se obtiene entonces de sumar el valor de la columna California ([California]) y el valor de la columna Florida ([Florida]) en dicha fila (106 + 87 = 193).
En caso de tener dos dimensiones en el eje para acceder al valor de un elemento de la dimensión más interior en el anidamiento se puede utilizar una expresión del tipo:
[<elemento1>.<elemento2>]
donde <elemento1> es un elemento en el nivel corriente de la dimensión más exterior en el anidamiento y especifica a cual de las diferentes instancias de <elemento2> (que es un elemento del nivel corriente de la dimensión más interior en el anidamiento) se desea hacer referencia.
En el siguiente ejemplo la columna calculada 'USA + Foreign (1997)' fue definida con la expresión:
["1997".USA] + ["1997".Foreign]
El valor de la columna calculada en una fila determinada (por ejemplo el valor 172 de la segunda fila), se obtiene entonces de sumar el valor de la columna USA para 1997 (["1997".USA]) y el valor de la columna Foreign para 1997 (["1997".Foreign]) en dicha fila (117 + 55 = 172).
Se verá más adelante (Acceso a rangos de valores) que es posible obtener el mismo resultado anterior mediante una expresión como:
["1997"]
Observar que en todos los casos para referenciar al elemento 1997 se utilizaron comillas como forma de demarcar la etiqueta: "1997".
Las comillas dobles pueden ser usadas para demarcar las etiquetas de cualquier elemento opcionalmente, pero son obligatorias en aquellas etiquetas que no comienzan con una letra o que contengan espacios en blanco. Por ejemplo:
["1999"] ["Mountain Bikes"] ["12Months"]
De forma similar al ejemplo anterior es posible acceder a valores que no sean del mismo año. Así se puede tener como en el siguiente ejemplo una columna 'USA' cuya expresión es:
["1995".USA] + ["1996".USA] + ["1997".USA] + ["1998".USA]
El valor de la columna calculada en una fila determinada (por ejemplo el valor 440 de la segunda fila), se obtiene entonces de sumar el valor de la columna USA para 1995, 1996, 1997 y 1998 (["1995".USA] + ["1996".USA] + ["1997".USA] + ["1998".USA]) en dicha fila (45 + 102 + 117 + 176 = 440).
En caso de tener más de dos dimensiones anidadas en un eje, la forma de referirse a un valor específico es análogo al caso de dos dimensiones. Se debe especificar todo el camino (mediante etiquetas de elementos separadas con puntos) desde la dimensión más exterior en la anidación hasta la dimensión más interior.
En estos casos la expresión será del tipo:
'[' <elemento>[.<elemento>]* ']'
es decir la etiqueta de un elemento de la dimensión más exterior en el anidamiento, seguida de tantas etiquetas de elementos separadas por puntos como sean necesarias para llegar a un elemento de la dimensión más interior.
Nota: en la expresión anterior no se deben confundir los corchetes que se incluyen para indicar que algo es opcional en la misma de los que corresponden al operador [] que están delimitados por comillas simples: '[' y ']'.
Se puede ver a continuación un ejemplo con 3 dimensiones en el eje:
Para referirse a cada uno de los valores de la columna que se indica en la expresión de definición de una columna calculada se debe utilizar:
["1995"."Major Accounts".USA]
A pesar de lo visto hasta ahora, no siempre será necesario especificar un camino completo (o absoluto) para referirse a un elemento determinado y es más, en ciertas circunstancias la utilización de caminos no absolutos puede ser una necesidad o ventaja tanto del punto de vista del cálculo que se desea hacer como en la simplificación de la escritura de las expresiones.
A continuación se describen algunos mecanismos que muestran otras alternativas en la especificación de caminos para referirse a valores.
En el siguiente ejemplo se agregó a la dimensión Customers una fila calculada 'USA - Foreign' cuya expresión es:
[group.USA] - [group.Foreign]
Claramente en este caso no es posible utilizar caminos absolutos para referirse a los valores de los elementos que se desean restar, debido a que la fila calculada tiene que utilizar en cada una de sus instancias, valores correspondientes a diferentes instancias de los elementos USA y Foreign. El valor de cada instancia se debe calcular entonces en función de los valores de las instancias USA y Foreign en el grupo al cual se agrega la misma.
Para solucionar este tipo de situaciones, se ofrece el identificador especial 'group' que puede preceder en la especificación de un camino, a la etiqueta de un elemento o a un camino de etiquetas.
El identificador 'group' hace referencia (o representa) al grupo de elementos donde se está definiendo la fila o columna calculada e ira por tanto variando de acuerdo a las instancias de ésta. Es decir que en un camino del tipo group.<elemento>, la instancia de <elemento> a la que se refiere es aquella que esta en el mismo grupo al cual se está agregando la fila o columna calculada.
Nota: el grupo de elementos donde se está definiendo una fila o columna calculada queda definido por el conjunto de elementos que serán en definitiva hermanos del nuevo elemento calculado.
En el caso de la dimensión más de afuera en el anidamiento o en caso de que no haya dimensiones anidadas, el 'group' representa al grupo de elementos de ésta dimensión (de los cuales por supuesto hay una única instancia) en el nivel corriente. En este caso la inclusión o no del 'group' produce el mismo resultado. En el siguiente ejemplo se agrega una fila calculada global que puede ser calculada con cualquiera de las siguientes expresiones:
[group,"Médium Accounts"] * 1000
["Medium Accounts"] * 1000
Existe para este ejemplo una tercer forma de escribir la expresión anterior:
[root."Médium Accounts"] * 1000
Se ha utilizado aquí otro identificador especial ('root') que puede ser incluido al igual que 'group' en la especificación de un camino antes de la etiqueta de un elemento o antes de un camino a un elemento.
El identificador 'root' representa a la raíz en el árbol que forman los elementos de las distintas dimensiones anidadas en un eje. Por eso un camino del tipo root.<elemento> permite acceder a los elementos de la dimensión más de afuera en la anidación de dimensiones del eje. Como se verá en un ejemplo más adelante (Acceso a rangos de valores) el identificador 'root' puede ser muy útil cuando es necesario acceder a los elementos del primer nivel desde una fila o columna calculada que se encuentra más adentro en el anidamiento de dimensiones del eje.
Retomando el ejemplo de la fila 'USA - Foreign' mencionado anteriormente hay que considerar que es también posible utilizar como expresión en ese caso (y obtener el mismo resultado) la siguiente:
[USA] - [Foreign]
Tenemos aquí otro ejemplo donde no se están utilizando caminos absolutos (como ya se menciono estos no sirven a los efectos del cálculo deseado) pero donde tampoco se utiliza el identificador especial 'group' mencionado anteriormente.
Aunque no esta usando el identificador 'group' el resultado es el esperado para esta expresión, ya que se dispone de un mecanismo de búsqueda de nombres que se encarga de identificar cual es el elemento cuyo valor se debe utilizar para el cálculo en cada caso. El mecanismo hará la búsqueda desde adentro hacia afuera en los niveles del anidamiento buscando un elemento con el nombre especificado y se quedará con el primero encontrado. En el ejemplo es claro que ya en el propio nivel donde se define la fila calculada y dentro del propio grupo se encuentra un elemento USA y uno Foreign que serán los utilizados en el cálculo como se esperaba.
Finalmente hay que mencionar al identificador especial 'parent' que permite acceder al elemento padre (dentro del árbol que forman los elementos de las dimensiones anidadas en un eje) del elemento indicado. Es decir que un camino del tipo <elemento>.parent accede al elemento padre de <elemento> en el árbol.
Es posible utilizar 'parent' más de una vez en un camino. En nuestro ejemplo USA.parent.parent devuelve el elemento Route Bikes.
Hasta aquí tenemos entonces como conclusiones:
- es posible acceder a los valores de las celdas a través de los nombres de los elementos correspondientes en los ejes.
- cuando existen dimensiones anidadas en el eje al que se hace referencia, es necesario indicar el camino (<path>) hasta el elemento que se desea referenciar. Estos caminos podrán ser absolutos o relativos.
- es posible utilizar en la definición de un camino (<path>) ciertos identificadores especiales que permiten soportar cierto tipo de cálculo, simplificar la escritura de expresiones o hacer los cálculos más adaptables a la navegación (se hace un Drill, se saca una dimensión del anidamiento, etc.) en el cubo.
- el identificador especial 'root' representa la raíz del árbol que forman los elementos de las dimensiones anidadas en un eje.
- el identificador especial 'group' identifica al grupo al que pertenece la fila o columna calculada que se esta agregando.
- el identificador especial 'parent' permite acceder al padre de un elemento en el árbol que forman los elementos de las dimensiones anidadas en un eje.
- el operador [ ] aplicado a un camino ( [<path>] ) devuelve el valor correspondiente al elemento que indica el camino <path>.
La sintaxis completa de un path es entonces:
*path ::= [group | this | root | name][.(name | parent)]*[.(leaf(exp) | visible)]* *name ::= "string" | id*
id es un identificador (empieza por una letra y no tiene espacios)
exp es una expresión
La función leaf(exp) que puede utilizarse para definir el último nivel del camino como se puede ver y será descripta más adelante. Los identificadores this y visible serán también descriptos más adelante.
Volviendo al operador [ ] el cual como se comento permite obtener el valor de una celda, son importantes las siguientes observaciones:
- si se está definiendo una columna calculada, en la evaluación del valor para cada fila de dicha columna, el valor de una expresión del tipo [<path>] será el de la celda definida por la columna correspondiente al elemento indicado por <path> y la fila para la cual se está evaluando.
- de forma análoga si se esta definiendo una fila calculada, en la evaluación del valor para cada columna de dicha fila, el valor de una expresión del tipo [<path>] será el de la celda definida por la fila correspondiente al elemento indicado por <path> y la columna para la cual se está evaluando.
Es decir que se podría pensar que el operador [ ] recibe en estos casos además del <path> un segundo parámetro implícito (no visible y que no es necesario especificar al definir la expresión) que variará de acuerdo a la columna o fila para la cual se está calculando el valor de la expresión.
No obstante lo mencionado antes es posible en forma opcional especificarle al operador [ ] un segundo <path> como parámetro. En este caso en lugar de variar la columna o fila que se considera de acuerdo a la posición que se esté calculando, la columna o fila quedará fija en el elemento indicado por este segundo camino. De lo dicho antes debe ser claro que el camino que se especifique como segundo parámetro al operador [ ] debe hacer referencia a elementos que se encuentran en el eje contrario al cual se esta agregando el elemento calculado.
En el siguiente ejemplo, la columna calculada 'Diff 1998' utiliza una expresión de este tipo en el segundo termino de la resta:
["Mountain Bikes"] - ["Mountain Bikes", "1998"]
Como se ve la columna calculada pretende mostrar la diferencia entre los valores para "Mountain Bikes" en cada año y el año 1998. Mientras que el valor del primer termino de la expresión (["Mountain Bikes"]) varía con la evaluación en cada fila (pues no se especifica un camino como segundo parámetro), el del segundo termino ["Mountain Bikes", "1998"]) permanece fijo en todas las evaluaciones y corresponde a la celda indicada (2050).
La sintaxis completa del operador [ ] es entonces:
'['<path1> [,<path2>] ']'
donde path1 es un camino en el eje corriente (es decir en el que se está definiendo la fila o columna calculada) y path2 es un camino en el otro eje.
Nota: se debe tener en cuenta de la sintaxis de path presentada anteriormente, que el identificador especial 'group' solo tiene significado cuando el camino que se construye se utiliza como primer parámetro del operador [ ]. Por su parte, como se verá más adelante, el identificador especial 'this' tendrá sentido cuando el camino que se construye se utiliza como segundo parámetro del operador [ ].