Anda di halaman 1dari 7

SSIS Cargando archivos Excel

Siempre hay quienes comienzan a hacer algo nuevo y este post est dedicado a estas personas, en concreto a Claudio. Un compaero de los foros de Integration Services en castellano que se preguntaba como poda conseguir resolver su proceso mediante paquetes ETL de SSIS.

Escenario
el asunto es que yo tengo una consulta, esta consulta me trae unos datos los cuales los tengo que poner en un excel con la fecha de la generacion y enviarlo a una persona, la idea es crear un paquete que permita mediante algun proceso crear el archivo excel con el nombre del dia(ejemplo ventas_19-06-2012.xls), mas que nada seria para automatizar un par de tareas que debo realizar diariamente

Una Solucin
Por que siempre hay varios caminos para llegar al mismo sitio. Para este caso he sugerido utilizar una plantilla de libro Excel como destino de datos, que vamos a copiar con una tarea File System para generar un nuevo archivo con la fecha de la consulta que ser el destino de los datos obtenidos mediante la misma (consulta) Vamos con los detalles Es nuestro paquete ETL aadimos un DataFlow, con un origen OLEDB source con la consulta que vamos a realizar contra el origen de datos. Para esta entrada utilizar la base de datos AdventureWorks para realizar esta consulta: SELECT [ProductID],[Name],[ProductNumber],[MakeFlag],[FinishedGoodsFlag],[Color] FROM [Production].[Product] En el archivo Excel que vamos a utilizar como plantilla creamos las columnas necesarias para mapear con los datos de origen:

Hay que tener clara la versin de Excel a utilizar, dependiendo de esto podremos utilizar el componente Excel Destination (hasta Excel 2007) o nos veremos obligados a utilizar OLEDB Destination en caso de Excel 2010. En este caso la versin es 2007.

Aadimos un componente Excel Destination. Conectamos la salida de datos del OLEDB Source a la entrada del destino Excel y editamos este componente para establecer el archivo destino y el mapeo de datos. Creamos una nueva conexin que apuntamos al archivo plantilla:

Una vez finalizada la conexin realizamos el mapeo de datos entre las columnas del origen de datos y el archivo Excel:

Y finalizamos la edicin del componente de destino. Hasta ahora fcil, no hemos hecho nada especial para generar archivos dinmicamente en funcin de la fecha pero hemos conseguido establecer los metadatos que necesitan los componentes en el flujo de datos. En las propiedades de este componente (en el panel de propiedades, F4 teniendo seleccionado el componente Excel Destination), hay que cambiar la propiedad ValidateExternalMetadata a false. Es importante este cambio para poder ejecutar el paquete sin que exista previamente el archivo sobre el que vamos a volcar los datos:

El siguiente paso es cambiar algunas propiedades en el administrador de conexin del archivo Excel, en concreto vamos a poner la atencin en Delay Validation, que vamos a establecer a True. Observar la propiedad ExcelFilePath, que modificaremos ms adelante mediante una variable que proporcionar el nombre de fichero para cada ejecucin a travs de Expressions:

Nos volvemos a la pestaa de ControlFlow y creamos una variable para generar el nombre del archivo en cada ejecucin. Para esto hay que asegurarse de que tenemos seleccionado el lienzo y no el componente DataFlow que aadimos antes, para que el mbito de esta variable sea del alcance de todo el paquete. Para acceder al panel de variables puede hacer clic derecho sobre el lienzo y seleccionar la opcin variables. Crearemos la variable vNombreArchivo de tipo string y sin asignacin de valor:

Seleccionamos la variable y pulsamos F4 para mostrar su panel de propiedades. En la propiedadEvaluateAsExpression seleccionamos el valor True y en Expressions vamos a aadir una expresin que conformar el valor de esta variable

En el editor de expresiones generamos una para construir un nombre de fichero en funcin de la fecha de proceso. Yo he utilizado la siguiente: ?

1+ datepart("hh",@[System::StartTime] ) * 100 + datepart("mi",@[System::StartTime] )

"C:\\Consultas2Excel\\Consulta_" + (DT_STR,20,1252) ( (DT_I8) (YEAR( @[System::StartTime )

Ya tenemos un nombre dinmico para nuestro fichero destino. Ahora solo falta que ese fichero exista y lo vamos a conseguir con una tarea File System Task que aadimos al ControlFlow y establecemos restricciones de precedencia, conectando la salida de ejecucin correcta de File System Task con el DataFlow que ya tenamos:

Editamos la tarea File System para modificar sus propiedades. Lo primero es asegurar que la operacin es Copy File. Establecemos los siguientes valores por propiedad

Propiedad Operation IsDestinationPathVariable OverwriteDestination IsSourcePathVariable SourceConnection

Valor Copy File True (evaluar la necesidad de sobreescribir el archivo de destino si existe en la opera False (Nueva conexin a nuestro archivo plantilla) c:\PlantillaDestino

En el panel de conexiones, buscamos la conexin a Excel que utiliza nuestro destino en el DataFlow y accedemos a las propiedades, en concreto Expressions y aadimos una expresin para la propiedadExcelFilePath. Escribimos @[User::vNombreArchivo]

Y listo!

Ya tenemos un paquete que lee datos de una consulta y lo vuelca en un fichero Excel nuevo que genera en cada ejecucin:

Conclusin

Como tambin vimos en la entrada SSIS Dinamizando propiedades de componentes , el uso de variables facilita en gran medida operaciones de asignacin dinmica de propiedades de componentes, tareas, DataFlow, ControlFlow Adems, podramos utilizar configuraciones de paquetes (en package deployment model) o parmetros y entornos (project deployment model) para exponer estas variables y asignarles valor previa ejecucin del paquete.

Si tienes cualquier duda o quieres obtener el paquete ETL desarrollado durante esta entrada, deja un comentario.

Anda mungkin juga menyukai