miércoles, noviembre 08, 2006

AMO - Administrar por código SSAS

Tuve la necesidad de crear variables calculadas en SSAS 2000 mediante y hasta el momento no he encontrado cómo. Si alguien lo sabe ahi les encargo.

Pero en AS2005 la vida cambia. Es posible mediante código crear las famosas calculadas. Medianamente es sencillo, hasta encuentras una guía.

Buscando una luz encontre un post:
Calculated Measures using AMO
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=478534&SiteID=1

Y yo intente mejorar un poco esto pensando en algo más reutilizable. No esta terminado, pero tendrán una idea más clara.

Tendrán que agregar también como referencias al proyecto:
Microsoft.AnalysisServices
Microsoft.ExceptionMessageBox


Imports System
Imports System.Collections
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Globalization
Imports System.Reflection
Imports System.Text
Imports System.Windows.Forms

Imports Microsoft.SqlServer.MessageBox
Imports Microsoft.AnalysisServices


Public Class frmCalculatedsMembers


#Region "Fields"

'- AMO Server Variable
Private AMOServer As Server


#End Region



#Region "Methods"


Private Sub Logger(ByVal Msg As System.String, ByVal Source As System.String)
Try
Me.txtMdxScript.Text = System.DateTime.Now.ToString & " [" & Source & "] " & Msg & System.Environment.NewLine & Me.txtMdxScript.Text
Catch ex As Exception

End Try
End Sub


Private Sub FinishASSession()

If (Not Me.AMOServer Is Nothing) AndAlso (Me.AMOServer.Connected) Then
Me.AMOServer.Dispose()

Try
Me.AMOServer.Disconnect()
Catch ex As Exception

End Try

End If

End Sub


Private Sub btnEnd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEnd.Click

Me.FinishASSession()

End

End Sub


Private Sub frmCalculatedsMembers_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

'- loading AS Servers
Me.cmbServers.Items.Add("TERMXDESASGL01\SGLDESARROLLO2K5")
'- Indicating the first one
Me.cmbServers.SelectedIndex = 0

End Sub


Private Function ConnectToASServer() As System.Boolean

Try

If Me.AMOServer Is Nothing Then
'- create
Me.AMOServer = New Server()
Else
'- disconnect
Me.AMOServer.Disconnect()
End If

Me.AMOServer.Connect(CType(Me.cmbServers.Items.Item(Me.cmbServers.SelectedIndex), System.String))

Me.Logger("Conectado al servidor AS [" & CType(Me.cmbServers.Items.Item(Me.cmbServers.SelectedIndex), System.String) & "]", "ConnectToASServer")

Return True

Catch ex As Exception

Me.Logger(ex.Message, ex.TargetSite.Name)

Me.AMOServer = Nothing

Return False

End Try

End Function


Private Function LoadCubesDatabases() As System.Boolean

Try
'- check por si las moscas
If Me.AMOServer Is Nothing Then Return False

Me.cmbCubesDatabases.Items.Clear()

For Each AMODB As Database In Me.AMOServer.Databases
Me.cmbCubesDatabases.Items.Add(AMODB.ID)
Next

Me.cmbCubesDatabases.SelectedIndex = 0

Me.Logger("CubesDatabases Loaded", "LoadCubesDatabases")

Return True

Catch ex As Exception
Me.Logger(ex.Message, ex.TargetSite.Name)
Return False
End Try

End Function


Private Function LoadCubes() As System.Boolean

Try
Dim AMODB = New Database

Me.cmbCubes.Items.Clear()

'Dim AMOCube = New Cube
'AMODB = Me.AMOServer.Databases(0)
'AMOCube = AMODB.Cubes(0)
'AMODB.cubes(0) = Nothing

AMODB = Me.AMOServer.Databases(Me.cmbCubesDatabases.Items.Item(Me.cmbCubesDatabases.SelectedIndex))

For Each AMOCube As Cube In AMODB.Cubes
Me.cmbCubes.Items.Add(AMOCube.ID)
Next

Me.cmbCubes.SelectedIndex = 0

Me.Logger("Cubes Loaded", "LoadCubes")

Return True

Catch ex As Exception

Me.Logger(ex.Message, ex.TargetSite.Name)
Return False

End Try

End Function


Private Sub cmbCubesDatabases_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbCubesDatabases.SelectedIndexChanged

Try
If Me.LoadCubes() Then
'- ok
Else
'- nok
Me.Logger("No se pudo cargar los Cubes", "cmbCubesDatabases_SelectedIndexChanged:LoadCubes")
End If
Catch ex As Exception
Me.Logger(ex.Message, ex.TargetSite.Name)
End Try

End Sub


Private Sub btnConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConnect.Click
Try
If Me.ConnectToASServer() Then

' ok, now discover CubesDatabases
If Me.LoadCubesDatabases() Then
'- ok
Else
'- nok
Me.Logger("No se pudo cargar las DB-Cubes", "btnConnect_Click:LoadCubesDatabases")
End If

Else
' log the event
Me.Logger("No se pudo conectar al servidor AS [" & CType(Me.cmbServers.Items.Item(Me.cmbServers.SelectedIndex), System.String) & "]", "btnConnect_Click:ConnectToASServer")
End If
Catch ex As Exception
Me.Logger(ex.Message, ex.TargetSite.Name)
End Try
End Sub


Private Function ExecuteMDXScript(ByVal MdxScript As System.String) As System.Boolean

'CREATE
'MEMBER CURRENTCUBE.[MEASURES].[Paradas SETUP_Min_New]
'AS SUM({[DimDemoras].[Dim Demo Clase Descripcion].&[0]}, [Measures].[Fact Demo Duracion]) / 60,
'FORMAT_STRING = "#,#",
'VISIBLE = 1;

Try
Dim sb As New System.Text.StringBuilder()
sb.Append(MdxScript)
If Me.WriteMDXScript(sb) Then
Return True
Else
Return False
End If

Catch ex As Exception
Return False
End Try

End Function


Private Sub btnRun_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRun.Click
Try
If Me.txtMdxScript.Text.Length > 0 Then
If Me.ExecuteMDXScript(Me.txtMdxScript.Text) Then
'- ok
Else
'- nok
Me.Logger("No se pudo ejecutar la DMX", "btnRun_Click:ExecuteMDXScript")
End If
Else
Me.Logger("No mames!! ponle una pinche consulta w!!! si no es magia esto!!!", "btnRun_Click")
End If

Catch ex As Exception
Me.Logger(ex.Message, ex.TargetSite.Name)
End Try
End Sub


Private Function ShowMDXScript() As System.String
Try
Dim AMODB = New Database()
Dim AMOCube = New Cube()
Dim AMOMdxScript As New MdxScript()

AMODB = CType(Me.AMOServer.Databases(Me.cmbCubesDatabases.Items.Item(Me.cmbCubesDatabases.SelectedIndex)), Database)
AMOCube = CType(AMODB.Cubes(Me.cmbCubes.Items.Item(Me.cmbCubes.SelectedIndex)), Cube)

'AMOMdxScript = AMOCube.MdxScripts(0)
'Microsoft.AnalysisServices.Database()

Dim sb As New System.Text.StringBuilder()

For Each Mdx As MdxScript In AMOCube.MdxScripts
sb.Append(Mdx.Name)
Next

Return "Nada"
Catch ex As Exception
Return "Nada"
End Try
End Function


Private Function WriteMDXScript(ByVal sb As System.Text.StringBuilder) As System.Boolean
Try
Dim AMODB = New Database()
Dim AMOCube = New Cube()
Dim AMOMdxScript As New MdxScript()

AMODB = CType(Me.AMOServer.Databases(Me.cmbCubesDatabases.Items.Item(Me.cmbCubesDatabases.SelectedIndex)), Database)
AMOCube = CType(AMODB.Cubes(Me.cmbCubes.Items.Item(Me.cmbCubes.SelectedIndex)), Cube)

AMOMdxScript = AMOCube.MdxScripts(0)
AMOMdxScript.Commands(0).Text = AMOMdxScript.Commands(0).Text & System.Environment.NewLine & sb.ToString

AMOMdxScript.Update()

AMOCube.Update()
AMOCube.Process(Microsoft.AnalysisServices.ProcessType.ProcessFull)

AMOMdxScript.Dispose()
AMOCube.Dispose()
AMODB.Dispose()

Return True
Catch ex As Exception
Return False
End Try
End Function


Private Sub btnShowMdxScript_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnShowMdxScript.Click
Me.txtMdxScript.Clear()
Me.txtMdxScript.Text = Me.ShowMDXScript()
End Sub


Private Sub cmbCubes_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbCubes.SelectedIndexChanged
Me.txtMdxScript.Clear()
End Sub


#End Region


End Class




Espero les sirva un poco.

jueves, julio 27, 2006

MySQL5 - La base de datos

MySQL ha sido una de las Bases de Datos (BD) más populares entre la comunidad de programadores Web. Las estadísticas muestran muchas verdades. La potencia de MySQL ha sido elevada con la versión estable 5.x.

Por cuestiones de trabajo he tenido que conocer y programar por el momento a este RDBMS. Mis esfuerzos son más enfocados a sistemas de piso de planta. Interfaciando entre Niveles 1, 2 y 3, entre plataformas completamente diferentes (Windows y QNX/Linux). Para nuestra suerte existen los protocolos estándares.

Bien, conectar con MySQL no es díficil: hay muchos lenguajes de script que han sido utilizados y mejorados durante años. Desde Java, .NET, C, etc no es problema. Entender cómo sacarle provecho a MySQL5 es el reto.

Un simple pedazo de código de un SP que, en pocas palabras, simula una sequencia de Oracle:
/* DROP PROCEDURE IF EXISTS gptm.sp_ProximoNumeroINT; */
CREATE PROCEDURE sp_ProximoNumeroINT(IN Objeto CHAR(30), OUT ProxNum INT)
BEGIN
IF EXISTS( SELECT ID_OBJETO_A_ENUMERAR FROM secnumeros WHERE LTRIM(RTRIM(Objeto)) = LTRIM(RTRIM(ID_OBJETO_A_ENUMERAR)) ) THEN
UPDATE secnumeros SET ULTIMO_NUMERO_INT = ULTIMO_NUMERO_INT + 1
WHERE LTRIM(RTRIM(Objeto)) = LTRIM(RTRIM(ID_OBJETO_A_ENUMERAR));
SELECT ULTIMO_NUMERO_INT INTO ProxNum FROM secnumeros WHERE LTRIM(RTRIM(Objeto)) = LTRIM(RTRIM(ID_OBJETO_A_ENUMERAR));
ELSE
INSERT INTO secnumeros (ID_OBJETO_A_ENUMERAR,ULTIMO_NUMERO_INT,ULTIMO_NUMERO_BIGINT, TIPO)
VALUES (Objeto, 1,0,'I');
SET ProxNum = 1;
END IF;
END


Este SP muestra mucho de las características de procedimientos programados en MySQL. Si bien muchas cosas, que encontramos en MSSQL y Oracle, le faltan a MySQL; pero los avances en este aspecto son fenomenales. Las librerías DAL pueden ser estardarizadas ahora.

Seguiremos comunicando novedades.

miércoles, junio 21, 2006

Books - Links

Un par de ligas hacia algunos libros útiles.

http://rapidshare.de/files/23734132/Fast_Track_UML_2.0.chm

http://rapidshare.de/files/23736609/Apress.Pro.SQL.Server.2005.Assemblies.Dec.2005.pdf

El primero es útil, y el segundo es muy interesante.

Me ha llamado la atención de cómo ejecutar código .NET dentro del RDBMS MS SQL Server 2005 desde el CLR. Así que a practicar. Este libro es gran paso.

viernes, mayo 12, 2006

Flazx.com - Wow !!

Has tenido la necesidad de descargar algún libro técnico actualizado? bien, pues este sitio http://www.flazx.com tiene mucHos libros, pero muchos!!... muchas horas nalgas gastaras revisando todo lo que este ligar tiene que mostrarte.

Espero lo disfrutes. Saludos.

MS SQL Server 2005 - El reto actual

Con la oportunidad de mantener soluciones basadas en Cubos y Sistemas Web de explotación de los mismos cubos, se ha presentado la necesidad de introducirse al gestor MSSQL Server 2005 y sus herramientas de gestión OLAP y OLTP.

La instalación de MSSQL Server 2005 es posible aún cuando se tiene instalado la versión anterior, SQL Server 2000. Ningún problema.

Documentación? una vasta ayuda son los BOL 2005 (que por cierto ya hay actualización de Abril-06). Además, algunos libros electrónicos pueden ser encontrados de algunas ligas que he publicado en mi Blog. Uno muy interesante, es MS Analysis Services Step by Step que esta recién salido del horno, recomendable!!. Y aunque teniendolo en electrónico, se presta oportuno el comprarlo debido que su costo es de un poco más de 25 dólares estadounidenses.

Así pues, con la experiencia en SQLServer 2000 esperamos afrontar este reto con más simpatía. Saludos hasta la próxima.

jueves, abril 13, 2006

Más eBookz :)

Espero que tengan tiempo para echarle una vuelta:
* http://www.flazx.com/
* http://www.filebook.net/

Saludos

miércoles, abril 12, 2006

FREE ASP.NET Web Hosting

Si, me he encontrado un sitio que ofrece la posibilidad de crear un pequeño Site en ASP.NET y con SQLEXPRESS .

El dicho sitio es http://www.aspspider.net/Index.aspx

Espero lo sepan aprovechar. Vale la pena para probar.

sábado, abril 08, 2006

Dawn Small Linux - Ejecutando Linux en WinXP

Algo que no había visto hasta ahora es que Linux corra pudiera correr al mismo tiempo en Windows.

Algo emocionante resulta esto. Estoy en mi Windows XP Home y estoy explorando esta alternativa para aprender un poco más de la administración de Linux, un tema que me ha llevado rato dando vueltas.

El cómo lo resuelven con una distro Live-CD que con alguna otra aplicación la convierten una versión "Embedded" dentro del Windows.

En la página http://www.damnsmalllinux.org/ es en donde he encontrado esta manera de probar a Linux en un entorno en el cual pueda seguir con mis tareas diarias pero sin tener que salirme del entorno en el que hasta ahora debo seguir cumpliendo mis tareas. :p

Sin más espero que tengan el tiempo para probar esta modalidad. Seguro les parecera interesante poder probar otra opción. Saludos.

jueves, marzo 09, 2006


Mis 2 morritas. Mis 2 mujeres. Posted by Picasa

Mi peque�a Sof�a y yo. Posted by Picasa

Un mes de refresco...

5 años en el mundo real de las tecnologías y ha sido este mes en donde partimos al hyperespacio.

Mi sitio: http://gerardopalazuelos.com, aún auspiciado por Yahoo.com pues en cuanto pueda le meto mano en mi propio recurso. Esto llevo a tener mi dirección de correo personalizada: gerardo@gerardopalazuelos.com.

Mi blog: http://gerardopalazuelos.blogspot.com es la iniciativa de informar, compartir.

Saludos entonces y estaremos en contacto. Mi primera publicación !!!