Integration Services y Visual FoxPro Databases

Introducción

Un cliente me planteo la necesidad de poder generar reportes, tomando los datos del sistema, y poder expórtalos a Excel, herramienta super poderosa a la cuál él ama (es contador!), y hacer estadísticas.
Viendo su requerimiento pensé, podríamos utilizar Analysis Services, tomar los datos de las tablas de VFP y listo! Usamos Excel con Power Pivot, y recuperamos los datos de SSAS!
Pero bueno, no todo es tan simple como parece, me encontré que al querer hacer la conexión a la DBC de VFP desde SSAS, me daba diferentes errores, probando diferentes formas de conexión. Leyendo por la web, encontré que el problema podría ser la incompatibilidad entre versiones 32 bits y 64 bit. Es decir, yo tengo instalado un SQL Server 2012 64 bits y los drivers OleDb de VFP son para 32 bits, entonces hace que no funcione. Pueden ver una explicación mas detallada en http://logica10mobile.blogspot.com.ar/2012/05/como-consumir-datos-de-visual-foxpro-en.html,

Probé instalar un SQL Express 32 bits para hacer un puente entre SSAS y la DBC, pero resultó ser muy lento al ejecutar consultas, entonces también lo deseche.
Por último se me ocurrió probar Integration Services, y sí pude importar los datos de la DBC a una base de datos SQL Server! Realmente funciona muy bien y es muy rápido!

Bien, entonces ya hecha la introducción, empezamos a ver cómo hacer para importar datos de Visual FoxPro a una base de datos SQL Server a través de SSIS.

Base de Datos

Voy a tomar solamente una tabla de la base de datos que tenia que importar. La base de datos la vamos a llamar Sistema.DBC y la tabla se llama Operaciones.DBF. La estructura es la siguiente:


Bien, lo primero que necesite es tener esta misma base de datos en mi SQL Server. Investigando,
encontré lo mas fácil. El Visual Studio tiene un asistente para diseñar el proyecto, el cuál genera lo necesario para crear la estructura de la base de datos en base al origen. Pero en todas mis instalaciones de SQL Server no me funcionó. Siempre daba error al querer crear la conexión a la DBC. Estimo que debe ser la misma incompatibilidad con el driver de 32 bits.
Para no seguir renegando decidí crear mi base de datos en SQL Server por mi cuenta, total es un sistema en donde no tengo demasiadas modificación de estructuras de datos. Para esto, utilice el proyecto Upsizing Wizard que viene en Microsoft Visual FoxPro 9.0 "Sedna" Add-Ons que pueden descargarlo de http://www.microsoft.com/en-us/download/details.aspx?id=8618.

Cuando se utiliza este proyecto para migrar la DBC a SQL Server, hay que tener en cuenta que VFP arma la relación de integridad de las tablas a través de Triggers, y estos triggers también los crea en SQL Server. Esto hacía que me dé errores en la integración, por lo que decidí eliminarlos y crear las relaciones de integridad como se debe.

SQL Server Data Tools

SQL Server Data Tools son las herramientas que hay que instalar con SQL Server para poder crear el proyecto SSIS (como así también otros proyectos SQL Server).
Bien, comencemos abriendo Visual Studio 2010 (O también podemos ir a Inicio, Todos los programas, Microsoft SQL Server 2012, SQL Server Data Tools) para crear el proyecto SSIS.

Proyecto Integration Services

Creamos un nuevo proyecto de Integration Services en VS llamado VFP_SSIS:


Tenemos nuestro proyecto y el diseñador con el archivo Package.dtsx abierto. En este archivo nosotros agregaremos las tareas para hacer la integración.


Bien, comencemos a agregar las tareas para hacer la integración.
Primero agregamos la Tarea Flujo de Datos desde el Cuadro de herramientas SSIS.


Nos pasamos a la solapa Flujo de Datos para configurar el origen y destino.
Para configurar el Origen, vamos a ir a "Otros orígenes" en el cuadro de herramientas de SSIS y seleccionamos Origen de OLE DB.
Hacemos doble click para acceder al editor de origen. En esta ventana se visualizaran las conexiones OLE DB existentes, en nuestro caso no tenemos ninguna por lo que haremos click en el botón "Nueva..." que esta al lado del combo de administrador de conexiones.
Se abrirá otra venta llamada "Configurar el administrador de conexiones OLE DB". Hacemos click en el botón "Nueva..." y abrirá la ventana "Administrador de conexiones". Aquí vamos a configurar la conexión a la DBC.
En el proveedor seleccionamos Microsoft OLE DB Provider for Visual FoxPro. En el campo Nombre de servidor o archivo ponemos la ubicación de nuestra DBC y hacemos click en el botón "Probar conexión" para verificar que todo este correcto.


Hacemos click en el botón "Aceptar", y nuevamente en "Aceptar" de la ventana anterior hasta llegar al editor de orígenes OLE DB.


Ahora debemos configurar la tabla origen. En este paso voy a hacer una aclaración: En el modo de acceso a datos podemos elegir el valor que esta por defecto, Tabla o vista, y seleccionar la tabla origen. Esto seria lo mas simple, pero me encontré con el problema que me importa los registros marcados como eliminados, aunque en la cadena de conexión le indicara que no los traiga.
Por este motivo, la solución fue seleccionar en el Modo de acceso a datos la opción Comando SQL y escribir el comando. Con esto logré solucionar el tema de los registros eliminados.
Entonces, mi origen de datos quedó como se muestra en la imagen:


Bien, al dar aceptar al editor de origen, seguramente les va a dar un error de Códigos de Página. Esto lo solucionamos cambiando el valor de la propiedad AlwaysUseDefaultCodePage del Origen de OLE DB a True.
Otra propiedad que debemos cambiar esta en el proyecto de la solución. Hacemos click derecho en el proyecto, vamos a propiedades y seleccionamos la opción "Depuración", ahí se encuentra la propiedad Run64BitRuntime a la cual debemos ponerla en False.


Por el mismo error de incompatibilidad del proveedor OLE DB, si no cambiamos esta propiedad nos va a dar error cuando quiera utilizar el driver de Visual FoxPro Database.

Ahora vamos a configurar el destino. Vamos a hacer algo similar que el origen, nos vamos a "Otros destinos" en el cuadro de herramientas de SSIS, seleccionamos y agregamos Destino de OLE DB.
Seleccionamos el origen creado anteriormente y luego hacemos un click en la flecha azul y la unimos al destino creado.


Hacemos doble click para acceder al editor de destino. Vamos a ver que nos ofrece por defecto la conexión que creamos anteriormente. Vamos a crear una nueva conexión de la misma forma que la anterior, pero con otro proveedor. Hacemos click en el botón "Nueva..." que esta al lado del combo del administrador de conexiones.
Se abrirá otra venta llamada "Configurar el administrador de conexiones OLE DB". Hacemos click en el botón "Nueva..." y abrirá la ventana "Administrador de conexiones". Aquí vamos a configurar la conexión a nuestro SQL Server.
En el proveedor seleccionamos SQL Server Native Client 11.0. Ingresamos nuestro Nombre de servidor SQL Server y seleccionamos la base de datos destino. Hacemos click en el botón "Probar conexión" para verificar que todo este correcto.


Hacemos click en el botón "Aceptar", y nuevamente en "Aceptar" de la ventana anterior hasta llegar al editor de destino de OLE DB. Aquí seleccionamos la tabla destino.


Nos vamos a Asignaciones y vemos que automáticamente nos vinculó los campos del origen con los del destino.

Por el momento vamos a omitir las asignaciones en los campos fecha_chq y fecha_vto. Hay registros con valores vacíos y si los dejamos asignados nos va a dar error en la ejecución. Mas adelante vamos a ver cómo solucionamos este error.


Hacemos click en "Aceptar" para finalizar la configuración del destino. Apretamos F5 para ejecutar el proyecto y ver que pasa...


Bien, después de unos minutos de procesamiento, importó mas de 500 mil registros sin ningún problema. Realmente me sorprendió la velocidad para importar esa cantidad de registros.

Hasta acá todo perfecto, pero faltó asociar dos campos tipo fecha. En mi base de datos origen esos dos campos pueden estar vacíos, y en mi base de datos SQL Server deben guardarse con NULL.
Si volvemos a hacer doble click en el Origen de OLE DB y hacemos click en el botón "Vista previa...", vemos que las fecha vacías vienen con el valor 30/12/1899. Cuando encuentra este valor, da error de fecha no válida.


Para solucionar esto, tenemos que agregar el control Columna derivada. Asociamos el origen y el destino a este control, tal como lo muestra la imagen.


Hacemos doble click en el control para ingresar a la ventana Editor de transformación Columna derivada. Aquí para cada campo fecha debemos especificar la expresión a evaluar.
En "Columna derivada" especificamos el primer campo, en nuestro caso es "fecha_chq" y en "Expresión" ponemos: "DATEPART("year",fecha_chq) < 1910 ? NULL(DT_DATE) : fecha_chq".
Esta es una simple expresión IF, en donde evalúo si el año es menor a 1900 (01/01/1900 es la menor fecha para que no de error), entonces devuelvo NULL, caso contrario devuelvo el valor del campo.
Lo mismo hago para el segundo campo fecha.


Hacemos click en "Aceptar" y volvemos a editar las asignaciones destino que omitimos anteriormente.


Volvemos a ejecutar el proyecto para ver que todo funcione correctamente.

Recuerden eliminar los registros de la tabla SQL Server. Al ejecutar el proceso agrega los registros pero no elimina los anteriores.

Para terminar, vamos a automatizar la eliminación de registros, así evitamos posibles errores de clave primaria.
Volvemos al diseñador y nos posicionamos en la solapa "Flujo de control". Agregamos la Tarea Ejecutar SQL. Hacemos click en la flecha verde y la asociamos a la Tarea Flujo de datos.


Hacemos doble click en la Tarea Ejecutar SQL y accederemos al "Editor de la tarea Ejecutar SQL". Aquí asignamos en la propiedad Connection la conexión a SQL Server y en la propiedad SQLStatement el comando SQL a ejecutar. En mi caso sería "DELETE FROM operaciones".


Hacemos click en "Aceptar" y volvemos a ejecutar el proyecto. Veremos que primero elimina todos los registros de la tabla SQL Server y luego ejecuta la tarea de Flujo de Datos.


Bueno, hasta aquí hicimos un proyecto SSIS para importar una base de datos Visual FoxPro a SQL Server. En el próximo post explicaré cómo publicarlo en SQL Server Integration Services y armar la tarea en el Agent.

Espero que les haya servido, hasta la próxima!

Comentarios

Entradas populares de este blog

Bases de datos locales en Windows Phone

Agregar proyecto existente al Project Explorer de Eclipse