Es bastante usual tener que utilizar distintas configuraciones a la hora de ejecutar un mismo componente en un paquete ETL, por ejemplo: Si tenemos varios ficheros de texto que queremos cargar en un destino en el mismo proceso. Otro ejemplo bastante ilustrativo es la utilización de una tabla de valores para almacenar y extraer los datos de conexión para un fichero en un ftp. Normalmente, quien no ha trabajado con propiedades dinámicas se encuentra con algunas dificultades que intentaremos mencionar y resolver a través del último ejemplo.
Dinamizando propiedades: FTP Task
El escenario es el siguiente: necesitamos obtener de distintos servidores/rutas FTP algunos ficheros para almacenarlo en algún sitio.
La aproximación más bruta es agregar un componente por cada fichero a descargar y configurar sus propiedades específicas. Es perfectamente válido, pero imagina que tienes más de 100 ficheros que descargar y en el futuro puede ampliarse o variar la configuración de cada uno. Como digo, es posible y factible pero no práctico y fácil de mantener.
Escenario
Vamos a crearnos una tabla en SQL (o Excel o Access o un TXT, pero ya que vamos a hacerlo bien… un SQL ).
create table FTP_DownloadConfigurations ( idConfig int not null identity (1,1), DNS varchar(255), [Path] varchar(255), [File] varchar(255), [Created] datetime not null default(getdate()) ) |
Los campos que vamos a utilizar son DNS, Path y File para localizar el fichero a descargar y pasar como propiedades a la tarea FTP de SSIS.
Para este ejemplo he creado dos entradas en la tabla, accediendo a FTPs públicos:
Construyendo la base
Lo siguiente es armar el esqueleto de nuestro paquete:
Nos creamos una variable de tipo Object que llamamos Configuraciones o cómo os dé, pero lo importante es saber que aquí tendremos el recordset, el contenido de la tabla creada anteriormente.
También tendremos que añadir variables para recoger el valor de cada campo en el ForEach.Ojo con el ámbito de la variable, debe ser común a todos los componentes, en este caso, al menos la variable DNS debe ser del ámbito de todo el paquete ya que será necesario utilizarla para dinamizar la conexión FTP.
Obtener configuración dinámica
Configuramos el ExecuteSQL para que nos devuelva las filas de configuración que nos interesan, en nuestro ejemplo todas. Es importante configurar la opción ResultSet a Full Result Set.
Para terminar la configuración del componente nos movemos hasta la sección Result Set y establecemos la variable que va a recoger el resultado:
Configurar el Bucle
Pasemos al siguiente componente, el bucle foreach para recorrer el recordset. Abrimos el su editor y establecemos el tipo de foreach a Foeach ADO Enumerator. Seleccionamos también la variable Configuraciones que contiene el recordset.
En la sección Variable Mappings, asignamos las variables que que recogerán los campos del recordset: DNS, Path y File. Es importante respetar el orden de los campos, y configurarlos en el mismo en el que hemos realizado la consulta:
Configurando la Tarea FTP
En este componente haremos uso del resto de variables y hay que configurar las propiedades y expresiones para que tenga un comportamiento dinámico. Abrimos el editor del FTP Task y lo primero que nos solicita es una conexión FTP que no hemos creado. Pulsamos sobre Nueva Conexión
En el editor de la conexión FTP escribimos cualquier dirección FTP real o inventada, para que pueda validarse el formulario. Cuando hayamos pulsado aceptar, nos vamos al panel de Administradores de Conexiones, seleccionamos nuestra conexión FTP y pulsamos F4 para ver sus propiedades. Busca la propiedad Expressions y abre el formulario de asignación de expresiones pulsando el botón de los tres puntos…
Buscamos la propiedad Connection String y pulsamos sobre el botón editar […]. Asignamos la variable User::DNS
Y salimos de la configuración del administrador de conexión FTP para volver al componente Tarea FTP. La configuración de dinamización puede confundirse con el uso de variables para la configuración del componente. No es lo mismo configurar un componente para que tome un valor para una propiedad desde una variable que asignarle una expresión en función de una o múltiples variables. Las expresiones puede formarse por variables, pero no sólo por ellas.
Para entender la diferencia, vamos a crearnos otra variable que llamamos LocalPath de ámbito del contenedor de secuencias y le establecemos el valor c:\temp o cualquier otra ruta dónde queramos descargar los ficheros.
En la configuración del FTP Task, en la sección File Transfer configuramos las propiedades según la siguiente tabla:
Propiedad | Valor |
IsLocalPathVariable | True |
LocalVariable | User::LocalPath |
Operation | Receive Files |
IsRemotePathVariable | False |
RemotePath | /pub/mozilla.org/firefox/nightly/latest-mozilla-central/firefox-4.0b9pre.en-US.win32.installer.exe |
Si se dan cuenta, la propiedad IsLocalPathVariable la hemos configurado para que tome el valor de la variable LocalPath. Por el contrario el path remoto lo hemos escrito.
Accedamos a la sección Expressions. Editamos la expresión para la propiedad RemotePath = User::Path + User::File.
¿Qué pasaría si también configuramos la propiedad LocalPath desde expresiones? Devolvería un error diciendo que no encuentra la variable con nombre de variable con el contenido de nuestra variable LocalPath, en nuestro caso c:\temp…..
Ultimando detalles
Sólo queda configurar la propiedad DelayValidation del FTP Task y del administrador conexión FTP a True para que no intente probar la conexión antes de ejecutar.
Y a correr!
Si no les queda claro algo, coméntenlo y lo vemos.
Saludos!
Hola tengo un caso similar pero para cargar varios access en una misma carpeta pero con el mismo nombre de tabla, mi correo es egalab@hotmail.com .
ResponderEliminarGracias.
Estimado, déjame agradecerte me ha servido mucho tu tutorial; lo estoy probando y esta todo ok (no sabes como me dolió la cabeza con el colorcito rojo). Espero sigas con esto del BI para seguir aprendiendo mucho mas.
ResponderEliminarSaludos