Tras la finalización, en el artículo anterior, del proceso de carga de la tabla Cliente, en la presente entrega nos ocuparemos de la tabla Producto. Al igual que ocurría con la tabla Cliente, añadiremos al paquete una tarea de tipo Flujo de datos, a la que daremos el nombre flw_Producto.

Editando este Flujo de datos, agregaremos un Origen de OLE DB con el nombre src_DimProduct, que utilice la conexión cnAdventureWorksDW2016.

 

En esta ocasión, en lugar de hacer una extracción de datos directa de una tabla, necesitamos obtener el resultado combinado de las siguientes: DimProduct, DimProductSubcategory y DimProductCategory. Como condiciones adicionales, la columna ListPrice, de la tabla DimProduct, deberá tener valor, así como la columna SpanishProductName, ya que nuestro objetivo es que todos los literales de producto, subcategoria y categoría se muestren en español. Para obtener este resultado, en la propiedad Data access mode seleccionaremos el valor SQL command, escribiendo en el recuadro SQL command text la siguiente sentencia:

SELECT
ps.ProductCategoryKey,
pc.SpanishProductCategoryName,
p.ProductSubcategoryKey,
ps.SpanishProductSubcategoryName,
p.ProductKey,
p.SpanishProductName,
p.ListPrice
FROM DimProduct AS p
INNER JOIN DimProductSubcategory AS ps
ON p.ProductSubcategoryKey = ps.ProductSubcategoryKey
INNER JOIN DimProductCategory AS pc
ON ps.ProductCategoryKey = pc.ProductCategoryKey
WHERE p.ListPrice IS NOT NULL
AND LEN(p.SpanishProductName) > 0

 

 

Después de aceptar la ventana de este editor, añadiremos al diseñador un Destino de OLE DB, con el nombre dest_Producto, al que conectaremos el Data Flow Path de src_DimProduct, y en cuya ventana de edición de propiedades asignaremos la conexión cnVentasAnuales. Como tabla destino de los datos elegiremos Producto, creando la correspondencia entre columnas que muestra la siguiente figura.

 

Al finalizar la edición del Destino de OLE DB y volver al diseñador del flujo de datos, encontraremos nuevamente el error de conversión de tipos que ya sufrimos con la tabla Cliente.

 

Pero esta vez, en lugar de solucionarlo mediante una transformación de tipo Conversión de datos, lo haremos empleando una técnica distinta, en la que, en primer lugar, modificaremos la sentencia SQL del origen src_DimProduct, utilizando la función CONVERT de Transact-SQL, para aplicar una conversión de tipo varchar a las columnas obtenidas del origen cuyo tipo es nvarchar.

SELECT
ps.ProductCategoryKey,
CONVERT(varchar(50),pc.SpanishProductCategoryName) AS SpanishProductCategoryName,
p.ProductSubcategoryKey,
CONVERT(varchar(50),ps.SpanishProductSubcategoryName) AS SpanishProductSubcategoryName,
p.ProductKey,
CONVERT(varchar(50),p.SpanishProductName) AS SpanishProductName,
p.ListPrice
FROM DimProduct AS p
INNER JOIN DimProductSubcategory AS ps
ON p.ProductSubcategoryKey = ps.ProductSubcategoryKey
INNER JOIN DimProductCategory AS pc
ON ps.ProductCategoryKey = pc.ProductCategoryKey
WHERE p.ListPrice IS NOT NULL
AND LEN(p.SpanishProductName) > 0

 

 

A continuación, abriremos el editor avanzado del origen src_DimProduct, posicionándonos en la pestaña Input and Output Properties, en la que desplegaremos los nodos Salida de origen de OLE DB y Output Columns. En la propiedad Data Type de las columnas SpanishProductCategoryName, SpanishProductSubcategoryName y SpanishProductName modificaremos el tipo actual DT_WSTR por DT_STR.

 

Una vez que guardemos los cambios de este editor, el error desaparecerá.

 

Para finalizar con la preparación de esta tabla, saldremos del diseñador Data Flow, volviendo hasta Control Flow, y en este último conectaremos la restricción de precedencia de flw_Cliente hasta flw_Producto.

 

Ejecutando de nuevo el paquete, conseguiremos que la tabla Producto también quede cargada con los datos obtenidos desde AdventureWorksDW2016.

 

Llegados a este punto, al revisar el contenido de la tabla Producto, es posible que el lector se pregunte acerca de la finalidad de la columna ProductoFilaID. Realmente, no parece tener mucho sentido su existencia, puesto que hemos podido resolver adecuadamente las combinaciones entre las tres tablas implicadas (DimProduct, DimProductSubcategory y DimProductCategory) en la tarea de rellenar con valores la tabla Producto.

La explicación a esta, aparentemente innecesaria columna, la encontramos en la necesidad de contar con un identificador numérico correlativo, que resultará imprescindible durante la generación aleatoria de datos para las columnas ProductoFilaID e Importe, de la tabla Ventas. La columna ProductoID, que sería la candidata natural a desempeñar esta labor, no cumple con este requisito, debido a que los criterios empleados en la sentencia de inserción de datos para la tabla Producto, explicada con anterioridad, provoca la existencia de valores discontinuos en dicha columna, de los cuales mostramos algunos ejemplos en la siguiente imagen.

 

Completada esta fase del desarrollo del paquete SSIS, finalizamos la presente entrega de la serie. En el próximo artículo abordaremos la carga de la tabla de hechos del modelo.