Quiero que los filtros solo muestren aquellas dimensiones con movimientos.

9 09 2008

image

Por: Diana Luz Vazquez

Sí usted se preguntaba como hacerle para que Artus solo muestre en los filtros aquellos valores de las dimensiones que tengan información en la tabla de hechos, esto es de gran utilidad.

Cuando incluyo un filtro de dimensión, lo que se espera es que las opciones de valores de esa dimensión que se muestran en el filtro, sean solamente aquéllas para las que el cubo tiene datos (sobre todo para dimensiones con gran cantidad de elementos). De manera que si tengo 100 Sucursales en el CAT de ésa dimensión pero en el cubo realmente solo hay datos para 30 Sucursales, sólo quiero ver esas 30 sucursales como opción de elementos para seleccionar en el combo del filtro.

MenuCubo
Esto lo he conseguido utilizando la opción de Artus Administrador de ‘Indicador con datos para todas las dimensiones’. Para ello, lo que hago es identificar un indicador base del cubo (de entre los principales) que sabemos que siempre tiene valor. Si es un cubo de Ventas, probablemente el indicador idóneo sea ‘ImporteVta’ y así… si el cubo está distribuido, o sea que no puedo identificar 1 indicador que sé que tendrá datos para todo el cubo, lo que hago es crear uno que sea una especie de ‘Contador de Registros’ (normalmente lo incluyo directamente en la estrella como un Identity).
Finalmente lo que hago es agregar ese indicador en la definición del cubo como ‘Indicador con datos para todas las dimensiones’ (te incluyo una imagen). Lo que ocurre es que internamente en el query MDX, se valida con base en ese indicador para llenar los valores de los filtros de dimensión. Resultado: Cuando sincronices un Filtro de Dimensión con los objetos del escenario, los combos sólo mostrarán elementos de dimensión válidos (para aquellos en los que el cubo tiene datos) =D

IndDatosTodasDim
Ése indicador no tiene que ser visible en Artus Desktop, pues es sólo para uso interno

No estoy segura si también funciona para ROLAP. Lo que sí puedo decirte es que para cubos de Analysis Services, funciona muy bien y no se afecta en nada al performance de las consultas que genera el escenario.

Si, esto también funciona para los cubos ROLAP.





Ceros y Nulos en un data warehouse

19 09 2007

Una de la grandes lecciones aprendidas una y otra vez, proyecto tras proyecto, es el uso correcto de ceros y nulos en el datawarehouse. El principio es sencillo e importante conocer:

5548+ nulo = nulo

No importa lo que pongas el resultado se anula. Una o dos veces al principio me ocurrió que llenaba los cubos o estrellas y al tratar de sacar el total de ventas con un

select sum( ventas ) from HechosComercial

obtenía como resultado nada. Se platica sencillo pero lo que en realidad ocurría era:

—¿cuánto tiempo falta para que termine la carga?
—una hora…
—¿a que horas es a la presentación a dirección?…tenemos que darle una revisada rápida a las pantallas
—dentro de 2 horas
—tiempo suficiente.

Una hora después…

— ya terminó la carga, a ver, revisa las pantallas.
— ¡las pantallas están vacías! No se cargó la información, %&/%#…¿falló algo?
— No, todo está bien. Los logs no marcan errores e incluso las tablas tienen información
Confused
— A lo mejor definiste mal los indicadores, revisa la definición
— …está todo bien
— ¿no será que usaste el indicador equivocado? hay que revisar las pantallas.
— …No, todo es correcto.
— ¿y si la haces de nuevo?
—…ya la hice de nuevo sigue igual..¿cuanto falta?
— 15 minutos…

Más tarde y después de cancelar la presentación o de haber arruinado el buen humor de la junta de resultados resulta que encontramos el query:

select sum( ventas ) from HechosComercial

— No entiendo, si ejecuto la consulta me regresa un nulo. Ya revisé cada uno de los totales por región. Saque el detalle, lo exporté a excel e hice los cálculos. Coinciden perfectamente.
—¿no será un bug de la base de datos?
—Yo creo que sí.
—Voy a buscar algo en google…

Así, después de horas y horas finalmente descubrimos que un registro con el valor de la columna ventas igual a nulo era el causante de todo. 2 millones 354 mil registros de información y un mendigo registro con el valor de nulo echa a perder todo.

A partir de entonces como procedimiento normal de la carga, sustituimos todos los nulos por un cero o en su defecto uso un desagradable sum( isnull( Ventas,0)). También en el create table en la definición de las columnas ponemos un default de cero.

Alguien pudiera pensar…”sencillo, en el where ponle Ventas is not null” pero con millones y millones de registros estoy seguro que sentaríamos el servidor al obligarlo a recorrer registro por registro toda la estrella para discriminar aquellos registros con nulos. No se les ocurra indexar las columnas-indicadores para acelerar la busqueda. Sería una barbaridad.

No siempre usamos cero, a veces en ciertos casos hemos tenido que dejar los nulos por algún requerimiento del indicador. Todo depende.

Al menos una vez al año recibimos alguna llamada de una persona desesperada por que las pantallas no muestran información y con un “pero las tablas si están llenas”. Eso quiere decir que ocurre a menudo. ¿A alguien le ha pasado algo parecido?

Technorati tags:








Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 28 seguidores