¿Cómo hacer un cubo en Artus?

31 07 2007

CuboNuevo

Esta es una pregunta difícil de contestar. Artus es más un visualizador de información de cubos que un constructor de ellos. De hecho se conecta a múltiples proveedores olap ( Microsoft Analysis Services, SAP BW, Micro Strategy ) o ROLAP (Oracle, SQLServer, DB2, Redbrick, Sybase IQ y otros).

Si lo que van a hacer es conectarse a un motor olap (y normalmente esto quiere decir que ya sabes como hacer el cubo y solo te falta la explotación) como los Analysis Services de Microsoft, entonces los cubos lo hacen con Microsoft Analysis Services no con Artus; lo mismo pasa con SAP y demás proveedores OLAP que BITAM soporta.

Estos cubos de terceros Artus solo los lee…. Prometo más adelante escribir como hacer la conexión.

Respecto a los cubos ROLAP esto es otro cantar. Los cubos ROLAP se almacenan en tablas de una base de datos relacional. Lo único que se requiere es Artus y una base de datos relacional. Para hacer el cubo lo primero que necesitamos hacer es crear nuestras tablas siguiendo un modelo conocido como Estrella o Copo de Nieve, luego las llenamos con información y por último le decimos a Artus que ese modelo de tablas es un cubo. Conforme estemos construyendo o consultando nuestro tablero de control Artus le lanzará queries a las tablas para obtener la información que el tablero mostrará.

Escribí un tutorial de como hacer un cubo ROLAP, paso a paso, con Artus.





Algunas recomendaciones para la tabla de hechos

26 07 2007

Cuando hagas tu tabla de hechos sigue estas recomendaciones.

  • No usar llaves compuestas. Trata de no usar llaves compuestas, esto es, utiliza un solo campo para hacer join con las otras tablas. Esto hará que la base de datos trabaje menos. Es un poco complejo de programar pero ayudará bastante en el performance de la base de datos. ¿ Y no funciona si uso llaves compuestas? Si, si funciona pero se nota una diferencia en los tiempos de respuesta. Esto se nota más si la tabla de hechos será gigantesca.
  • Define la Primary Key en la tabla de hechos. Si en el CREATE TABLE establecemos quién es la primary key, la base de datos creará un índice con la combinación de estos campos lo que hará más rápidas las búsquedas….Si, si me he topado con DWH que no tienen índices y que al procesar los cubos se tardaban 2 días. Si su tabla de hechos no tiene índices, pongale uno, el más apropiado de entrada es aquel que incluye a todos los campos que forman la llave de la tabla….Lo mismo aplica para las tablas de dimensiones o catálogos.
  • Utilice los tipos de datos apropiados. En el diagrama puede ver como el campo unit sales usa un tipo de dato DOUBLE PRECISION; esto estaría bien si nos dedicaramos a la venta de garbanzos :D  y quisiéramos llevar la cuenta del # de garbanzos vendidos (no sé, pero un kilo de garbanzos ha de traer cientos de ellos ) ¡Es para almacenar números gigantescos!. Si lo que vendemos es maquinaria a lo mejor con un Decimal(10,2) estaría bien. Tenemos que acoplarnos al número que almacenará la columna. Espacio de más hará que la base de datos crezca más y se requiera más espacio, y a más espacio más trabajo y más servidor y más memoria y más…
  • Tenga cuidado con el tipo de dato entero. Una vez haciendo un cubo de recursos humanos teníamos 2 indicadores: # de Personas y #Personal Requerido. Como no se puede tener 1/2 persona ni requerir 1/2 persona los dos los definí de tipo entero. La bronca vino al hacer las consultas. Resulta que en las bases de datos, al dividir un entero entre otro entero el resultado es un entero, o sea ( 768/1000 ) = 1. Luego teníamos a cada rato que anteponerle CONVERT u otra instrucción por que el resultado o era 1 o 0. Recuerdo que esto aplica para SQLServer y Redbrick, no recuerdo en este momento si pasa lo mismo en Oracle.
  • Las tablas de hechos pueden tener campos de apoyo. Si, no siempre se tienen únicamente los hechos y dimensiones. Se pueden tener campos como Fecha de entrega, de compra, etc.
  • No guarde campos que se pueden calcular. Si por ejemplo tiene un indicador que es el precio promedio = ventas $/ Ventas Unidades; no haga el calculo y lo guarde en la tabla de hechos por que al consultar los datos deberá usar una formula de agregación como SUM, AVG, MAX, MIN y si lo analiza, la distorsión del indicador será bastante grande al promediar un precio promedio en millones de registros o pocos de ellos.
  • Use nombres amigables. No hay razón para no utilizar el nombre VENTAS UNIDADES para una columna en la tabla de hechos. Luego no tiene uno NPI de lo que hay en cada columna.

Recuerde, los datawarehouses se diseñan pensando en ser de fácil consulta. Son para analizar información.





La tabla de hechos

24 07 2007

TablaHechos

Cuando estamos construyendo nuestro Data Warehouse tenemos que diseñar la tabla central que es la que guardará los hechos. A diferencia de un sistema transaccional donde en una tabla tenemos el total de la factura, en otra el total de la orden de compra, en otro el tipo de cambio (y así sucesivamente) en un Data Warehouse (DWH) los hechos (las cosas que sucedieron) están en una única tabla.

Para aclarar la palabra hechos: ¿qué sucedió en mi compañia? Pues vendí, compré, vendí en unidades, tuve un # de empleados. Entonces en la tabla de hechos se guardan las ventas, las ventas en unidades, las compras, etc..

Todo lo que sean indicadores.

Tampoco se trata de hacer una tabla gigantesca que tenga lo de recursos humanos + lo de ventas + lo de produccion + lo de telemarketing + ¡todo!

No hay que exagerar…Time out

Normalmente las cosas que están en la tabla de hechos tienen afinidad entre sí. De esta forma tendremos una tabla de Hechos de Ventas, una de inventario, una de Recursos Humanos, una de produccion, etc.

No todas las herramientas de explotación de Data Warehouse permiten hacer reportes o informes tomando información de 2 o más tablas de hechos; es por esto que a veces en un DWH se suelen encontrar cosas extrañas como las ventas y el # de empleados en la misma tabla de hechos ( para hacer el calculo de Ventas/#Personas). El problema de esto es que el DWH vuelve caótico: cada vez que necesite hacer un calculo entre 2 tablas de hechos hago un nueva table de hechos que junte las 2 y entonces me lleno de tablas de hechos o cubos ( si trabaja con cubos Rolap a esto se le llama cubitis).

Mejor encuentre una herramienta que permita tomar información de multiples tablas de hechos. Artus soporta crear indicadores calculados con columnas de 2 o más tablas de hechos. No solo eso, si no que también permite mezclar en el tablero de control información de diferentes proveedores de cubos: SAP, Analysis Services, Rolap ( Oracle, Sybase, DB2, Redbrick ).

Technorati tags: ,





Cubitis

24 07 2007

De la palabra cubos y el latín “itis” = inflamación de los cubos

…je, je, je…Devil

Nop, se me hace que no va por aquí por que si no escucharíamos esta conversación:

Haciendo cubos dice que tenemos cubitis…
— ¿se les inflamó el cubo? Rolling on the floor

Es mejor:

…dicese así cuando nuestro Data Warehouse está lleno de cubos. Y seguimos haciendo cubos para todo. Hasta para el directorio telefónico. Tenemos 345 cubos, en 34 de ellos están las ventas, en 14 la merma, en 4 el inventario….

y todos ellos el valor del mismo indicador es diferente.

Confused mmm ¿dónde habré visto algo así?





Sin periodo

23 07 2007

En el designer, mientras estamos construyendo nuestro tablero de control, podemos a los componentes soltarle el periodo: “Sin Periodo” ( ó “Periodless” o “all Periods” dependiendo de la versión):

PeriodLess

Esto hace que el query que lanze a la base de datos no lleve en el where la parte de tiempo.

El siguiente es el query que tiraria si está usando Cubos Rolap

select
SUM( t1.Ventas )
FROM CursoFactComercial t1

y este que sigue sería el MDX que usaría si estamos accesando cubos de Microsoft.

WITH Member [Time].[ALIASBITAM] As ‘Aggregate({[Time].[Year].Members})’
Member [Measures].[Normal001] As ‘[Measures].[Store Sales]‘
SELECT {[Measures].[Normal001]} On Columns
FROM [Sales]
WHERE ([Time].[ALIASBITAM])

Lo utilizamos en el Designer para obtener todo lo que hay de un cubo.

Technorati tags:





El cubo no trae datos

20 07 2007

Procesa

A veces me preguntan por que mi cubo no trae datos.

—Lo procesé y de repente los datos desaparecieron…

Una forma sencilla de saber por que no trae datos es procesarlo y esperar a que termine el proceso. Cuando eso ocurra, hay que darle 2 clic sobre el icono SQL que aparece ahí. Al darle 2 clic, Análysis Services me trae el SQL que el lanza sobre el Data Warehouse para llenar el cubo. Solo es cuestión de revisar por que el query no devuelve datos.

Esto no pasa de repente, el query se construye en base al diagrama que hayamos hecho al hacer el cubo, en base a que campos están marcados como indicadores y cuales como dimensiones

Technorati tags: ,





Llenando la tabla de tiempo

18 07 2007

Recurro muy seguido a este script de SQL para llenar mi tabla de tiempo. Casi siempre lo hago y lo vuelvo a hacer una vez al mes. Todavía no comprendo como no demonios lo guardo en alguna parte…bueno, esperemos que al publicarlo lo tenga en un solo lado.


/*
Llena la tabla de tiempo
Haciendo cubos: Adrian Ceballos

Solo para asegurarnos que esto corre
en cualquier servidor independientemente
del idioma ademas de especificar en que
idioma saldran los nombres de los dias de la semana
*/
SET LANGUAGE spanish

/*Ponemos que el primer dia de la semana
1 es Lunes. Para el Domingo usar 7*/

SET DATEFIRST 1

declare @fi datetime, @ff datetime

set @fi = '2004-01-01'
Set @ff = '2004-31-12'

while @fi < = @ff
begin
insert into Tiempo (TimeID, Fecha, Anio, MesID, Mes,
Cuarto, Semana, NumDiaSemana, DiaSemana)
select year(@fi)*10000+month(@fi)*100+day(@fi) as TimeId,
@fi as Fecha,
year(@fi) as Anio,
year(@fi)*100+month(@fi) as MesID,
case when Month(@fi)  < 10
then datename(year,@fi)+'-0'+convert(varchar,month(@fi))
else datename(year,@fi)+'-'+convert(varchar,month(@fi))
end as Mes,
year(@fi)*10+datepart(q,@fi) as Cuarto,
datename(year,@fi)+datename(ww,@fi) as Semana,
datepart( dw, @fi) as NumDiaSemana,
datename( dw, @fi) as DiaSemana
set @fi = @fi + 1
end

Solo hay que darle copy-paste y ¡voilá!…No olviden sustituir los valores fechas para el rango que quieren se genere en la tabla de tiempo. El detalle de las columnas aquí.

El concepto es el mismo para cualquier marca de base de datos pero habrá que traducir el script. El script para crear y llenar la tabla de tiempo puede bajar aquí.

Technorati tags: ,





El problema del inventario

17 07 2007

inventario

Para resolver el problema del inventario donde el indicador no se suma si no lo que se quiere es el último valor; podemos usar MDX dentro de Artus para traernos el valor al cierre del periodo. De esta forma el total del mes no será la suma del inventario de cada día del més sino del último día.

La función quedaría así:

[(Measures.[Value], ClosingPeriod([Month])]

Solo sustituyan la palabra Value por el nombre real del indicador y Month por el nombre real de la dimensión y periodo para el cual desean encontrar el valor.

Hay muchísimos casos diferentes; a lo mejor quiero el último valor encontraro, el que si no lo encuentro me dé el del mes pasado, etc.. Aquí en MSDN pueden encontrar un excelente documento que muestra varios casos relacionados con el tema.

Para los que usen Analysis Services con Artus: Todos los casos en el documento se pueden implementar con Artus.

MDX es el lenguaje que Microsoft Analysis Services proporciona para acceder a los datos del cubo, nó Artus. Así que tendrán que investigar en la ayuda proveída por Microsoft. A veces la liga cambia así que lo  pueden encontrar en el Widget de Box en el lado derecho.

Por cierto, es preferible crear el indicador calculado en el cubo de Analysis Services y luego importarlo a Artus. Solo tomen en cuenta dejar el indicador como:

([Measures].[InventarioDinero_DEPENDSONDIMENSION])

Concatenándole la palabra: _DEPENSONDIMENSION

Technorati tags: ,




Use nombres amigables

16 07 2007

nomamig

La mayoría de las herramientas de cubos soportan 2 nombres: el físico y el lógico. El lógico es el nombre que normalmente el usuario vé en la aplicación.

Pongase como obligación  el usar nombras amigables en los campos lógicos. Si usted utiliza nombres como si fueran los campos de una tabla de SQL el usuario no lo comprenderá y esto puede hacer que si aplicación fracase.

A ver diganme ¿con que cara le digo a un director, CEO o lo que sea que haga drill-down por desc_prod?

—Vamos a desglosar las ventas por desc_tda… nerd
—¿qué es eso? —desesperado.
—las tiendas. Y ahora vamos a hacer drill-down por desc_prod
—mmmm..
—…así le llamamos en sistemas a la dimensión Producto… Y finalmente está el dato que estamos buscando…el Total
—¿total de qué?¿de ventas, de unidades, de merma, de cumplimiento? desesperado
—de ventas…nerd

Y luego nos quejamos…

Si queremos que nuestra aplicación tenga éxito, que el usuario se enamore de ella y la use;  entonces use nombres amigables.

Technorati tags: , ,





Exportando a Excel

13 07 2007

PseudoTablero1

En columnas: Los 12 meses del año, el acumulado (YTD), el acumulado año pasado.
En renglones: Los 14,348 clientes que la compañia tiene.

Esto es un problema recurrente que seguido encuentro. Los usuarios finales de la información tienen tableros de control, cuadros de mando, o reportes o informes que tienen tablas con:

13 columnas * 14,348 renglones = 200,872 celdas

¿Qués es lo que se vá a controlar aquí?¿qué es lo que se puede monitorear aquí? En menos de 10 segundos…¿quién es el mejor cliente?

Es imposible trabajar con tanta información. Si uno escarba tantito la primera respuesta que encuentra es:

así me lo pidió el usuario…nerd

¿qué es lo que está pasando? Que el usuario no tiene ni la menor idea de como obtener el resultado en la herramienta que usa, así que se le hace más fácil pedir un megareporte que el EXPORTARÁ a EXCEL y el Excel como ya lo sabe manejar, pues ordenará, hará calculos y obtendrá el resultado que quiere…con toda la perdida de tiempo que esto conlleva.

Si analizamos esto:

  • El usuario no sabe como obtener el resultado. ¡Capacitalo! Hace unos meses mientras entrenaba a unos usuarios les mostré como obtener el pareto (80/20) con un clic. Cuando vieron como se hacía me dijeron: “¿sábes cuanto tiempo hemos perdido haciendo esto? Todos los días entramos, ejecutamos la consulta, esperamos a que la regrese, la exportamos a excel, la ordenamos, calculamos el acumulado, le sumamos,…., y nos dá el resultado; ¡nos toma un día!….SI TAN SOLO NOS HUBIERAN CAPACITADO ANTES”
  • Alguién desconoce  silbandoque Excel directamente puede ejecutar Querys sobres bases de datos SQL o Cubos e importarlos directamente a Excel sin necesidad de un intermediario. Hasta te pone un botoncito “actualizar datos”. Pero que necesidad…
  • El servidor se alenta. Pues claro, de repente quieren la venta a nivel articulo, mes por mes de los 43,567 artículos que la empresa vende…me ha tocado unos casos…

Lo mejor es preguntarle al usuario: Si te doy esa información ¿qué es lo que estás buscando en ella? En base a la respuesta le construimos una consulta que le dé la información en un clic, en poco tiempo y que además le permita monitorear esos 100 productos, clientes, 80/20, o la cobranza, o los ingresos, o la merma, etc.; y el usuario se los agradecerá por que puede dedicarle tiempo a lo que realmente le importa: Tomar decisiones.

Technorati tags: , ,








Seguir

Get every new post delivered to your Inbox.