Usando DinamiCube en Visual FoxPro

14
Usando DinamiCube en Visual FoxPro http://www.fpress.com/ Por Luis Guerra  DC_Demo.zip  El presente artículo está escrito con la intención de dar a los desarrolladores de Visual FoxPro una introducción e ideas para agregar a las aplicaciones que desarrollan capacidades de Consultas Dinámicas muy parecidas a las tablas pívot de Excel o a los cubos que se crean con los Servicios de nálisis de S!" Server #$$$ o similares% tambi&n llamados Cubos'  Para lograr este ob(etivo )e usado el DynamiCube% que es un control ctive*' El control Dyna miCu be es un cont rol que permit e obte ner y most rar enorme s can tida des de dato s almacenados en bases de datos relacionales en una +orma resumida y tabulada que ayuda al usuario +inal a reali,ar decisiones precisas' "os datos num&ricos pueden ser obtenidos de m-ltiples Fuentes% tabulado s% resumidos y presenta dos al usuario en un cubo multidimensio nal' El usuario +inal puede manipular la vista% mover dimensiones y cambiar el orden para responder me(or a sus necesidades de análisis' DynamiCube es n.dimensional y está limitado solamente por los recursos disponibles del entorno de la PC donde se e(ecuta' Cada dimensión consiste de un n-mero +inito de puntos de datos' Estos puntos de datos son usados para locali,ar un elemento de datos individual'  Para poder simpli+icar algunas explicaciones% en algunos casos me voy a re+erir al control DynamiCube simplemente como cubo' En principio se va a crear un +ormulario y se le va pegar el control DynamiCube al mismo' El control aparece en la lista de controles como la clase DCube Class' /al como se ve en la +igura siguiente0  1na ve, seleccionado el control% )acemos clic en Ok  y se mostrará el control como un rectángulo con +ondo blanco al cual le pondremos 2oleCube3 en la propiedad Name% tal como se puede observar en la siguiente +igura0  

Transcript of Usando DinamiCube en Visual FoxPro

Usando DinamiCube en Visual FoxPro

Usando DinamiCube en Visual FoxProhttp://www.fpress.com/

Por Luis Guerra

DC_Demo.zip INCLUDEPICTURE "http://www.fpress.com/revista/Num0903/down.gif" \* MERGEFORMATINET

El presente artculo est escrito con la intencin de dar a los desarrolladores de Visual FoxPro una introduccin e ideas para agregar a las aplicaciones que desarrollan capacidades de Consultas Dinmicas muy parecidas a las tablas pvot de Excel o a los cubos que se crean con los Servicios de Anlisis de SQL Server 2000 o similares, tambin llamados Cubos.

Para lograr este objetivo he usado el DynamiCube, que es un control ActiveX. El control DynamiCube es un control que permite obtener y mostrar enormes cantidades de datos almacenados en bases de datos relacionales en una forma resumida y tabulada que ayuda al usuario final a realizar decisiones precisas. Los datos numricos pueden ser obtenidos de mltiples Fuentes, tabulados, resumidos y presentados al usuario en un cubo multidimensional. El usuario final puede manipular la vista, mover dimensiones y cambiar el orden para responder mejor a sus necesidades de anlisis. DynamiCube es n-dimensional y est limitado solamente por los recursos disponibles del entorno de la PC donde se ejecuta. Cada dimensin consiste de un nmero finito de puntos de datos. Estos puntos de datos son usados para localizar un elemento de datos individual.

Para poder simplificar algunas explicaciones, en algunos casos me voy a referir al control DynamiCube simplemente como cubo. En principio se va a crear un formulario y se le va pegar el control DynamiCube al mismo. El control aparece en la lista de controles como la clase DCube Class. Tal como se ve en la figura siguiente:

Una vez seleccionado el control, hacemos clic en Ok y se mostrar el control como un rectngulo con fondo blanco al cual le pondremos oleCube en la propiedad Name, tal como se puede observar en la siguiente figura:

El control DynamiCube soporta varias tecnologas para acceder a datos. Para ver cuales son las tecnologas y cual deseamos usar hacemos clic secundario sobre el control y seleccionamos DCube Class Properties, como observamos en la siguiente figura:

Despus de lo cual se mostrar una ventana con varias pginas en la primera de las cuales se mostrar un combobox correspondiente al tipo de conexin (Connection Type) con una lista de tecnologas que se pueden usar para acceder a datos.

Como se ve, se pueden usar varias tecnologas entre las que destacan ODBC, ADO (OLE DB) y DAO, adems del modo Unbound que permite llenar los datos del cubo en tiempo de ejecucin. El modo Unbound tiene la ventaja de que se puede llenar el cubo desde cualquier fuente de datos de que dispongamos en tiempo de ejecucin, pueden ser cursores, vistas, tablas, variables de memoria, arreglos, etc. La desventaja es que no se puede disear el DynamiCube en tiempo de desarrollo, lo que s se puede hacer con las otras tecnologas de acceso a datos tales como el ODBC que permite crear una instruccin SELECT en tiempo de desarrollo lo que es usado para disear el cubo, esto se hace en la pgina Layout de la misma ventana de propiedades del DynamiCube y que facilita enormemente el diseo del mismo. Vamos a dar un vistazo rpido de cmo se diseara el DynamiCube con una conexin ODBC a una base de datos SQL Server 2000 y cmo se vera:

Primero se define el tipo de conexin, luego la cadena de conexin as como la instruccin SELECT-SQL que obtendr los datos:

Luego est la pgina Time Series que permite definir algunos tipos de datos relacionados a fechas que podran usarse como datos del cubo tales como ao, trimestre, mes y semana. En este caso no se va a usar ninguno de esos campos, pero se muestra por cuestiones didcticas:

Luego, se definen los campos que se van a mostrar y su posicin dentro del cubo, para esto se va a la pgina Layout y se pulsa el botn Retrieve Fields para que en la lista aparezcan todos los campos que el SELECT hace disponible, de los cuales se van a usar algunos, esto se hace arrastrando el campo desde la lista hasta la posicin deseada:

En la pgina Fields, se pueden cambiar los ttulos o encabezados que van a tener los campos en tiempo de ejecucin:

En la pgina Preferences, se puede cambiar el aspecto que va a tener el cubo, para lo cual hay varios comboboxes y checkboxes que corresponden a diferentes partes del mismo y que sirven para darle un estilo personalizado ante el usuario final, aunque desde mi punto de vista los valores predeterminados son buenos.

En la pgina Printer, se va a especificar el encabezado, pie de pgina, mrgenes y justificacin cuando se imprima o se haga una vista preliminar de la impresin, as como si se desea que se repitan en cada pgina los encabezados:

En la pgina Color, se pueden especificar los colores que van a tener diferentes partes del DynamiCube, tales como colores de fondo y de letras de los encabezados as como de los datos:

Y por ltimo en la pgina Fonts, se podr especificar los tipos de letras para cada parte del cubo:

Luego hacemos clic en el botn Ok y ejecutamos el formulario, el cubo se ver ms o menos de la siguiente forma:

El usuario final puede mover los campos de un sitio a otro, es decir, hacer que los campos estn como columnas, filas y/o pginas (rea superior del DynamiCube, tambin se le llama rea de filtro, ms adelante veremos por qu), los campos de datos (las cantidades) no se pueden mover. De esa forma el usuario puede construir varios reportes de acuerdo a cmo haya distribuido los campos, por ejemplo, puede arrastrar el campo Mes hasta el rea de los campos fila, pero al costado derecho del campo Cuenta, con lo cual el cubo se vera as:

Adems si se desea podemos cambiar el campo al rea de campos de columna, con lo cual, el cubo quedara as:

Pero eso no es todo, se pueden filtrar los datos como sea necesario, por ejemplo podemos abrir el campo Ao como un dropdown y se mostrarn los datos correspondientes, se mostrarn, en este caso, los aos 2002 y 2003:

Si deseamos ver solamente los datos del ao 2002, quitamos el check del ao 2003 y luego hacemos clic en cualquier parte del cubo para que se cierre el dropdown y mostrar slo los datos del ao 2002:

Similarmente, s slo deseamos ver los datos del primer semestre del ao 2002, basta con abrir el dropdown del campo Mes y quitar el check de los meses correspondientes al segundo semestre:

El cubo se mostrar as:

Como se ha visto, se puede disear cmo uno desea ver el cubo, en tiempo de desarrollo, todo desde la ventana de propiedades del DynamiCube. Para cada opcin hay una propiedad disponible que tambin se puede acceder mediante programacin, aunque sera ms complicado hacerlo as. Los resultados son muy buenos, por no decir excelentes.

Ahora volviendo al tema central de este artculo, nos concentraremos en el uso del DynamiCube en modo Unbound para poder acceder a los datos desde una consulta de tablas VFP o desde un cursor VFP y realizar una rutina para llenar los datos del cubo.

Lo primero que se debe hacer es poner la propiedad AutoYield del objeto _VFP en falso para que el Dynamicube funcione bien, (esto slo es necesario en el modo Unbound). Esto lo podemos hacer en el evento INIT del Dynamicube:

_Vfp.AutoYield= .F.

Luego debemos poner la propiedad DCConnectType en modo Unbound y la propiedad AutoDataRefresh en falso, lo ltimo es para evitar que el DynamiCube intente cargar datos cuando se crea el control y se muestre un mensaje de advertencia cuando se ejecuta el formulario, esto es debido a que an no se han creado los campos. Esto se puede hacer desde la ventana de propiedades de Visual FoxPro o mediante cdigo en el evento Init del control oleCube:

This.DCConnectType= 99 && Modo Unbound.

This.AutoDataRefresh= .F. && Evite que se muestre el mensaje de advertencia.

Tambin, si deseamos tener los encabezados con letras azules y fondo verde claro, lo hacemos desde la ventana de propiedades del DynamiCube:

Los cuales equivalen a las propiedades FieldsForecolor y FieldsBackColor, lo que tambin se puede hacer mediante programacin, naturalmente que en esta ltima forma se pueden especificar muchos ms colores que los disponibles en la ventana de propiedades, pero lo que se debe saber es el valor numrico equivalente al color deseado.

En este ejemplo vamos a usar la tabla DATOS.DBF, ya creada, la cual vamos a agregarla al entorno de datos del formulario. No es necesario que sea una tabla, en aplicaciones reales, sera un cursor generado desde un SELECT-SQL y que tenga datos no-normalizados, similares a los necesarios para un reporte. La tabla que vamos a usar tiene los siguientes datos:

Luego se va a armar la distribucin de los campos, con sus encabezados, en el evento Init del formulario de la siguiente forma:

** Crear los campos del DynamiCube.

With This.oleCube.Fields

.DeleteAll() && Borra todos los campos (si existe alguno).

.Add( "division", "Divisin", 2) && Divisin como fila.

.Add( "region", "Regin", 1) && Regin como columna.

.Add( "ganancia", "Ganancia", 3) && Ganancia como datos.EndWith

Una vez que se han definido los campos, lo nico que queda por hacer para completar la configuracin, o mejor dicho, la construccin del cubo, es llenar con los datos de la tabla que se acaba de mencionar. Esto se realiza a travs del evento FetchData del DynamiCube, este evento slo se dispara en modo Unbound y cuando se ejecuta el mtodo RefreshData():

Local lnCampos, laDatos( 1)

lnCampos= 3 && Nmero de campos en DynamiCube.Dimension laDatos( lnCampos)

Select Datos

Scan

** Llena los valores de los campos en el arreglo laDatos.

laDatos( 1)= Datos.division

laDatos( 2)= Datos.region

laDatos( 3)= Datos.ganancia

** Agrega los datos al DynamiCube.

This.AddRowEx( @laDatos)

EndScan

Los valores que contiene el arreglo laDatos deben estar en el mismo orden en que se crearon los campos, de lo contrario, se pueden obtener resultados extraos. Se usa el mtodo AddRowEx() para agregar al DynamiCube los datos que se encuentran en el arreglo.

Ahora lo ltimo que falta para poder mostrar los datos es usar el mtodo RefreshData(), el cual, al ser llamado, ejecutar el cdigo que se encuentra en el evento FetchData(). En nuestro ejemplo se ha usado un botn que llama al mtodo RefreshData() para mostrar el DynamiCube:

This.Parent.oleCube.RefreshData()

El formulario queda as:

Se pueden mover los campos de tal manera que el DynamiCube quede as:

O as:

Para tener una vista preliminar de cmo se imprimira el cubo se usa el mtodo PrintPreview(), al formulario del ejemplo se le ha agregado un botn Vista preliminar el cual llama a dicho mtodo de la siguiente manera:

This.Parent.oleCube.PrintPreview()

Lo cual mostrar una ventana como la siguiente:

En la parte superior de la ventana hay botones desde los cuales se puede Imprimir, configurar la impresora y el tamao de pgina, cambiar el ancho y alto de las celdas, avanzar de pgina si es necesario y por ltimo hacer un Zoom de la vista preliminar.

Si se desea imprimir el cubo sin hacer una vista previa se usa el mtodo Print() el cual necesita tres parmetros: el primero si es .T. (verdadero), indica que se desea mostrar una ventana de dilogo de impresin que permite cambiar la impresora predeterminada, si es .F. (falso) no se muestra el dilogo y comienza a imprimir directamente. Los dos restantes parmetros tambin son obligatorios e indican el primera y ltima pgina que se van a imprimir, si se pone -1 en el tercer parmetro, indica que se desea imprimir todas las pginas, estos parmetros son obviados si el primer parmetro es .T. (verdadero). Para llamar al mtodo Print() en el botn, se hara de la siguiente forma:

This.Parent.oleCube( .F., 1, -1)

Lo cual comenzara inmediatamente a imprimir en la impresora predeterminada en ese momento.

Para terminar, quiero decir que el DynamiCube puede ser expandido para incluir ms dimensiones y ms informacin de resumen. Provee informacin de soporte de decisin en un formato flexible que los usuarios finales pueden manipular y modificar de acuerdo a sus necesidades de anlisis.

Otra de las ventajas es que no se necesita de un servidor OLAP o similar para tener la misma funcionalidad y lo bueno es que solo es cuestin de pegar el control en un formulario y programarlo, tarea que se puede simplificar enormemente si se crea una clase que ya tenga toda la funcionalidad descrita, lo cual solo haga necesario indicar los campos, encabezados, distribucin y nada ms, la clase se encargara de todo. Por ejemplo, yo he creado una clase que uso en las aplicaciones que desarrollo que permite mostrar el cubo, tener una vista preliminar, imprimirlo y hasta exportarlo a una hoja Excel. Todo eso es posible debido a que el modelo de objetos es completo y da un gran control sobre cada aspecto del cubo.

La versin actual del DynamiCube es la 2.5.1.2. y hay una nueva versin que es llamada ActiveCube 3 la cual es tambin una gran herramienta e incluso soporta exportacin a Excel en forma nativa, la principal desventaja, si se le puede llamar as, es que solamente soporta conectarse con servicios OLAP y aunque tiene un modo Unbound, de lo que he investigado, no se puede hacer lo mismo que con el DynamiCube. Para los interesados, pueden descargar la versin de evaluacin desde http://www.datadynamics.com, lo bueno es que las versiones de evaluacin son completamente funcionales pero slo duran 30 das. Sin embargo, vale la pena investigar ms a fondo este control que es muy verstil.