¿No tienes la confianza necesaria para arriesgarte a modificar los códigos XML de un cubo?, ¿Piensas que vas a generar algún fallo que afecte al correcto funcionamiento?
¡No temas más!(Aunque siempre llevando cuidado) Hoy vamos a exponer dos situaciones que pueden llegar a ser muy comunes y que requieren de modificaciones en el código XML para llevarlas a cabo.
Ordenación de las acciones de detalle (Drillthrough)
La primera de ellas es la ordenación de las acciones de detalle de un cubo. Cuando creamos una nueva acción de detalle en el cubo, para el caso de una Acción de Drillthrough, el orden en el que añadimos las dimensiones a Drillthrough será en principio el que se quedará predeterminado y que sin llevar a cabo una modificación en el código xml no es posible alterar.
Por ello, puedes llegar a no modificar el código por miedo a modificar algo que produzca un fallo.
Hoy, veremos cómo realizar ese cambio de orden modificando el código XML y con un riesgo mínimo de error.
Usaremos como ejemplo el cubo de AdventureWorks y en Actions nos dirigiremos a Finance Details.
Podemos observar que dentro del apartado de Drillthrough Columns tenemos una serie de Medidas y Dimensiones añadidas las cuales, imaginemos que las fuimos añadiendo al mismo tiempo que las íbamos creando y sin un orden determinado. El caso es que ahora necesitamos que tengan un orden entre ellas y para ello deberemos, o borrarlas y volverlas a crear o modificar el código XML.
Cuando procesamos el cubo,creamos un informe simple con la métrica que está en el Drillthrough.
Click derecho, more actions y seleccionamos Drillthrough
Se nos modificará el informe completamente y se nos mostrarán las diferentes dimensiones en el mismo orden al que aparecen en el cubo.
Ahora bien, imaginemos la situación en la que necesitamos que estén ordenados de la siguiente forma respecto a cómo aparecen anteriormente (Ascendente-Descendente):
- Measures(Amount)
- Date
- Scenario
- Organization
- Account
- Department
- Destination Currency.
Para realizar la modificación nos dirigiremos a la ventana lateral, en el Solution Explorer y haremos click derecho encima del Cubo de AdventureWorks.
View Code y se nos abrirá una nueva pestaña con el código XML del Cubo.
Dependiendo siempre de la cantidad de datos que contenga, el código será mayor o menor pero habitualmente nos encontraremos con un código bastante extenso en el cual debemos de llevar cuidado de no tocar nada que esté fuera de nuestro entendimiento. Por ello para localizar de una forma más fácil la línea en la que empieza la parte del código que nos interesa, usaremos la herramienta de búsqueda. Ctrl+F y aparecerá:
El paso siguiente será introducir el nombre del DrillThrough que buscamos y localizarlo.
Una vez localizada, podemos observar el código, en el cual ahora mismo obviaremos muchas de las partes:
<Action xsi:type="DrillThroughAction" dwd:design-time-name="2c74e7cb-c3a1-4cb4-862e-781d34020893"> <ID>Drillthrough Action 2</ID> <Name>Finance Details</Name> <Caption>Drillthrough...</Caption> <Translations> … </Translations> <TargetType>Cells</TargetType> <Target>MeasureGroupMeasures("Financial Reporting")</Target> <Type>DrillThrough</Type> <Default>true</Default> --PARTE DONDE SE DECLARA LAS MEDIDAS, EN ESTE CASO AMOUNT <Columns> <Column xsi:type="MeasureBinding" dwd:design-time-name="5adb0f99-3c24-4a1a-81ef-9e4876765c58"> <MeasureID>Amount</MeasureID> </Column> --PARTE DONDE SE DECLARA DIM DATE CON SUS RESPECTIVAS COLUMNAS(FiscalYear,Date,Calendar Year) <Column xsi:type="CubeAttributeBinding" dwd:design-time-name="f4ea9b0f-acae-4887-9270-7b0e4e54467f"> <CubeID>Adventure Works</CubeID> <CubeDimensionID>Order Date Key - Dim Time</CubeDimensionID> <AttributeID>Fiscal Year</AttributeID> <Type>All</Type> </Column> <Column xsi:type="CubeAttributeBinding" dwd:design-time-name="c0d98c89-5852-4e64-a70a-ac0ac2276165"> <CubeID>Adventure Works</CubeID> <CubeDimensionID>Order Date Key - Dim Time</CubeDimensionID> <AttributeID>TimeKey</AttributeID> <Type>All</Type> </Column> <Column xsi:type="CubeAttributeBinding" dwd:design-time-name="cdef5db1-5bbb-4c16-916e-cc0354b1e06e"> <CubeID>Adventure Works</CubeID> <CubeDimensionID>Order Date Key - Dim Time</CubeDimensionID> <AttributeID>CalendarYear</AttributeID> <Type>All</Type> </Column> --PARTE DONDE SE DECLARA LA DIM ORGANIZATION <Column xsi:type="CubeAttributeBinding" dwd:design-time-name="c0b524fa-529d-4c2a-a879-2ee4bdf36a8b"> <CubeID>Adventure Works</CubeID> <CubeDimensionID>Dim Organization</CubeDimensionID> <AttributeID>Parent Organization Key</AttributeID> <Type>All</Type> </Column> --PARTE DONDE SE DECLARA LA DIM ACCOUNT <Column xsi:type="CubeAttributeBinding" dwd:design-time-name="2e7fb3e6-f09c-4fa5-a3f6-7ca6a4b40b74"> <CubeID>Adventure Works</CubeID> <CubeDimensionID>Dim Account</CubeDimensionID> <AttributeID>Parent Account Key</AttributeID> <Type>All</Type> </Column> --PARTE DONDE SE DECLARA LA DIM SCENARIO <Column xsi:type="CubeAttributeBinding" dwd:design-time-name="7008e054-0621-4c6e-8c4e-31f334effb89"> <CubeID>Adventure Works</CubeID> <CubeDimensionID>Dim Scenario</CubeDimensionID> <AttributeID>Scenario Name</AttributeID> <Type>All</Type> </Column> --PARTE DONDE SE DECLARA LA DIM DEPARMENTS <Column xsi:type="CubeAttributeBinding" dwd:design-time-name="fa9361b8-315b-45e6-a627-ee54d7981a8c"> <CubeID>Adventure Works</CubeID> <CubeDimensionID>Dim Department Group</CubeDimensionID> <AttributeID>Parent Department Group Key</AttributeID> <Type>All</Type> </Column> --PARTE DONDE SE DECLARA LA DIM DESTINATION CURRENCY <Column xsi:type="CubeAttributeBinding" dwd:design-time-name="f4f845ef-1fbf-4040-bfdc-1946a84dd14f"> <CubeID>Adventure Works</CubeID> <CubeDimensionID>Destination Currency</CubeDimensionID> <AttributeID>Currency Alternate Key</AttributeID> <Type>All</Type> </Column> </Columns> </Action>
Por lo que ahora lo que haremos será modificar el orden de los elementos y adaptarlos a nuestro requerimiento. Este quedará de la siguiente manera:
<Action xsi:type="DrillThroughAction" dwd:design-time-name="2c74e7cb-c3a1-4cb4-862e-781d34020893"> <ID>Drillthrough Action 2</ID> <Name>Finance Details</Name> <Caption>Drillthrough...</Caption> <Translations> … </Translations> <TargetType>Cells</TargetType> <Target>MeasureGroupMeasures("Financial Reporting")</Target> <Type>DrillThrough</Type> <Default>true</Default> --PARTE DONDE SE DECLARA LAS MEDIDAS, EN ESTE CASO AMOUNT <Columns> <Column xsi:type="MeasureBinding" dwd:design-time-name="5adb0f99-3c24-4a1a-81ef-9e4876765c58"> <MeasureID>Amount</MeasureID> </Column> --PARTE DONDE SE DECLARA DIM DATE CON SUS RESPECTIVAS COLUMNAS(FiscalYear,Date,Calendar Year) <Column xsi:type="CubeAttributeBinding" dwd:design-time-name="f4ea9b0f-acae-4887-9270-7b0e4e54467f"> <CubeID>Adventure Works</CubeID> <CubeDimensionID>Order Date Key - Dim Time</CubeDimensionID> <AttributeID>Fiscal Year</AttributeID> <Type>All</Type> </Column> <Column xsi:type="CubeAttributeBinding" dwd:design-time-name="c0d98c89-5852-4e64-a70a-ac0ac2276165"> <CubeID>Adventure Works</CubeID> <CubeDimensionID>Order Date Key - Dim Time</CubeDimensionID> <AttributeID>TimeKey</AttributeID> <Type>All</Type> </Column> <Column xsi:type="CubeAttributeBinding" dwd:design-time-name="cdef5db1-5bbb-4c16-916e-cc0354b1e06e"> <CubeID>Adventure Works</CubeID> <CubeDimensionID>Order Date Key - Dim Time</CubeDimensionID> <AttributeID>CalendarYear</AttributeID> <Type>All</Type> </Column> --PARTE DONDE SE DECLARA LA DIM SCENARIO <Column xsi:type="CubeAttributeBinding" dwd:design-time-name="7008e054-0621-4c6e-8c4e-31f334effb89"> <CubeID>Adventure Works</CubeID> <CubeDimensionID>Dim Scenario</CubeDimensionID> <AttributeID>Scenario Name</AttributeID> <Type>All</Type> </Column> --PARTE DONDE SE DECLARA LA DIM ORGANIZATION <Column xsi:type="CubeAttributeBinding" dwd:design-time-name="c0b524fa-529d-4c2a-a879-2ee4bdf36a8b"> <CubeID>Adventure Works</CubeID> <CubeDimensionID>Dim Organization</CubeDimensionID> <AttributeID>Parent Organization Key</AttributeID> <Type>All</Type> </Column> --PARTE DONDE SE DECLARA LA DIM ACCOUNT <Column xsi:type="CubeAttributeBinding" dwd:design-time-name="2e7fb3e6-f09c-4fa5-a3f6-7ca6a4b40b74"> <CubeID>Adventure Works</CubeID> <CubeDimensionID>Dim Account</CubeDimensionID> <AttributeID>Parent Account Key</AttributeID> <Type>All</Type> </Column> --PARTE DONDE SE DECLARA LA DIM DEPARMENTS <Column xsi:type="CubeAttributeBinding" dwd:design-time-name="fa9361b8-315b-45e6-a627-ee54d7981a8c"> <CubeID>Adventure Works</CubeID> <CubeDimensionID>Dim Department Group</CubeDimensionID> <AttributeID>Parent Department Group Key</AttributeID> <Type>All</Type> </Column> --PARTE DONDE SE DECLARA LA DIM DESTINATION CURRENCY <Column xsi:type="CubeAttributeBinding" dwd:design-time-name="f4f845ef-1fbf-4040-bfdc-1946a84dd14f"> <CubeID>Adventure Works</CubeID> <CubeDimensionID>Destination Currency</CubeDimensionID> <AttributeID>Currency Alternate Key</AttributeID> <Type>All</Type> </Column> </Columns> </Action>
Tras esto, guardaremos y volveremos a la vista del cubo en la pestaña de acciones.
En esta vista veremos que ya tenemos el orden deseado:
El siguiente paso será procesar el cubo y comprobar que a la hora de generar un informe el orden es el mismo.
En efecto, vemos como se ha modificado el orden de las columnas tal y como deseábamos.
Perdida de la Tabla de dimensión en el visor de diagrama.
Otro caso que se nos puede llegar a presentar se da cuando abrimos una dimensión y en la zona donde aparece el diagrama de la estructura de la dimensión (Data Source View) vemos que no aparece una de las estructuras de la relación existente en el Data Source View.
Volviendo al Data Source View de la solución podemos observar que esa relación realmente existe y que el problema está en el área de trabajo de la dimensión en cuestión.
Este problema es causado por un error del XML, cuando da valores a las propiedades que va a tener el objeto del Data Source View que ha desaparecido.
Para corregirlo debemos analizar que ha podido modificarse e incluso apoyarnos en otro caso en el que se visualice correctamente para poder comparar los valores de los parámetros de dimensionado del objeto que contiene los datos del diagrama.
Para ello abriremos procederemos a ver el código XML de la dimensión afectada:
- Dimension Afectada-> Click Derecho-> View Code
Localizamos entre el código la parte donde se crea la visualización del objeto que sabemos que no se visualiza correctamente.
Debemos localizar el parámetro del visor que puede estar fallando u ocasionando que no se vea la dimensión
Dentro del XML podemos observar como uno de los parámetros, en este caso Width tiene como valor 1 que destaca que es un valor anómalo ya que es un valor muy pequeño para contener una lista de campos. Debido a eso, no se le daba un ancho lo suficientemente grande al objeto como para ser visualizado.
<ddscontrol controlprogid="DdsShapes.DdsObjectManagedBridge.3" tooltip="Customer" left="3279" top="14" logicalid="4" controlid="1" masterid="0" hint1="0" hint2="0" width="1" height="12637" noresize="0" nomove="0" nodefaultattachpoints="0" autodrag="1" usedefaultiddshape="1" selectable="1" showselectionhandles="1" allownudging="1" isannotation="0" dontautolayout="0" groupcollapsed="0" tabstop="1" visible="1" snaptogrid="0">
Esto puede ser causado por un fallo en las dimensiones del objeto que contiene el diagrama, además, si analizando los parámetros del tamaño y viendo que son lógicos, también puede deberse a que el parámetro visible esté deshabilitado, es decir que tenga valor 0.
Resumiendo, este tipo de situación, dentro de mi experiencia como usuario me ha aparecido cuando se ven afectados los siguientes parámetros:
- Visible
- Height
- Width
Una vez se modifiquen esos parámetros, guardamos el XML modificado y volviendo a la dimensión podremos observar que ahora podemos visualizar correctamente la estructura en el Data Source View.
En resumen, tras exponer estos casos puntuales sobre la utilidad de XML, destacar que a la hora de manipular el código XML de nuestro proyecto, siempre debemos hacerlo con cautela y estando bien seguros de que estamos en la parte que queremos modificar. Por otro lado, vemos que con una manipulación correcta podemos solucionar ciertos “problemas” que pueden surgir y que sin el uso de lo anteriormente expuesto, sería una tarea más compleja.