Modificacion del ingreso de datos y finaiizacion de documentacion
El día de hoy se trabajó en el trabajo escrito y la modificación de la carga de datos, agregando un proceso iterativo en la inserción de movimientos de empleados, se utilizó una tabla variable para crear esta función. Además, se terminó la documentación. El trabajo fue de 2 horas.
-- 7. Movimiento
DECLARE @TempMov TABLE ( -- Se usa tabla variable para recorrer los movimientos uno por uno
Fila INT IDENTITY(1,1)
,ValorDocId VARCHAR(64)
,TipoMov VARCHAR(64)
,Fecha DATE
,Monto MONEY
,PostByUser VARCHAR(64)
,PostInIP VARCHAR(64)
,PostTime DATETIME
)
-- Carga los movimientos del XML ordenados por fecha ascendente
INSERT INTO @TempMov (ValorDocId, TipoMov, Fecha, Monto, PostByUser, PostInIP, PostTime)
SELECT
x.value('@ValorDocId', 'VARCHAR(64)')
,x.value('@TipoMov', 'VARCHAR(64)')
,x.value('@Fecha', 'DATE')
,x.value('@Monto', 'MONEY')
,x.value('@PostByUser', 'VARCHAR(64)')
,x.value('@PostInIP', 'VARCHAR(64)')
,x.value('@PostTime', 'DATETIME')
FROM @xml.nodes('/Datos/Movimientos/movimiento') AS t(x)
ORDER BY x.value('@Fecha', 'DATE') ASC
DECLARE @i INT = 1
DECLARE @total INT
SELECT @total = COUNT(*)
FROM @TempMov
DECLARE @vDocId VARCHAR(64)
DECLARE @vTipoMov VARCHAR(64)
DECLARE @vMonto MONEY
DECLARE @vPostByUser VARCHAR(64)
DECLARE @vPostInIP VARCHAR(64)
DECLARE @vPostTime DATETIME
DECLARE @vFecha DATE
DECLARE @vIdEmpleado INT
DECLARE @vIdTipoMov INT
DECLARE @vIdUsuario INT
DECLARE @vTipoAccion VARCHAR(64)
DECLARE @vSaldoActual MONEY
DECLARE @vSaldoNuevo MONEY
WHILE (@i <= @total) -- Recorre cada movimiento en orden cronológico
BEGIN
SELECT @vDocId = ValorDocId
,@vTipoMov = TipoMov
,@vMonto = Monto
,@vPostByUser = PostByUser
,@vPostInIP = PostInIP
,@vPostTime = PostTime
,@vFecha = Fecha
FROM @TempMov
WHERE (Fila = @i)
SELECT @vIdEmpleado = e.Id
,@vSaldoActual = e.SaldoVacaciones
FROM dbo.Empleado AS e
WHERE (e.ValorDocumentoIdentidad = @vDocId)
SELECT @vIdTipoMov = tm.Id
,@vTipoAccion = tm.TipoAccion
FROM dbo.TipoMovimiento AS tm
WHERE (tm.Nombre = @vTipoMov)
SELECT @vIdUsuario = u.Id
FROM dbo.Usuario AS u
WHERE (u.Username = @vPostByUser)
IF (@vTipoAccion = 'Credito') -- Calcula el nuevo saldo según el tipo de acción
BEGIN
SET @vSaldoNuevo = @vSaldoActual + @vMonto
END
ELSE
BEGIN
SET @vSaldoNuevo = @vSaldoActual - @vMonto
IF (@vSaldoNuevo < 0)
BEGIN
SET @vSaldoNuevo = 0
END
END
INSERT INTO dbo.Movimiento (
IdEmpleado
,IdTipoMovimiento
,Fecha
,Monto
,NuevoSaldo
,IdPostByUser
,PostInIP
,PostTime
)
VALUES (
@vIdEmpleado
,@vIdTipoMov
,@vFecha
,@vMonto
,@vSaldoNuevo
,@vIdUsuario
,@vPostInIP
,@vPostTime
)
UPDATE dbo.Empleado
SET SaldoVacaciones = @vSaldoNuevo
WHERE (Id = @vIdEmpleado)
SET @i = @i + 1
END
SELECT * FROM dbo.Empleado
SELECT * FROM dbo.Movimiento
Comments
Post a Comment