Acceso a rangos de valores


Hasta ahora se ha mostrado como a través del operador [] es posible acceder utilizando un camino de etiquetas como parámetro (o dos) al valor de una celda desde la expresión de una fila o columna calculada. En todos los casos los caminos hacían referencia a elementos que estaban en el nivel más interior en el anidamiento de dimensiones y que por tanto hacían referencia a una fila o columna específica de la grilla.

Sin embargo es posible utilizar como parámetro un camino que referencia a un elemento que no esta en el nivel más interior de la anidación. Es claro que en este caso dicho elemento no determina una única fila o columna en la grilla. Decimos entonces que el camino define un rango de valores.

En el siguiente ejemplo si se utiliza el camino "Export" en la definición de una columna calculada, el mismo hace referencia como se ve a un rango de valores (los correspondientes a 1995, 1996, 1997 y 1998) dentro de la fila para la cual se está evaluando la expresión (en este caso se indica el correspondiente a la segunda fila):

Por lo tanto un rango de valores queda definido por los valores de todas las filas o columnas (depende de en que eje se encuentre el elemento) que están agrupadas dentro del elemento indicado por el camino.

El operador [ ] aplicado a un rango de valores permite evaluar dicho rango acumulando los valores del mismo. La acumulación por defecto consiste en la suma de todos los valores del rango.

En el siguiente ejemplo, la columna calculada 'Export Total' fue definida mediante la siguiente expresión:

[Export]

El valor de la columna calculada en una fila determinada (por ejemplo el valor 191 de la segunda fila), se obtiene entonces de aplicar el operador [ ] al rango de valores definido por "Export". Dado que la forma de acumulación por defecto al aplicar [ ] a un rango, es la suma, el valor calculado es la suma de todos los elementos del rango (31 + 37 + 55 + 68 = 191).

En el siguiente ejemplo se ve como el concepto de rangos de valores y el identificador especial 'group' permiten definir de forma muy sencilla una columna de totalización. La expresión utilizada para la columna 'Total' en este caso es:

[group]

Como se menciono más arriba el identificador especial 'group' representa al grupo dentro del cual se está definiendo la fila o columna calculada. En este caso como el "group" no fue seguido de ningún elemento en particular, no se esta haciendo referencia a una columna específica sino a un rango de valores (determinado por los valores de los elementos del grupo 1995, 1996, 1997 y 1998). Luego la acumulación aplicada es la suma por defecto.

Claramente en este ejemplo el resultado sería el mismo si la columna calculada se definiera mediante la expresión:

[root]

El siguiente ejemplo fue presentado anteriormente y debería ser claro que es posible definir también a la fila calculada 'USA - Foreign' como:

[group.USA]-[group.Foreign]

El siguiente ejemplo presenta un caso algo más complejo e interesante respecto al uso de rangos, la acumulación del operador [] y los identificadores especiales 'group', 'this' y 'parent'. La columna 'Share' fue definida mediante la expresión:

[group] / [group, this.parent]

En primer lugar es necesario comentar que es lo que calcula la columna Share. La idea es calcular la participación de cada una de las categorías de Customers (Medium Accounts, Major Accounts y Others) dentro del total de cada familia de Products (Route Bikes y Mountain Bikes). Entonces el valor de la columna calculada en una fila determinada (por ejemplo el valor 0.54 de la segunda fila) se obtiene de dividir el total para la fila, o sea el total de la categoría de Customers correspondiente para la familia de Products correspondiente (Major Accounts, Route Bikes en el caso de la segunda fila: 428 + 625 + 670 + 621 = 2344), entre el total para la categoría de Products que corresponda (Route Bikes en el caso de la segunda fila: 246 + 327 + 381 + 406 + 428 + 625 + 670 + 621 + 55 + 136 + 189 + 241 = 4325).

En segundo lugar hay que observar como se obtuvieron estos valores utilizando rangos de celdas y los identificadores 'group', 'this' y 'parent'.

El numerador de la expresión (marcado en rojo) no presenta ninguna diferencia respecto al ejemplo anterior donde se obtiene una columna con totales utilizando la expresión [group].

Sin embargo el denominador de la expresión (marcado en amarillo) presenta algunos conceptos más interesantes. Se utilizo el mismo camino que en el numerador (es decir 'group') de forma de obtener la suma total para los 4 años (1995, 1996, 1997 y 1998) pero para extender el rango de valores a considerar se agrego un segundo camino como parámetro.

Anteriormente se presento como utilizar un segundo camino como parámetro del operador [ ] para fijar el valor de una celda a una fila o columna especifica. En este caso se está especificando como segundo parámetro un camino que define un rango de valores en el eje contrario al que se define el elemento calculado (en este caso en las filas).

El rango en las filas fue definido usando el camino this.parent de forma de que el rango tomará no solo la categoría de Customers correspondiente a la posición de evaluación de cada valor de la columna Share, sino también la de Products.
Cuando se utiliza el identificador 'this' en un camino que referencia el eje contrario al cual se define el elemento calculado (en este caso las filas), éste representa a la posición donde se está haciendo la evaluación de cada valor y por tanto al hacer this.parent se obtiene Route Bikes o Mountain Bikes donde corresponda. 
Hasta ahora el valor al que evalúa un rango de valores ha sido la suma de cada uno de los valores pues esa es la acumulación que por defecto se aplica al utilizar el operador [ ] con un rango. Sin embargo se dispone de un conjunto de funciones que permiten evaluar los rangos de valores de diferentes formas.