Tutorial de SSIS. Capitulo I. Mis primeros pasos con el flujo de control

Posted by Miguel Egea | Posted in SQL Server Integration Services, Tutoriales | Posted on 17-03-2010

4

Introducción

El flujo de control de los paquetes de Integration services siven para orquestar todos los pasos que hay que ejecutar para consolidar la información. Son el auténtico WorkFlow de los procesos de extracción transformación y carga. Cualquier operación que tengamos que hacer para consolidar información, para extraer información de un origen y llevarla a un destino tendrá una serie de pasos, esos pasos se orquestarán mediante los flujos de control.

Ejemplos:

Renemos que descargar un conjunto de ficheros e incorporar cada uno de ellos a una base de datos, despues de incorporarlo si el fichero se incorporó por completo irá al directorio de completados y si falló algo al de incorporados con error. Esta funcionalidad se implementa usando tareas ftp que vayan a descargar el fichero y lo dejen en un directorio. Despues usaremos un bucle para recorrer todos los ficheros y llamar a su incorporación y una tarea en caso de acierto que lleve el fichero al directorio adecuado y otra que lo haga en caso de fallo al directorio de erroneos.

Tareas que hay que hacer en secuencia. Por ejemplo, primero hacemos un backup de una base de datos, despues reorganizamos índices, chequeamos integridad y hacemos otra copia.   O bien, consolidamos los datos a un datawarehouse, despues procesamos las dimensiones de un cubo y despues sus grupos de medida.

Algunos elementos del flujo de control

Cuando abrimos el entorno de Bussinnes Intelligence Development Studio, nos aparece lo primero el flujo de control. La barra de herramientas es la que está orientada al flujo de contro. Además de los componentes que podemos pinchar y arrastrar, es importante conocer las formas en las que podemos unir cada una de las cajitas, que operación hará que vayamos por un lado del flujo o por el otro.

Una categoría de objetos que resulta muy interesante de tratar son los Contenedores , en el gráfico de arriba podemos ver los For Loop Container, Foreach Loop Container, Sequence Container.

Sequence Cotainer.Este componente no es más que un contenedor de otros componentes, pero sirve tanto para paralelizar procesos (que varias cajitas se ejecuten a la vez) como para  que un conjunto de procesos solo se ejecuten si se ha producido un evento anterior o bajo determinadas circunstancias. Veremos ejemplos a lo largo de este artículo.  .

For Loop Container. Es un bucle al estilo de la programación normal en el que se especifica la clausula de inicialización, la cláusula de evaluación (detiene el bucle cuando devuelve False, es por tanto una expresión booleana) y la clásula de asignación, que sirve para cambiar los valores y que la expresión booleana  que se evalua pueda ir cambiando. En resumen es equivalente a cualquier bucle de un entorno de programación normal.

Foreach Loop Container. Este bucle recorre elementos de una colección, la colección pueden ser desde ficheros en un directorio hasta registros en un dataset. Dependiendo del tipo que se haya seleccionado.

File System Task. Esta tarea nos va a servir para ilustrar nuestro primer ejemplo. Es una tarea que sirve para hacer operaciones con archivos, copiar, mover, eliminar, etc. En la siguiente tabla podemos ver las opciones que tiene para con los ficheros y por tanto que tareas podemos hacer.

Operación Descripción
Copy directory Copia un directorio de una posición a otra.
Copy file Copia un fichero de una posición a otra.
Create directory Crea un directorio en un lugar determinado
Delete directory Borra un directorio de un lugar determinado
Delete directory content Borra todos los ficheros y directorios de un directorio.
Delete file Borra un fichero de una posición determinada
Move directory Mueve un directorio de una posición a otra
Move file Mueve ficheros de una posición a otra
Rename file Cambia el nombre de un fichero seleccionado
Set attributes Establece atributos de ficheros y directorios. Los tributos pueden ser, Archivo, Oculto, Normal, Solo Lectura y sistema. Normal, recuerda es la ausencia de otros atributos, así pues no puede ser combinado con otros.todos los otros si que pueden ser combinados

En cualquier caso lo que pretendemos con este capítulo no es enumerar los posibles objetos, para eso ya teneis los libros en pantalla que los explican incluso mejor que lo que humildemente yo pueda hacer aquí. Lo que pretendo es que aprendais un uso concreto del flujo de control e ilustrar este a través de ejemplos. Creo que con ejemplos es como mas se aprende.

Primer Ejemplo

En este primer ejemplo vamos a ver como usar un componente ForEach para recorrer los archivos de un directorio y como obtener el nombre de ese fichero y trabajar con él en una tarea.

Lo primero que vamos a hacer es arrastrar un componente ForEach y modificar su mensaje (para ello pulsamos F2) Yo particularmente soy de los partidarios de que los nombres sean descriptivos y ahorrar en documentación, Creo que así, si queda todo autoexplicado es mucho má sencillo de mantener que tener al lado montañas de documentación de los proyectos que tienen una tendencia especial a quedarse automáticamente obsoletas (eso si no son hechas cuando ya no hacen falta simplemente para cubrir el expediente).

La caja en cuestión tiene una serie de propiedades, primer punto  de atención, si estás acostumbrado a Visual Studio igual tienes la tentación de pulsar F4, bien hecho, pero los componente de SSIS tienen un método más sencillo de ser configurados (por norma general) que se obtiene haciendo doble click en la cajita en cuestión en lugar de pulsando la tecla F4. También vale pulsar con el botón derecho del ratón y elegir la opción Editar para conseguir el mismo efecto.

En nuestro caso el Bucle ForEach tiene 4 pestañas de configuración que son General, Collection, Variable Mappings y expressions. Sobre el tema de expressions ya iremos hablando, así que os pondré los pantallazos de como quedan las otras tres en nuestro caso y os comentaré a continuación que conseguimos con estos formatos (los dejaremos para este ejemplo pero habrá que ir cambiandolos para los sucesivos.

 

En la primera pestaña tenemos el nombre de objeto y su descripción, la parte importante viene en el segundo y tercer lugar. En la  segunda pestaña podemos ver que es un bucle para recorrer ficheros en un directorio, cual es el directorio, que tipo de ficheros queremos recorrer y como queremos que nos devuelva el nombre del fichero (Full qualified quiere decir que con el path completo).  Por ultimo hay un check por si queremos recorrer subdirectorios.  En la tercera pestaña podemos ver que nos va a devolver en una variable (que hemos creado desde el propio asistente lo que el objeto tenga en la posición 0, que os adelanto que es el nombre completo del archivo que ha leido.

Con esta configuración ya podemos leer los ficheros y saber como se llaman. Si ejecutasemos ahora mismo nuestro paquete, se nos pondría en verde diciendo que ha terminado correctamente, sin embargo, a mi me gustaría que en este primer paso, al menos comprobasemos que  ha funcionado, y para ello se me ocurre que podemos añadir una tarea de modificación de ficheros y cambiarle el atributo a nuestros archivos por ejemplo a solo lectura.

Para ello hemos de arrastrar dentro del contenedor la tarea de File System y configurarla para que el fichero lo tome de nuestra variable y además que sea una operación de tipo cambio de atributos (lo que cambiará las propiedades que hemos de rellenar). En nuestro caso la configuración quedará como sigue :

Las flechas azules indican las cosas que hemos cambiado, y el resultado de la ejecución es que los ficheros quedan con el atributo cambiado a solo lectura. Podeis descargar el ejemplo aquí (ponedlo en c:\ para que funcione sin tocar).

Comments (4)

Muy buena la forma de explicar, está claro y sencillo.
Muchas gracias por sus aportes. Espero el siguiente capitulo.

Hola, necesito hacer algo similar, pero con los registros de una tabla.

Necesito que por cada tupla encontrada de un conjunto de datos (query, tabla, etc.) se dispare luego otra acción para enviar un mail.

No se como puedo aplicar una forma de loop, para que busque así como lo haría con un cursor en sql

Saludos,
Mauricio

Me parece muy buena la forma de explicar.
El tema es que todas las personas que intentan explicar acerca de este control lo hacen con la ya conocida y trillada lista de archivos en un directorio.
Como comentó Mauricio.
Sera posible que alguien pueda hacer el ejemplo con los registros de una tabla??
No se como se hace, pero tratandose de herramientas Microsoft, no creo que se ocupe un Phd en astrofisica o lago asi para hacer este ejemplo.

Muy buena la explicacion pero me gustaria que realizaras el ejemplo para borrar un grupo de archivos pero que cumplan una condicion con repecto a nombre osea que tenga una logica previa en el nombre por ejemplo
borrar solo los que cumplan la nomenclatura
swcIBLogic_BK20110406_170008.log (*_BK*.log).
es posible esto con SSIS…

Write a comment