XMLA BI
DIA 1
Estos días he estado probando algunas cosas con SharePoint, empecé instalando la versión inglesa del Business Scorecard Manager 2005 ya que no aguantaba más de esperar a la versión en castellano (las ayudas por lo menos están pero el programa no), después de instalar los requisitos necesarios en mi maquina de pruebas…
Probé a instalar el producto … que fallaba estrepitosamente al crear la base de datos :-( probé después con un SQL Server 2000 y me seguía ocurriendo lo mismo, comprobé todos los permisos en uno y otro sitio y tras una hora conseguí que me creará la base de datos. Lo que hice fue instalarla directamente sobre el servidor SQL, instalando las opciones personalizadas diciéndole que no a todo excepto a la base de datos. Bien, ya tenía la BBDD instalada, ahora me quedaba instalar las webparts en el servidor (el resto de componentes de la instalación), no hubo suerte, tras indicar al programa de instalación dónde se encuentra en servidor SQL y el nombre de la BBDD me da un error tal que:
Product: Microsoft Office Business Scorecard Manager 2005 — Error 26204. Error -2147217900: failed to execute SQL string, error detail: El usuario o función ‘SRVTEST\Administrador’ no existe en la base de datos., SQL key: SQLWeb3 SQL string: USE ScorecardServer DECLARE @dbowner sysname SELECT @dbowner = SUSER_SNAME(sid) FROM master.dbo.sysdatabases WHERE name = ‘ScorecardServer’ IF NOT(@dbowner = ‘SRVTEST\Administrador’) EXEC sp_addrolemember ‘BPMDeveloper’, ‘SRVTEST\Administrador’
Este es generalmente el momento en dónde debía haber desistido, al menos por el día. Bueno tras pasar un rato buscando información, sin éxito, me decido a borrar el usuario de la base de datos y volverlo a crear a ver si hay suerte. Cosas de la vida, la hubo. (Creo, no lo puedo asegurar que el usuario estaba creado como “Administrador”, y tras mi alta/baja se creó como “SRVTEST\Administrador” ¿¿¿sería eso???), ya habían trascurrido casi tres horas desde el comienzo así que…
DIA 2
Continuo con el BSM 2005 a ver si sacamos algo en limpio, entre tanto se me ha ocurrido una idea para un simple webpart, para conectarme a través de los servicios de análisis sobre XML (esto ha interrumpido mi trabajo con el BSM), de modo que he probado ha hacer un pequeño webpart para conectarme a través de XMLA y ejecutar una MDX, para darle un poco de flexibilidad al asunto, el contenido XML será (¿como no?) transformado por un XSLT.
El resultado en media horita de codificación ha sido un éxito.
Lo primero que he hecho ha sido crear un interface para usar el XMLA, (se puede descargar una copia del WSDL para el XML for Analysis SDK, desde aqui) una vez descargado he creado la interface para acceder al servicio web (
wsdl VS7msxmlanalysis.wsdl ) he añadido clase a mi proyecto, ahora basta con usarlo.
private string ExecuteMdx(string Command, string Properties, string Url)
{
// Usamos la clase proxy para acceder al xmla
MsXmlAnalysis xmlAnalysis = new MsXmlAnalysis();
// Credenciales
xmlAnalysis.Credentials = CredentialCache.DefaultCredentials;
// Url del servicio (http://servidor de xmla/xmla/msxisapi.dll)
xmlAnalysis.Url = Url;
XmlDocument xmlCommand = new XmlDocument();
XmlDocument xmlProperties = new XmlDocument();
XmlElement xmlResult;
// El comando (MDX) debe ir precedido de <statement>
Command = “<Statement>” + Command + “</Statement>”;
// Cargamos el comando y los datos de la conexión
xmlCommand.LoadXml(Command);
xmlProperties.LoadXml(Properties);
// Ejecutamos el método Execute
xmlResult = xmlAnalysis.Execute(
(XmlElement) xmlCommand.FirstChild,
(XmlElement) xmlProperties.FirstChild
);
// Devolvemos el resultado XML
return xmlResult.InnerXml;
}
El webpart necesita la url del servicio XMLA, los datos de la conexión :
<PropertyList>
<DataSourceInfo>Provider=MSOLAP;Data Source=local</DataSourceInfo>
<Catalog>FoodMart 2000</Catalog>
<Content>Data</Content>
<Format>Multidimensional</Format>
<BeginRange>“1</BeginRange>
<EndRange>-1</EndRange>
</PropertyList>
Y una MDX como
with member [Measures].[SalesRatio] as ‘([Store Sales] – [Store Cost]) / [Store Cost]‘, FORMAT_STRING = ‘##%’
select { [Store Sales], [Store Cost], [SalesRatio] } on COLUMNS,
Filter( [Product].[Brand Name].Members, [SalesRatio] > 1.60 ) on ROWS
from Sales
El resultado a quedado bastante bien para media hora…