Veremos como incorporar textos al área de valores de una tabla dinámica empleando una medida del Modelo de datos de Power Pivot.
La idea es que la tabla dinámica cruce la información de 'Status' (de tipo texto) según el País y Año desplegados en las áreas de columnas y filas de la tabla dinámica...
Además en los Totales generales aplicaremos algo de formulación para que muestre el último Status...
Lo interesante del asunto: conseguir que se muestren los textos del campo 'Status' en el área de valores.
Para ello emplearemos la función
CONCATENATEX(table; expression; [delimiter]; [order_by_expression1]; [ASC/DESC]; [order_by_expression2];[ASC/DESC];...) as String
que devuelve una cadena de texto concatenando el resultado de una expresión evaluada para cada fila de nuestra tabla... en definitiva, esa X del final, nos indica el uso iterativo por fila (igual que SUMX, COUNTX, etc...), y CONCATENATE nos dice la acción que realiza ('concatenar').
Igualmente, para obtener en los totales generales de nuestra tabla dinámica el último valor de 'Status', usaremos: LASTNONBLANK(column; expression) as table
que nos devuelve una tabla 'algo especial', de solo una fila y una columna, mostrando el último valor de la columna, filtrado por el contexto actual, donde la expresión no esté en blanco.
Un punto importante de esta función es que ordena automáticamente en ASCENDENTE los valores de la columna indicada, y sobre dicha columna ordenada, recupera el úlitmo dato no vacío.
Para gestionar este cálculo emplearemos la función HASONEVALUE ya vista y explicada aquí.
Ya puestos en antecedentes, el primer paso consistirá en agregar la tabla al modelo de datos de Power Pivot.
Con la tabla cargada añadiremos nuestra medida:
En la siguiente etapa, desde el editor de Power Pivot crearemos una tabla dinámica que llevaremos a nuestra hoja...
LLevaremos el campo 'País' al área de columnas.
El campo 'Año' al área de filas
Y nuestra medida 'txtStatus' al área de valores...
y ahí están !!, los textos aparecen donde solo veíamos números!!.
Y extra tip, en los Totales generales hemos dispuesto los últimos datos no vacíos que aparezcan :OO
Una explicación rápida de la medida sería con un doble IF controlamos la aparición de un único valor respecto del 'Año' primero, y del 'País' después.
Con CONCATENATEX hemos generado la cadena de texto que requeríamos (muy simple), solo necesitábamos recuperar el valor de 'Status', pero nos hemos aprovechado de los criterios de ordenación que ofrece la función.
Para obtener el último valor, basado en una ordenación virtual por los campos Años y País, usamos la estructura formulada:
CALCULATE(LASTNONBLANK(Tabla1[Status];TRUE());FILTER(Tabla1; Tabla1[Años]=MAX(Tabla1[Años])&&Tabla1[País]=MAX(Tabla1[País]) )
donde FILTER nos ayuda a recuperar el registro coincidente con el último dato de Año y País.
Curioso el proceder de la función MAX que devuelve el valor mayor de una columna, y si hablamos de columnas de tipo texto el último valor de acuerdo a un orden alfabético. Los valores lógicos dentro de la columna se ignoran.
Viendo el detalle de la tabla dinámica resultante, verificamos lo correcto del proceso ;-)
La idea es que la tabla dinámica cruce la información de 'Status' (de tipo texto) según el País y Año desplegados en las áreas de columnas y filas de la tabla dinámica...
Además en los Totales generales aplicaremos algo de formulación para que muestre el último Status...
Lo interesante del asunto: conseguir que se muestren los textos del campo 'Status' en el área de valores.
Para ello emplearemos la función
CONCATENATEX(table; expression; [delimiter]; [order_by_expression1]; [ASC/DESC]; [order_by_expression2];[ASC/DESC];...) as String
que devuelve una cadena de texto concatenando el resultado de una expresión evaluada para cada fila de nuestra tabla... en definitiva, esa X del final, nos indica el uso iterativo por fila (igual que SUMX, COUNTX, etc...), y CONCATENATE nos dice la acción que realiza ('concatenar').
Igualmente, para obtener en los totales generales de nuestra tabla dinámica el último valor de 'Status', usaremos: LASTNONBLANK(column; expression) as table
que nos devuelve una tabla 'algo especial', de solo una fila y una columna, mostrando el último valor de la columna, filtrado por el contexto actual, donde la expresión no esté en blanco.
Un punto importante de esta función es que ordena automáticamente en ASCENDENTE los valores de la columna indicada, y sobre dicha columna ordenada, recupera el úlitmo dato no vacío.
Para gestionar este cálculo emplearemos la función HASONEVALUE ya vista y explicada aquí.
Ya puestos en antecedentes, el primer paso consistirá en agregar la tabla al modelo de datos de Power Pivot.
Con la tabla cargada añadiremos nuestra medida:
txtStatus:=IF(HASONEVALUE(Tabla1[Años]); IF( HASONEVALUE(TABLA1[País]); CONCATENATEX(Tabla1;Tabla1[Status];"-";Tabla1[Años];ASC;Tabla1[País];ASC); CALCULATE(LASTNONBLANK(Tabla1[Status];TRUE()); FILTER(Tabla1; Tabla1[Años]=MAX(Tabla1[Años]) && Tabla1[País]=MAX(Tabla1[País]) ))) ;CALCULATE(LASTNONBLANK(Tabla1[Status];TRUE()); FILTER(Tabla1;Tabla1[Años]=MAX(Tabla1[Años]) && Tabla1[País]=max(Tabla1[País]))))
En la siguiente etapa, desde el editor de Power Pivot crearemos una tabla dinámica que llevaremos a nuestra hoja...
LLevaremos el campo 'País' al área de columnas.
El campo 'Año' al área de filas
Y nuestra medida 'txtStatus' al área de valores...
y ahí están !!, los textos aparecen donde solo veíamos números!!.
Y extra tip, en los Totales generales hemos dispuesto los últimos datos no vacíos que aparezcan :OO
Una explicación rápida de la medida sería con un doble IF controlamos la aparición de un único valor respecto del 'Año' primero, y del 'País' después.
Con CONCATENATEX hemos generado la cadena de texto que requeríamos (muy simple), solo necesitábamos recuperar el valor de 'Status', pero nos hemos aprovechado de los criterios de ordenación que ofrece la función.
Para obtener el último valor, basado en una ordenación virtual por los campos Años y País, usamos la estructura formulada:
CALCULATE(LASTNONBLANK(Tabla1[Status];TRUE());FILTER(Tabla1; Tabla1[Años]=MAX(Tabla1[Años])&&Tabla1[País]=MAX(Tabla1[País]) )
donde FILTER nos ayuda a recuperar el registro coincidente con el último dato de Año y País.
Curioso el proceder de la función MAX que devuelve el valor mayor de una columna, y si hablamos de columnas de tipo texto el último valor de acuerdo a un orden alfabético. Los valores lógicos dentro de la columna se ignoran.
Viendo el detalle de la tabla dinámica resultante, verificamos lo correcto del proceso ;-)
No hay comentarios:
Publicar un comentario
Nota: solo los miembros de este blog pueden publicar comentarios.