SQL Integration Services - SSIS: Contenedor de bucles Foreach

El contenedor de bucles Foreach define un flujo de control que se repite en un paquete. Este es un componente definido en el SSIS (SQL Server Integration Services). La ejecución del bucle en el contendor For Each es similar al bucle Foreach de varios lenguajes de programación conocidos.

Existen diferentes tipos de enumeradores disponibles que son:

* Enumerador de archivos para Foreach
El enumerador de archivos enumera los archivos en una carpeta. Por ejemplo, podemos obtener todos los archivos que tienen la extensión *. Txt en una carpeta de Windows y sus subcarpetas.

* Enumerador ADO para Foreach
Permite enumerar las filas de una tabla. Por ejemplo, podemos obtener las filas de los registros ADO.

* Enumerador de conjunto de filas del esquema Foreach de ADO.Net
El enumerador ADO.Net enumera la información del esquema. Por ejemplo, podemos obtener la una lista de tablas de la base de datos.

* Enumerador de elementos para Foreach
Utilizado para enumerar elementos que son colecciones. Por ejemplo, podemos enumerar los nombres de los ejecutables y directorios de trabajo que utiliza una tarea Ejecutar proceso.

* Enumerador de lista de nodos para Foreach
La lista de nodos que permite Enumera el resultado de una expresión XPath.

* Enumerador de variable para Foreach
El enumerador de variable enumera los objetos que contienen variables especificadas. Aquí los objetos enumerador no son más que una matriz o tabla de datos, como por ejemplo un DataSet de ADO.Net

* Enumerador de SMO para Foreach
El enumerador de SMO enumera los objetos de administración de SQL Server (SMO). Por ejemplo, se puede obtener la lista de funciones o vistas de una base de datos SQL Server.

Para este ejemplo utilizaremos el enumerador de archivos Foreach, vamos a copiar los archivos que se encuentran en una carpeta Origen (C:\Origen) a una carpeta Destino (D:\Destino).

Business Intelligence ProjectsPrimero abrimos el Visual Studio y creamos un proyecto Business Intelligence - Integración de
servicios como lo muestra la siguiente imagen.


Después de crear el proyecto de integración de servicios cambiamos el nombre por defecto de la Dtsx package1, para este ejemplo podemos poner ExampleForeach.

Solution Explorer

Seguidamente empezamos agregando una variable a nuestro paquete ExampleForeach, damos clic derecho sobre el modo de diseño y en el menú damos clic sobre Variables.


Luego nos aparece una ventana que nos permite Agregar la variable.



Aquí añadimos como nombre de variable File, tipo de datos String y value o valor default.



Ya configurada nuestra variable, procedemos arrastrar el contenedor de bucles ForEach que se encuentra en la caja de herramientas al formulario.

Quedando el contenedor bucle Foreach en modo diseño de la siguiente forma:


Para configurar nuestro control seguiremos los siguientes pasos:

1. Dar doble clic en el cuadro contenedor de bucle o clic derecho Edit
2. Luego se muestra una ventana para editar el bucle Foreach.
3. En esta ventana en el menu Collection seleccionamos en tipo enumerador, Enumerador de archivos.
4. Establecemos la carpeta Origen en la sección configuración de Enumeración. Para este ejemplo he dejado la ruta D:\Docs 
5. Si lo deseamos, marcamos la casilla de verificación Traverse Subcarpetas.

Si seguimos los pasos anteriores tendremos una configuración como lo muestra la siguiente imagen:


En la misma ventana, seleccionamos del menú izquierdo la opción Variable Mappings aquí seleccionamos la variable que habiamos creado.
Finalmente damos clic en Aceptar. 
En este punto ya tenemos configurado nuestro contenedor de bucles ForEach. Ahora agregamos un control File System Task a nuestro contenedor de bucles Foreach, debe quedar como se muestra en la imagen.

Foreach Loop Container

Para configurar seguimos los siguientes pasos:

1. Dar doble clic en el cuadro File System Task o clic derecho Edit.
2. En la ventana establecer IsDestinationPathVariable en False.
3. Configuramos la conexión destino, en la propiedad DestinationConnection
4. Seleccionamos la opción de nueva conexión.


5. En la ventana que aparece seleccionamos "Carpeta existente" o Existing folder.
6. Seguidamente, seleccionamos la carpeta de destino mediante "Examinar". Para este ejemplo seleccionamos D:\Destino

Dar clic en Ok para continuar la configuración.

7. Luego Seleccionamos la Operación, para este caso es Copiar archivos o Copy file.
8. Cambiamos a True la propiedad IsSourcePathVariable y seleccionamos la opción SourceVariable User::File

Quedando la parametrización para nuestro control de la siguente forma:


En la ventana damos clic en Ok. Ejecutamos nuestro proyecto (F5) y si todo nos sale bien debemos ver una imagen como la siguiente, además de verificar si los archivos fueron copiados de acuerdo a las rutas configuradas como Origen y Destino.


"" Si tienes dudas o quieras ampliar este artículo, lo puedes hacer dejando tus comentarios. Además, si lo consideras interesante puedes compartirlo con amigos y seguidores a través de los botones sociales que aparecen en esta página.""

Share:

11 comentarios:

  1. lo máximo man con tu explicación detallado se entendio, ahora dime este file system task puedo asociarlo a un flujo de datos para subir varios archivos.

    ResponderEliminar
  2. Hola Luis, gracias por tus comentarios, por supuesto que se puede, además con este ejemplo puedes subir o procesar varios archivos, ya que se están seleccionando de la carpeta origen (*.*) todos los que se encuentren en ella.

    ResponderEliminar
  3. yury muchas gracias por tu respuesta pronta, entonces en mi flujo de datos tendría que definir un source y destino para cada archivo de Excel que tengo dentro de una carpeta

    ResponderEliminar
  4. yury muchas gracias por tu respuesta, me sale un error, tengo que crear flujo de datos para cada archivo de Excel?

    ResponderEliminar
  5. Hola Luis, trata de crear este mismo ejemplo donde tengas una carpeta Origen (con varios tipos de archivos imágenes, documentos,etc) con archivos y otra carpeta Destino, para que puedas ver como se copian los archivos de un lado al otro. Luego que lo tengas funcionando, podemos modificar para especificar que tipo de archivo queremos mover, como en tu caso Excel.
    Me cuentas como te fue.

    ResponderEliminar
  6. necesito hace un cargue de diferentes tablas.. funciona???

    ResponderEliminar
  7. Hola anónimo, por su puesto que te sirve, pero dada tu pregunta corrígeme si me equivoco, necesitas cargar varias tablas con registros que se encuentran en archivos planos? Si lo anterior es así te comiendo mejor utilizar la funcionalidad que trae Sql llamada DtsWizard, me cuentas, saludos.

    ResponderEliminar
  8. Yuri cuando quiero hacer cargar masiva de archivos excel que tengo en una carpeta por meses ejemplo auto2015_01,auto2015_02 y hago un for each con variable me sale un error mensaje el motor base de datos jet no puede abrir el archivo. esta abierto en modo exclusivo por otro usuario o bien necesita permiso para ver sus datos

    ResponderEliminar
  9. Hola Luis Enrique, podrías antes de leer el archivo realizar una copia, trabajas con el y luego de cargarlo lo eliminas, parece que el sistema operativo te lo esta bloqueando, me cuentas si te sirvió

    Hasta pronto.

    ResponderEliminar
  10. Hola Luis, por favor me indicas como se debería configurar la tarea de Sistema de archivos cuando al trasladar los archivos si no existe la carpeta o directorio, debe crearla, estoy trabajando una variable definida como:"D:\Biblioteca\Mis Documentos\Documentos\MAT_Valores_Data\proc'\"+(DT_WSTR, 4) YEAR( getdate())+ (DT_WSTR, 2) MONTH( getdate()), pero no tengo claro en donde debería ir para que cree el directorio. Como la he probado me genera error. Mucahs gracias.

    ResponderEliminar
  11. Hay forma de que si lee 5 archivos la informacion de esos 5 me las guarde en una tabla de sql?

    ResponderEliminar