Segunda Reunión

Segunda Reunión

(Tiempo Aprox 4hrs)

Simulación.

Una vez listo el llenado de datos básicos que debe implementar la base, lo cual se logro dejar montado y corriendo de forma correcta en la reunión pasada, es turno de implementar la simulación.

+ La simulación consiste en iterar sobre el XML Operaciones basandose en el atributo "Fecha" que  posee este archivo.

+Nos encontramos que dichas fechas vienen en desorden, así que para terminos de una simulación(iteración) efectiva desde la más antigua hasta la más reciente, cargamos estos archivos a una tabla temporal ordenado por fechas. Con esto ahora podemos iterar sobre la tabla registro por registro e ir actualizando el estado de la base.

+ Tras varias consultas con el profesor y compañeros se llegó a la idea para crear el sp de la simulación, donde se estába generando un registro en la tabla clienteXempresa por cada operación y tambien un registro en la tabla movimiento acción.

+ Para los updates y registros que se generan por agente en cada operación para dicha dinamica, se creó un sp que hace un trackeo en las operaciónes para saber de quién son las acciones que se están comprando por operación, esto para llevar el historico de "cambio de dueño" de las acciones.

+ Así ya podemos actualizar el estado de la BD con cada registro de la tabla Operaciones, que básicamente consiste en ir agregando registros a las tablas:
- ClienteXEmisor
-MovAccion
-TipoOperacion
- Agente
-MovComision
-TipoMovComision

 Es el siguiente:

ALTER PROCEDURE [dbo].[spTraceIdFromOperacion]
@idOperacion int,
@iDClienteVende int,
@iDEmpresa int output

as
begin
Set @idOperacion = @idOperacion - 1
while @iDClienteVende > 1020
begin
if(@idOperacion = 0)
begin
Set @iDClienteVende = -1
break
end
if((Select ClienteCompra from Operacion where ID = @idOperacion) = @iDClienteVende)
begin
Set @iDClienteVende = (Select ClienteVende from Operacion where ID = @idOperacion)
end

else
begin
Set @idOperacion = @idOperacion - 1
end
end

Set @iDEmpresa = @iDClienteVende

return @iDEmpresa

end

donde el sp busca en las operaciones anteriores cada vez que alguien compra las acciones hasta llegar a que alguien se las compra a una empresa, de ahí obtiene el id de la empresa y lo retorna luego de crear este sp se puede saber de cuál empresa son las acciones que se están tramitando por lo que se preocedió a crear el sp de la simulación


ALTER PROCEDURE [dbo].[spSimulacion]

as
begin
--Script para la simulación de ingreso de datos

--Se declara la variable con los datos del xml de datos de prueba
DECLARE @XML XML
SET @XML = (
  SELECT *
  FROM OPENROWSET(BULK 'C:\Users\casa\Desktop\Datos\Operaciones.xml', SINGLE_BLOB) AS data
)

DECLARE @handle INT
DECLARE @PrepareXmlStatus INT

EXEC @PrepareXmlStatus= sp_xml_preparedocument @handle OUTPUT, @XML
--Se termina cargar la variable del XML


--Se declaran variables tabla para iterar por los datos
DECLARE @TOperaciones table (Fecha date, QAccion int, ClienteCompra int, ClienteVende int, TipoOperacion int, Agente nchar(25))


--Se cargan los datos del xml a las variable tabla

INSERT @TOperaciones(Fecha, QAccion, ClienteCompra, ClienteVende, TipoOperacion, Agente)
SELECT Fecha, QAcciones, ClienteCompra, ClienteVende, TipoOperacion, Agente
FROM OPENXML(@handle, 'dataset/Operaciones') WITH (Fecha date, QAcciones int, ClienteCompra int, ClienteVende int, TipoOperacion int, Agente nchar(25))



--Se declaran tablas temporales para iterar en registros asociados a otra tabla



--Se declaran las variables a utilizar para iterar por fechas y por las tablas temporales
DECLARE @low1 date = (Select min(Fecha) from @TOperaciones)
DECLARE @high1 date = (Select max(Fecha) from @TOperaciones)



--Se itera por las fechas (dia por dia)


Delete from MovAccion where ID >= 0
Delete from ClienteXEmisor where ID >= 0
Delete from Operacion where ID >= 0
Delete from MovComision

DBCC CHECKIDENT
('dbo.Operacion', RESEED,0)
DBCC CHECKIDENT
('dbo.MovAccion', RESEED,0)
DBCC CHECKIDENT
('dbo.ClienteXEmisor', RESEED,0)

while @low1 <= @high1
BEGIN

insert Acciones.dbo.Operacion(ClienteCompra, ClienteVende, Fecha, QAccion, NombreAgente, Comision, TipoOperacion)
select ClienteCompra, ClienteVende, Fecha, QAccion, Agente, 0, TipoOperacion
from @TOperaciones where Fecha = @low1

Set @low1 = dateadd(day, 1, @low1)
END

--select * from Operacion

update Operacion
set Comision = Emisor.Comision from Emisor where Operacion.ClienteVende = Emisor.ID

DECLARE @min int = 1
DECLARE @max int = (select MAX(ID) from Operacion where Comision = 0)
DECLARE @iDempresa int = 0
DECLARE @idclientevende int = 0
DECLARE @result int

DECLARE @comisionPorOperacion float
DECLARE @precioAccion int
DECLARE @variacion int
DECLARE @idClienteXEmisor int
DECLARE @precioCalculado float
DECLARE @nombre nchar(25)
DECLARE @fecha date
DECLARE @idMovimientoComision int


while @min <= @max
begin



Set @idClienteVende = (Select ClienteVende from Operacion where ID = @min)

Exec @result = spTraceIdFromOperacion @min, @idClientevende, @iDempresa output

Set @comisionPorOperacion = (Select Comision from Emisor where ID = @iDempresa)

if((Select Comision from Operacion where ID = @min) = 0)
begin
Update Operacion
set Comision = @comisionPorOperacion where ID = @min
end


Set @precioAccion = (Select PrecioInicial from Emisor where ID = @iDempresa)
Set @variacion = (Select Variacion from Emisor where ID = @iDempresa)

Insert into ClienteXEmisor values
((Select ClienteCompra from Operacion where ID = @min),
(Select ClienteVende from Operacion where ID = @min),
(Select QAccion from Operacion where ID = @min))

Set @idClienteXEmisor = (Select max(ID) from ClienteXEmisor)


if((Select TipoOperacion from Operacion where ID = @min) = 1)
begin
Set @precioCalculado = (@precioAccion - @variacion) * (Select QAccion from Operacion where ID = @min)
end
else
begin
Set @precioCalculado = (@precioAccion + @variacion) * (Select QAccion from Operacion where ID = @min)
end

Insert into MovAccion values
((Select ID from Operacion where ID = @min),
@idClienteXEmisor,
(Select QAccion from Operacion where ID = @min),
@precioCalculado)




-- CALCULO DE SALDOD DE AGENTE --
set @nombre = (select NombreAgente from Operacion where ID = @min)
update Agente
set Saldo = Saldo + (@precioCalculado * (@comisionPorOperacion/100)) where Nombre = @nombre

-- SET de MovComision
set @fecha = (select Fecha from Operacion where ID =  @min)
insert MovComision (Fecha, Monto, NombreAgente) values (@fecha, (@precioCalculado * (@comisionPorOperacion/100)), @nombre)

Set @idMovimientoComision = (Select max(ID) from MovComision)

-- SET TipoMovimiento
insert TipoMovimientoComision (Tipo, IdMovComision) values((select TipoOperacion from Operacion where ID = @min), @idMovimientoComision)


Set @min = @min + 1
end

end



Al final del día se consultó algunas dudas con unos compañeros debido a que no veíamos cómo hacer el trackeo de las acciones al final de la simulación para generar las consultas. Y se llegó a la conclusión de que la simulación se había enfocado erroneamente debido a que por operación se debe generar n*2 registros en la tabla movimientoAccion y se deben restar y sumar en la tabla clienteXempresa las acciones que se están vendiendo y comprando, por lo que se procedió a comenzar a modificar el sp de la simulación, debido a como está montado el código modificarlo no está muy complicado porque ya se tienen los datos principales, sólo hay que hacer la iteración para generar los n*2 registros en movimientoAccion y hacer el update de los registros en clienteXempresa a las cantidades de  acciones que tiene cada cliente por cada empresa.

Debido a la hora se decidió continuar mañana.

















Comentarios

Entradas populares de este blog

Primera Reunión

Reporte Final