SPs del R4 completados
Tardé aproximadamente 5 horas en completar el SP de eliminar empleado y el SP de actualizar empleado. Me queda pendiente si tengo tiempo mandárselo al profe para que me de un visto bueno o retroalimentación. Pero en buena teoría así quedarían:
SP: eliminar empleado
CREATE PROCEDURE dbo.procEliminarEmpleado
@inUsername VARCHAR(64) -- Nombre de usuario que intenta hacer la eliminación
,@inPostInIP VARCHAR(64) -- IP del usuario que intenta hacer la eliminación
,@inValorDocumentoIdentidad VARCHAR(64) -- Valor para identificar al empleado a eliminar
,@inConfirmacionEliminacion BIT -- Confirmación de eliminación (1 si fue confirmado, 0 si fue cancelado)
,@outResultCode INT OUTPUT
AS
BEGIN
SET NOCOUNT ON
-- Variables para la bitacora de eventos
DECLARE @NombreEmpleado VARCHAR(64)
DECLARE @NombrePuestoEmpleado VARCHAR(64)
DECLARE @SaldoVacacionesEmpleado MONEY
DECLARE @DescripcionEvento VARCHAR(256)
DECLARE @IdUsuario INT -- ID del usuario que realiza la eliminación
DECLARE @IdTipoEvento INT -- ID del tipo de evento para la bitacora (9 = intento de borrado, 10 = eliminacion confirmada)
SET @outResultCode = 0;
BEGIN TRY
-- Obtener los datos del empleado a eliminar para la bitacora
SELECT @NombreEmpleado = e.Nombre
,@NombrePuestoEmpleado = p.Nombre
,@SaldoVacacionesEmpleado = e.SaldoVacaciones
FROM dbo.Empleado AS e
INNER JOIN dbo.Puesto AS p ON (e.IdPuesto = p.Id)
WHERE (e.ValorDocumentoIdentidad = @inValorDocumentoIdentidad);
SELECT @IdUsuario = u.Id
FROM dbo.Usuario AS u
WHERE (u.Username = @inUsername)
IF (@inConfirmacionEliminacion = 0)
BEGIN
SET @IdTipoEvento = 9; -- Intento de borrado
END
ELSE
BEGIN
SET @IdTipoEvento = 10; -- Eliminación confirmada
END
SET @DescripcionEvento = @inValorDocumentoIdentidad + ' - ' + @NombreEmpleado + ' - ' + @NombrePuestoEmpleado + ' - ' + CAST(@SaldoVacacionesEmpleado AS VARCHAR(32));
BEGIN TRANSACTION
IF (@inConfirmacionEliminacion = 1)
BEGIN
-- Si fue confirmado hay que cambiar el estado del empleado en EsActivo a 0
UPDATE e
SET e.EsActivo = 0
FROM dbo.Empleado AS e
WHERE (e.ValorDocumentoIdentidad = @inValorDocumentoIdentidad);
END
-- Sea cual sea el caso hay que insertar el evento en la bitacora
INSERT INTO dbo.BitacoraEvento (
IdTipoEvento
,Descripcion
,IdPostByUser
,PostInIP
,PostTime
)
VALUES(
@IdTipoEvento
,@DescripcionEvento
,@IdUsuario
,@inPostInIP
,GETDATE()
)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
INSERT INTO dbo.DBError(
UserName
,Number
,State
,Severity
,Line
,[Procedure]
,Message
,DateTime
)
VALUES(
@inUsername
,ERROR_NUMBER()
,ERROR_STATE()
,ERROR_SEVERITY()
,ERROR_LINE()
,ERROR_PROCEDURE()
,ERROR_MESSAGE()
,GETDATE()
)
SET @outResultCode = 50008;
END CATCH
END
SP: actualizar empleado
CREATE PROCEDURE dbo.procActualizarEmpleado
@inValorDocumentoIdentidadAnterior VARCHAR(64) -- Esta variable es para identificar al que se va a editar
,@inValorDocumentoIdentidadNuevo VARCHAR(64)
,@inNombre VARCHAR(64)
,@inIdPuesto INT
,@inUsername VARCHAR(64)
,@inPostInIP VARCHAR(64)
,@outResultCode INT OUTPUT
AS
BEGIN
SET NOCOUNT ON
-- Lo que tiene que contener la descripción de la bitácora
DECLARE @DescripcionError VARCHAR(64)
DECLARE @NombreAnterior VARCHAR(64)
DECLARE @NombrePuestoAnterior VARCHAR(64)
DECLARE @NombrePuestoNuevo VARCHAR(64)
DECLARE @SaldoVacaciones MONEY -- No es editable pero se muestra
DECLARE @NombreExistente VARCHAR(64)
DECLARE @ValorDocIdExistente VARCHAR(64)
DECLARE @IdTipoEvento INT
DECLARE @IdUsuario INT
DECLARE @DescripcionEvento VARCHAR(256)
SET @outResultCode = 0;
BEGIN TRY
IF (@inValorDocumentoIdentidadNuevo LIKE '%[^0-9]%')
BEGIN
SET @outResultCode = 50010;
END
ELSE IF (@inNombre LIKE '%[^a-zA-Z ]%')
BEGIN
SET @outResultCode = 50009;
END
SELECT @IdUsuario = u.Id
FROM dbo.Usuario AS u
WHERE (u.Username = @inUsername);
-- Obtener los valores del anterior en base a @inValorDocumentoIdentidadAnterior
SELECT @NombreAnterior = e.Nombre
,@NombrePuestoAnterior = p.Nombre
,@SaldoVacaciones = e.SaldoVacaciones
FROM dbo.Empleado AS e
INNER JOIN dbo.Puesto AS p ON (e.IdPuesto = p.Id)
WHERE (e.ValorDocumentoIdentidad = @inValorDocumentoIdentidadAnterior);
-- Obtener el nombre del puesto nuevo mediante @inIdPuesto
SELECT @NombrePuestoNuevo = p.Nombre
FROM dbo.Puesto AS p
WHERE (p.Id = @inIdPuesto);
IF (@outResultCode = 0)
BEGIN
-- Validar documento duplicado (ignorando el que estoy editanto mediante el Documento Identidad)
SELECT @ValorDocIdExistente = e.ValorDocumentoIdentidad
FROM dbo.Empleado AS e
WHERE (e.ValorDocumentoIdentidad = @inValorDocumentoIdentidadNuevo)
AND (e.ValorDocumentoIdentidad <> @inValorDocumentoIdentidadAnterior);
-- Validar nombre duplicado (ignorando el que estoy editanto mediante el Documento Identidad)
SELECT @NombreExistente = e.Nombre
FROM dbo.Empleado AS e
WHERE (e.Nombre = @inNombre)
AND (e.ValorDocumentoIdentidad <> @inValorDocumentoIdentidadAnterior);
IF (@ValorDocIdExistente IS NOT NULL)
BEGIN
SET @outResultCode = 50006
END
ELSE IF (@NombreExistente IS NOT NULL)
BEGIN
SET @outResultCode = 50007
END
END
SELECT @DescripcionError = er.Descripcion
FROM dbo.Error AS er
WHERE (er.Codigo = @outResultCode);
-- Armar la descripción de evento
IF (@DescripcionError IS NOT NULL)
BEGIN
SET @IdTipoEvento = 7;
SET @DescripcionEvento = @DescripcionError +
'Antes: ' + @inValorDocumentoIdentidadAnterior +
@NombreAnterior +
@NombrePuestoAnterior +
'Después: ' + @inValorDocumentoIdentidadNuevo +
@inNombre +
@NombrePuestoNuevo +
'Saldo Vacaciones: ' + CAST(@SaldoVacaciones AS VARCHAR(64));
END
ELSE
BEGIN
SET @IdTipoEvento = 8;
SET @DescripcionEvento = 'Antes: ' + @inValorDocumentoIdentidadAnterior +
@NombreAnterior +
@NombrePuestoAnterior +
'Después: ' + @inValorDocumentoIdentidadNuevo +
@inNombre +
@NombrePuestoNuevo +
'Saldo Vacaciones: ' + CAST(@SaldoVacaciones AS VARCHAR(64));
END
BEGIN TRANSACTION
-- Si no hubo error en la bitácora
IF (@outResultCode = 0)
BEGIN
UPDATE e
SET e.IdPuesto = @inIdPuesto
,e.ValorDocumentoIdentidad = @inValorDocumentoIdentidadNuevo
,e.Nombre = @inNombre
FROM dbo.Empleado AS e
WHERE (e.ValorDocumentoIdentidad = @inValorDocumentoIdentidadAnterior)
END
-- Insertar dentro de la bitácora de eventos
INSERT INTO dbo.BitacoraEvento(
idTipoEvento
,Descripcion
,IdPostByUser
,PostInIP
,PostTime
)
VALUES(
@IdTipoEvento
,@DescripcionEvento
,@IdUsuario
,@inPostInIP
,GETDATE()
)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
INSERT INTO dbo.DBError(
UserName
,Number
,State
,Severity
,Line
,[Procedure]
,Message
,DateTime
)
VALUES(
@inUsername
,ERROR_NUMBER()
,ERROR_STATE()
,ERROR_SEVERITY()
,ERROR_LINE()
,ERROR_PROCEDURE()
,ERROR_MESSAGE()
,GETDATE()
)
SET @outResultCode = 50008;
END CATCH
END
Faltaría la conexión con el Backend y Frontend, además de testeos junto a mi compañero de trabajo
Comments
Post a Comment