Business intelligence (BI) con datos de Visual Foxpro. Problemas encontrados


Hace poco retomé un proyecto de exportación de datos para ser analizados en forma estadística desde Excel.  Ahora la aplicación debería generar también los datos para usarlos desde IBM Watson o con Microsoft PowerBI. Esta entrada cuenta mi experiencia con el proceso y algunas soluciones a cosas que me fueron pasando.

Inicialmente lo que el programa de VFP hacía era generar una tabla con una serie de datos estructurados para ser tratados como tablas dinámicas en Excel. Para trabajarlo desde Excel, creé unas tablas DBF desde VFP, y desde Excel usé ODBC para conectar como fuente externa de datos. Esto que puede parecer una gran idea, finalmente se convirtió en un martirio. Cuando cambias el directorio de la fuente de datos (el DBF), Excel provoca fallos de programa y se cierra. Me costó dar con la solución, pero parece que haciendo unos pasos muy concretos, se puede evitar el error en Excel. Pasos: Ir a Propiedades de la conexión, cambiando la cadena de conexión y pulsar inmediatamente sobre el botón Exportar archivo de conexión, para posteriormente sobrescribir el archivo existente .ODC de la definición de la fuente de datos.

Cuando se “cocinan” los datos para ser trabajados como tabla dinámica, los archivos de resultado son bastante grandes. Hay que tener en cuenta que los datos a exportar tienen información que se recupera de diferentes maestros y que se hace con SELECT y LEFT/RIGHT JOIN. Un DBF puede llegar fácilmente al temido límite de los 2GB por tabla de VFP9. Las tablas dinámicas en Excel (sin Power Query) necesitan tener todos los campos repetidos en los registros. Por ejemplo, el nombre de producto estará repetido en una columna tantas veces como líneas de factura tenga la estadística de ventas.

Probé usar la exportación a Excel incluida en VFP. La instrucción Copy to nombrearchivo type XL5 permite hacerlo desde VFP de forma nativa, aunque es poco recomendable por lo antiguo del formato generado. El problema que me encontré en este caso es que herramientas para el análisis de datos, como IBM Watson, se negaron a importarlo por razones de seguridad.Incluso el propio Excel en sus versiones recientes es reticente a trabajar con ese formato antiguo de Excel.

Miré las alternativas para importar desde IBM Watson y la que me pareció más interesante fue generar un CSV de toda la vida. La instrucción para hacerlo desde Fox es:  Copy To nombrearcihvo Type CSV

El archivo CSV resultante es bastante más pequeño que generar un DBF, XLS, o XML.

La felicidad duró poco. Algunos campos tenían carácteres como ” (comillas) o acentos que hacían fallar la importación. Lo raro del caso es que los acentos sólo hacían fallar la importación si estaban puestos en el último carácter del campo. Para subsanarlo, al crear hacer el Select usé la siguiente instrucción para cambiar acentos y quitar las comillas CHRTRAN(nombreCampo, ‘áéíóú”àèìòùÁÉÍÓÚÀÈÌÒÙ’,”aeiou*aeiouAEIOUAEIOU”)  as nombreCampo. Observa como tengo unas comillas en los carácteres a cambiar y que en su lugar estoy poniendo un asterisco.

Otro problema que tuve con los CSV fueron las fechas. No debían haber fechas en blanco, ni con valores nulos. Tampoco fechas inválidas, como el año 0217. Tanto Excel como IBM Watson daban problemas con la importación. Mi solución en este caso fue poner a fecha 01/01/1900 todos los registros cuyo campo fecha estuviese en blanco o tuviese un año incorrecto. Se puede hacer con algo tipo IIF(Year(campoFecha)<1900,Ctod(“01/01/1900”),campoFecha) As campoFecha

Con todo esto, me encontré un consumo exagerado de memoria que provocaba errores de VFP, el cual acababa cerrándose cuando la selección de datos a exportar era muy grande.  Para mitigar los problemas de consumo de memoria tuve que sembrar de DOEVENTS el programa y usar las siguientes instrucciones que encontré hace mucho tiempo en un foro para liberar memoria usada por VFP:

Declare Integer SetProcessWorkingSetSize In kernel32 As SetProcessWorkingSetSize ;
Integer hProcess , ;
Integer dwMinimumWorkingSetSize , ;
Integer dwMaximumWorkingSetSize
Declare Integer GetCurrentProcess In kernel32 As GetCurrentProcess
nProc = GetCurrentProcess()
bb = SetProcessWorkingSetSize(nProc,-1,-1)

IBM Watson tiene la habilidad de intentar “entender” los datos con inteligencia artificial para dar recomendaciones y ayudar a hacer los informes mediante preguntas en lenguaje natural (a día de hoy en inglés). Para que funcionase mejor, necesité exportar el archivo con nombres de campos largos y descriptivos. Para ello usé la solución que publiqué hace días aquí.

Anuncios

4 comentarios en “Business intelligence (BI) con datos de Visual Foxpro. Problemas encontrados

  1. Pingback: Business Intelligence BI | David Acuña Guzman Blog

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s