Continuando con la carga de datos en la tabla de hechos a través del paquete SSIS, tal y como dejamos pendiente en la anterior entrega, agruparemos todas las sentencias de inserción para las columnas de la tabla Ventas en el procedimiento almacenado spCargarDatosVentas, que incluiremos como una pieza más del contenedor Foreach Loop, y que podemos ver en el siguiente bloque de código.

CREATE PROCEDURE spCargarDatosVentas
@sAnualidad varchar(4)
AS
BEGIN
 
DECLARE @nNumFilasClientes AS int;
DECLARE @nPrimerClienteID AS int;
DECLARE @nNumFilasProductos AS int;
DECLARE @dtFechaInicio AS date;
DECLARE @dtFechaFin AS date;
DECLARE @nNumDiasAnualidad AS int;
 
SELECT 
@nNumFilasClientes = COUNT(*),
@nPrimerClienteID = MIN(ClienteID) 
FROM Cliente;
 
SET @nNumFilasProductos = (SELECT MAX(ProductoFilaID) FROM Producto);
 
SET @dtFechaInicio = @sAnualidad;
SET @dtFechaFin = EOMONTH(@dtFechaInicio,11);
SET @nNumDiasAnualidad = DATEDIFF(day,@dtFechaInicio,@dtFechaFin) + 1;
 
WITH
cteCalcularDatos AS (
    SELECT
    (ABS(CHECKSUM(NEWID())) % (@nNumFilasClientes)) + @nPrimerClienteID AS ClienteID,
    (ABS(CHECKSUM(NEWID())) % @nNumFilasProductos) + 1 AS ProductoFilaID,
    CONVERT(date,DATEADD(day,(ABS(CHECKSUM(NEWID())) % 
nNumDiasAnualidad),@dtFechaInicio)) AS Fecha
    FROM PadronOrigen
)
INSERT INTO Ventas 
WITH (TABLOCK)
(
ClienteID,
ProductoFilaID,
Fecha,
Importe
)
SELECT
cd.ClienteID,
cd.ProductoFilaID,
cd.Fecha,
p.Precio
FROM cteCalcularDatos AS cd
LEFT JOIN Producto AS p
ON cd.ProductoFilaID = p.ProductoFilaID;
 
END

 

Cada vez que concluya la ejecución de la tarea bulk_PadronOrigen del contenedor Foreach Loop, ejecutaremos este procedimiento mediante una tarea de tipo Ejecutar SQL, con el nombre sql_CargarDatosVentas, a la que asignaremos la conexión cnVentasAnuales en la propiedad Connection, y la siguiente sentencia en la propiedad SQLStatement, que se encargará de hacer la llamada al procedimiento almacenado.

EXECUTE spCargarDatosVentas ?

 

 

El símbolo de interrogación utilizado en la anterior sentencia, representa un marcador de posición para el parámetro @sAnualidad del procedimiento almacenado. En cada iteración del contenedor Foreach Loop, deberemos pasar a esta tarea sql_CargarDatosVentas, el año del archivo que acaba de ser cargado en la tabla PadronOrigen, para que, a su vez, la tarea lo pase al parámetro del procedimiento almacenado.

La forma de enviar el valor del año al procedimiento será mediante la creación de una nueva variable, a la que daremos el nombre sAnualidad, con tipo de dato String, y en la que añadiremos la siguiente expresión, que extraerá de la variable sArchivoPadron, el año que forma parte del nombre del archivo cargado.

LEFT(RIGHT(@[User::sArchivoPadron],8),4)

 

 

Volviendo al editor de la tarea Ejecutar SQL, en el apartado Parameter Mapping haremos clic en el botón Add, para añadir los datos de la variable que acabamos de crear, introduciendo los siguientes valores.

–Variable Name: User::sAnualidad. Nombre de la variable utilizada como parámetro. En este contexto, el nombre de la variable se compone de dos partes. User indica que se trata de una variable creada por el usuario, y sAnualidad es el nombre que hemos dado a la variable cuando la hemos creado.

–Direction: Input. Indica que se trata de un parámetro de entrada.

–Data Type. VARCHAR. El tipo de dato del parámetro.

–Parameter Name. 0. Cuando se trata de un procedimiento almacenado de SQL Server, se especifica el número de posición que ocupa el parámetro, empezado por cero.

–Parameter Size. 4. Tamaño del parámetro, que en este caso indica la cantidad de caracteres del mismo.

En tiempo de ejecución, el valor de esta variable será pasado al parámetro del procedimiento almacenado contenido en la propiedad SQLStatement.

 

Completadas estas opciones de configuración, la parte correspondiente a la carga de datos sobre la tabla de hechos estaría finalizada, concluyendo así la actual entrega de la serie.