Mi charla sobre Analisys Services 2008 en el Codecamp de tarragona

Posted by Miguel Egea | Posted in Analisys Services | Posted on 18-01-2010

4

Me parece increible que yo diese esta charla y no saber que estaba grabada y publicada, gracias a mi amgigo Salvador Ramos y a un portal de bussiness intelligence me he enterado que estaba publicado. Yo no se dar una charla serio, los que me conoceis ya sabeis como soy, para los demás pues bueno, ya podeis verme y oirme.

Creando una dimensión Tiempo en Analisys Services 1/2

Posted by Miguel Egea | Posted in Analisys Services | Posted on 17-01-2010

2

PortalSQL tradicionalmente venía hablando solo de motor relacional, sin embargo, mi carrera me ha llevado a la parte multidimensional, y os prometo que ha sido un descubrimiento total, trabajar con cientos o miles de millones de filas, y que los usuarios vean los resultados en tiempo real es una experiencia increible. Si además le podemos añadir luego cierta lógica relacionada con el tiempo y fórmulas que añadan valor a las operaciones, los proyectos sin duda tienen tendencia a ser más exitosos.

Dicho esto, vamos a comenzar con el primer artículo sobre Analisys Services, pasaremos casi de largo por algunos pasos básicos, y construiremos la dimensión tiempo paso a paso para que los veais.

Comenzamos en el resultado de los artículos sobre la dimensión tiempo, es decir nuestro datawarehouse cargado y relleno con la dimensión tiempo en Español, Inglés y frances como pude verse en la siguiente figura.

Ahora lo que vamos a hacer es abrir el Bussiness Studio Development Studio desde el menú tal y como puede verse en la siguiente figura.

Después lo que haremos será crear un proyecto de Analisys services llamado Dimensión Tiempo, para ello en Fichero –> Nuevo –>Proyecto–> Bussiness Intelligence Projects y ahí elegimos analisys services projects, tal y como podeis ver en la siguiente figura.

Una vez creado el proyecto nos aparecerán los distintos apartados de Analisys Services, los que necesita para crear el proyecto. Lo primero que haremos será crear el Data Source, es decir, crear una conexión al motor relacional en el que estará la tabla tiempo en la que nos vamos a basar, en realidad, lo que hacemos es muy parecido a lo que se hacía cuando se creaba una conexión ODBC, es decir crear una conexión a una base de datos (no tiene por que ser SQL Server, puede ser cualquier otro motor).
Importante Pensad que estamos haciendo un proyecto que al final no es mas que código fuente que se ejecutará en un servidor, por tanto, la conexión que creamos al final se conectará no desde nuestra máquina, no con nosotros logueados, sino desde el servidor, y ejecutado bajo las credenciales que levanten el servicio de Analisys Services.

Para crear el Data Source pulsaremos con el botón derecho sobre la carpeta Data Sources, y elegiremos New Data Source :

A partir de elegir la opción nuevo data source nos aparece un asistente para crear la conexión, saltamos el primer paso, que es siempre el de bienvenida, y en el segundo nos permite elegir alguna conexión que ya hayamos hecho anteriormente o podemos pulsar el botón nueva conexión.

Una vez pulsado el botón nueva conexión nos va a aparecer la siguiente pantalla, en la que realmente será la que creemos la conexión.

En la parte superior de la imagen podeis ver como hay una lista desplegable en la que seleccionamos el proveedor de datos que usaremos para conectarnos, en nuestro caso es SQL Server, de forma que hemos elegido el Native Client 10.0, basta con que tengas instalados los drivers adecuados para poder elegir cualquier conexión a cualquier base de datos del mercado.

El siguiente paso, que es el penúltimo, nos pide la información de impersonación, es decir, nos ayuda a decir con que credenciales ha de conectarse el servicio de Analisys Services a esta base de datos, podemos especificar unas credenciales de windows, podemos especificar que se conecte bajo las credenciales del servicio, que se usen nuestras credenciales, o que no use ninguna.


El último paso es especificar el nombre que daremos a la conexión, elegid cualquiera que nos vale.

Una vez creado el Data Source, (Origen de Datos), debemos crear el Data Source View, esto nos permite seleccionar bien tablas o vistas, o bien crear consultas y que aparezcan en nuestro modelo como una tabla. Para nuestro ejemplo, en el que no vamos a hacer un cubo completo sino solamente la dimensión tiempo, nos valdrá con la tabla que tiene la dimensión tiempo. Realmente es la única que vamos a necesitar, pero en futuros artículos espero que creemos un cubo completo contra Adventure Works por ejemplo, para que veais el proceso completo.

Para crear el data source view, sobre el apartado en el explorardor de soluciones, botón derecho, nuevo data source view y seguimos el asistente, en el primer paso solamente es el de bienvenida, el segundo nos ofrece para elegir el datasource del que saldrá la conexión, obviamente elegiremos el que acabamos de crear.

Las alternativas que nos ofrece el asistente en el segundo paso son las que usará para inferir claves primarias, y relaciones en las tablas seleccionadas. El data source view añade esta lógica sin modificar el origen de datos, es decir, él necesita saber que campos son clave primaria y como se relacionan las tablas para ayudarnos en la creación de las dimensiones y hechos posteriormente. La alternativa que elijais dependerá mucho de como tengais vuestro protocolo de nombres en la creación, fijaos en los ejemplos que pone cuando pinchais una de las alternativas y elegid el más adecuado a vuestro esquema. En el siguiente paso hay que elegir que tablas nos traemos. En nuestro caso solo Dimensiones.Tiempo, fijaos que hay una parte de filtro abajo de las tablas de origen, esto es porque en los esquemas grandes suelen haber, cientos, quizás miles de tablas (el otro día vi un ejemplo de un sistema navision con 90.000 tablas…) para elegir una en concreto ayudarnos del filtro será fundamental en estos casos.

Fijaos también en el botón Add Related tables, en los que el sistema va a traerse las tablas que estén relacionadas, averiguando esto a través de las restricciones de integridad referencial. De esta forma podemos elegir el conjunto de tablas que necesitamos de una forma mucho más sencilla.

Hasta aquí la primera parte, en breve publicaré el final de la creación de la dimensión tiempo, lo que es la creación en sí.

Saludos

Relaciones entre atributos en SSAS video

Posted by Miguel Egea | Posted in Analisys Services | Posted on 31-12-2009

0

Resulta que no me acordaba que publicamos este video en el canal de youtube de Solid Quality Mentors, y lo he visto en SQLServerSI, el sitio de mi amigo y compañero y MVP Salva Ramos, yo dejé de pertenecer a ese increible grupo de gente en septiembre. Pero mi corazón está con ellos.Relaciones entre Atributos en youtube

Usando CTE’s para construir la dimensión de tiempo 3/3

Posted by Miguel Egea | Posted in Analisys Services, Relacional | Posted on 27-12-2009

1

Empezaremos este tercer artículo de la serie simplemente creando una tabla que alojará nuestros datos de tiempo en distintos idiomas, una vez rellenada esta tabla, puede servirnos perfectamente de base para la creación de una dimensión tiempo, que será el siguiente artículo, en el que comenzaremos a crear el proyecto de Analisys Services para construir la dimensión tiempo.

La tabla contiene la estrucutra básica para contener todos los datos necesarios relacionados con el tiempo , y además tiene la versión en castellano, francés e ingles de estos datos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
CREATE TABLE [Dimensiones].[Tiempo](
[FechaKey] [int] not NULL primary key ,
[Fecha] [datetime] NULL,
[Año] [int] NULL,
[Numero_Mes] [int] NULL,
[Mes_Castellano] [nvarchar](30) NULL,
[Mes_año_Castellano] [nvarchar](35) NULL,
[MesKey] [int] NULL,
[Semana] [int] NULL,
[SemanaKey] [int] NULL,
[Fecha_Castellano] [nvarchar](52) NULL
[TipoDia] [varchar](13) NOT NULL,
[DiaDelAño] [int] NULL,
[DiaDeLaSemana] [int] NULL,
[DiaDelMes] [int] NULL,
[Dia_castellano] [nvarchar](30) NULL,<code>[Mes_Inglés] [nvarchar](30) NULL,
[Mes_año_Inglés] [nvarchar](35) NULL,
[Fecha_Inglés] [nvarchar](52) NULL,
[Dia_Inglés] [nvarchar](30) NULL,
 
[Mes_Francés] [nvarchar](30) NULL,
[Mes_año_Francés] [nvarchar](35) NULL,
[Fecha_Francés] [nvarchar](52) NULL,
[Dia_Francés] [nvarchar](30) NULL
 
) ON [PRIMARY]
 
GO

Una vez que tenemos la tabla tenemos que rellenarla para ello usaremos el mismo código que la vista del artículo anterior. En este caso si podemos utilizar las cláusulas que hablamos en el primer artículo SET DATE FIRST y SET LANGUAGE, de forma que todo esté adecuadamente configurado cuando hagamos los inserts y los updates corresponeientes. Veamnos como rellenar la tabla con las fechas que deseamos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
set language spanish;
set datefirst 1;
insert into dimensiones.tiempo
(FechaKey, Fecha, Año, Numero_Mes, Mes_Castellano, Mes_año_Castellano, MesKey, Semana, SemanaKey, Fecha_Castellano,
TipoDia, DiaDelAño, DiaDeLaSemana, DiaDelMes, Dia_castellano)
select
CAST(CONVERT(varchar(10),fecha + id ,112) as int) FechaKey,
fecha+id as Fecha,
YEAR(fecha+ID) as año,
MONTH(fecha+id) as Numero_Mes,
DATENAME(month,fecha+id) Mes_Castellano,
DATENAME(month,Fecha + id ) +' '+ cast(YEAR(Fecha + id ) as varchar(4)) Mes_año_Castellano,
year(Fecha + id )*100+month(Fecha + id ) MesKey,
DATEPART(DW,Fecha + id ) Semana,
year(Fecha + id )*100 + DATEPART(DW,Fecha + id ) SemanaKey,
cast(DAY(Fecha + id ) as varchar(10)) + ' de ' + DATENAME(MM,Fecha + id ) + ' de ' + cast(YEAR(Fecha + id ) as varchar(4)) Fecha_Castellano,
case when datepart(weekday,Fecha + id )&gt;5 then 'Fin de semana' else 'Semana' end TipoDia,
datepart(dayofyear,Fecha + id ) DiaDelAño,
DATEPART(DW,Fecha + id ) DiaDeLaSemana,
DATEPART(dd,Fecha + id ) DiaDelMes,
DATENAME(dw,Fecha + id ) Dia_castellano</code>
 
from (select CAST('19991231' as datetime) fecha ) tabla
cross join nums;

Con este primer insert tendremos rellena la mayor parte de la tabla y los descriptores en castellano, sin embargo, aún no tenemos rellenados los campos en inglés y francés que pretendemos tener completos. Veamos el código para actualizar la parte en inglés

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
set language english;
 
update Dimensiones.Tiempo 
set Fecha_Inglés=a.Fecha_Inglés,
   Dia_Inglés=a.Dia_ingles,
   Mes_año_Inglés=a.Mes_año_Inglés,
   Mes_Inglés=a.Mes_Inglés 
from 
 (  select 
  CAST(CONVERT(varchar(10),fecha  + id ,112) as int) FechaKey,
  DATENAME(month,fecha+id) Mes_Inglés,
  DATENAME(month,Fecha + id ) +' '+  cast(YEAR(Fecha + id ) as varchar(4)) Mes_año_Inglés,
  DATENAME(MM,Fecha + id ) ++ ' ' +cast(DAY(Fecha + id ) as varchar(10)) +  ', ' + cast(YEAR(Fecha + id ) as varchar(4)) Fecha_Inglés,
  DATENAME(dw,Fecha + id ) Dia_ingles
 
  from (select CAST('19991231' as datetime) fecha ) tabla 
      cross join nums ) a inner join Dimensiones.Tiempo on a.FechaKey=Dimensiones.Tiempo.FechaKey

En francés tendremos que hacer algo parecido, simplemente hay que elegir de nuevo el idioma.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
set language français;
update Dimensiones.Tiempo 
set Fecha_Francés=a.Fecha_Francés,
   Dia_Francés=a.Dia_ingles,
   Mes_año_Francés=a.Mes_año_Francés,
   Mes_Francés=a.Mes_Francés 
from 
 (  select 
  CAST(CONVERT(varchar(10),fecha  + id ,112) as int) FechaKey,
  DATENAME(month,fecha+id) Mes_Francés,
  DATENAME(month,Fecha + id ) +' '+  cast(YEAR(Fecha + id ) as varchar(4)) Mes_año_Francés,
  DATENAME(MM,Fecha + id ) ++ ' ' +cast(DAY(Fecha + id ) as varchar(10)) +  ', ' + cast(YEAR(Fecha + id ) as varchar(4)) Fecha_Francés,
  DATENAME(dw,Fecha + id ) Dia_ingles
 
  from (select CAST('19991231' as datetime) fecha ) tabla 
      cross join nums ) a inner join Dimensiones.Tiempo on a.FechaKey=Dimensiones.Tiempo.FechaKey

Espero que os sirva el código.