En esta entrada continuamos en la misma línea que en mi artículo anterior, con el que iniciamos esta serie de scripts PowerShell para resolver tareas frecuentes en los despliegues de soluciones de BI.

Extraer el script MDX de un cubo puede resultarnos útil para revisar el código de medidas y miembros calculados, scopes, traducciones, etc.. con motivo de realizar pruebas sobre métricas o simplemente, mover el código completo de un entorno a otro sin necesidad de reprocesar el cubo de destino. Para este último caso podéis pensar ‘eso se hace en un plis con Visual Studio’ y tenéis toda la razón, sin embargo, recordad que el uno de los objetivos de esta serie de artículos es lograr la máxima automatización posible para evitar realizar tareas manuales y repetitivas. Aun así, seguro habrá formas alternativas de lograr la mismo, aqui nos centraremos en cómo hacerlo con PowerShell

Empezaremos por el código básico necesario para generar un script XMLA Alter con la definición del MDXScript de una base de datos y un cubo en concreto, para lo cual podemos utilizar el ensamblado Microsoft.AnalysisServices

Advertencia. El código provisto en esta página no debe ejecutarse en un entorno de producción, no tiene ninguna garantía de que os vaya a funcionar como esperáis.

#Declaramos y establecemos variables
$InstanceName="localhost\sql2016"
$DatabaseName="AdventureWorksDW2012Multidimensional-EE"
$CubeNAme="Adventure Works"

#Cargamos el ensamblado Microsoft.AnalysisServices.Dll
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.AnalysisServices") | Out-Null
#Instanciamos un objeto Server (SSAS) y conectamos con la instancia $InstanceName
$server = New-Object Microsoft.AnalysisServices.Server
$server.connect($InstanceName)

#Objetos para almacenamiento del script XMLA
$stringbuilder = new-Object System.Text.StringBuilder
$stringwriter = new-Object System.IO.StringWriter($stringbuilder)
$xmlOut = New-Object System.Xml.XmlTextWriter($stringwriter)
$xmlOut.Formatting = [System.Xml.Formatting]::Indented

#Instanciamos el objeto scripter para generar el XMLA
$ScriptObject = New-Object Microsoft.AnalysisServices.Scripter

#Definimos sobre qué objeto queremos generar un script 
$MSASObject=[Microsoft.AnalysisServices.MajorObject[]] @($($Server.Databases[$DatabaseName].Cubes[$CubeName].MdxScripts))

#Llamamos al método para obtener el XMLA Alter del MDXScript
$ScriptObject.ScriptAlter($MSASObject,$xmlOut,$false)

#Salida por pantalla del script XMLA
$stringbuilder.ToString()

 

Con un resultado similar al siguiente:

image

Ya tenemos el script XMLA contenido en una variable de tipo StringBuilder. A partir de aqui, podríamos utilizar el XMLA para realizar el alter en otro cubo o en el mismo. Obtener únicamente el código MDX es bastante sencillo si convertimos el XMLA en un documento XML

[xml]$xmla = [xml]$stringbuilder.ToString()
$xmla.alter.ObjectDefinition.MdxScript.Commands.Command.Text

Eventualmente podríamos utilizar el propio objeto XML para modificar el texto y, por ejemplo, añadir una nueva medida al cubo. Modificando el script PowerShell inicial para añadir las siguientes líneas:

$xmla.alter.ObjectDefinition.MdxScript.Commands.Command.text="$($xmla.alter.ObjectDefinition.MdxScript.Commands.Command.text)`n`nCREATE MEMBER CURRENTCUBE.[Measures].[PowerShell test] as `n`t""Medida añadida con PowerShell"";`n`n "

image

Hemos generado el nuevo XMLA Alter con un MDXscript modificado en la variable $xmla . Si necesitásemos aplicar este cambio al cubo y ver esa nueva medida desplegada, podríamos ejecutar este XMLA utilizando AdoMD o XmlaClient (tema para el siguiente artículo de la serie)

Serie de artículos PowerShell y SQL BI:

Víctor M

Víctor M

Mentor at SolidQ
Víctor is an experienced Mentor and consultant working in the Business Intelligence division and collaborating in projects globally. He began working with ERP products in financial areas around year 2000, focused on development with Microsoft technologies: Visual Basic and SQL Server 2000. He has been involved in data modelling, integration and analysis through all later versions of SQL (2005/2008/R2/2012). Prior join SolidQ he has been in charge of the area of BI managing
development teams. He have strong technical skill with business focus and able to management.
Víctor M
A %d blogueros les gusta esto: