Entrada 3 (SPs insertar y obtener)

Fecha: 16/04/2026

Inicio: 8:00| Fin: 10:00|| Total: [2 horas]

Presentes: Matías Benavides Sandoval 

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
¿QUÉ HICIMOS HOY?
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Se implemento y revisaro los SP de movimientos:

  • sp_GetMovimientos para listar movimientos por documento de identidad.
  • sp_InsertMovimiento con validación de saldo negativo y actualización de saldo en empleado.

Se incorporaron cambios de estándar según respuesta del profesor:

  • Cambio de idPostByUser a idUsuario.
  • Cambio de PostInIP a IpPostIn.
  • Confirmación de que SaldoVacaciones inicia en 0.
  • Confirmación de que ValorDocumentoIdentidad es varchar.
  • Confirmación de uso de [Procedure] en DBError.

Se verificó en SSMS que las columnas ya quedaron renombradas correctamente en tablas BitacoraEvento y Movimiento.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PROBLEMAS ENCONTRADOS Y CÓMO SE RESOLVIERON
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Ya que no se probaron los SPs que hice hoy (Lo siento profe no me dio tiempo, queda para la siguiente sesion probarlos y ver si funcionan) no me dio nada ningun error al menos en ls SPs

Varios errores a la hora de renombrar a el estandar el profe
varios (0 columnas afectadas)  y de que escirbi mal varias cosas

Mensaje 15248, nivel 11, estado 1, procedimiento sp_rename, línea 269 [línea de inicio de lote 2]

Either the parameter @objname is ambiguous or the claimed @objtype (COLUMN) is wrong.

Mensaje 15248, nivel 11, estado 1, procedimiento sp_rename, línea 269 [línea de inicio de lote 2]

Either the parameter @objname is ambiguous or the claimed @objtype (COLUMN) is wrong.

Mensaje 15248, nivel 11, estado 1, procedimiento sp_rename, línea 269 [línea de inicio de lote 2]

Either the parameter @objname is ambiguous or the claimed @objtype (COLUMN) is wrong.

Mensaje 15248, nivel 11, estado 1, procedimiento sp_rename, línea 269 [línea de inicio de lote 2]

Either the parameter @objname is ambiguous or the claimed @objtype (COLUMN) is wrong.


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
DUDAS Y DIVERGENCIAS DE CRITERIO
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Se aclaró con el profesor:

  • Errores de “nombre no alfabético” y “cédula no numérica” aplican a inserción/edición de empleado, no al filtro.
  • El parser XML queda opcional hasta confirmación del profesor,  no bloquea el avance asi que se planea continuar sin mas problemas

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
AVANCE DEL CÓDIGO
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Se avanzo en la parte de movimientos:

  • SP de consulta de movimientos listo.
    USE VacacionesDB;
    GO

    -- =====================================================
    -- SP 1: Obtener todos los movimientos de vacaciones
    -- =====================================================
    DROP PROCEDURE IF EXISTS sp_GetMovimientos;
    GO

    CREATE PROCEDURE sp_GetMovimientos
        @ValorDocumentoIdentidad VARCHAR(32),
        @outResultCode INT OUTPUT
    AS
    BEGIN
        SET NOCOUNT ON;

        BEGIN TRY
            SELECT
                m.id,
                m.idEmpleado,
                e.Nombre AS NombreEmpleado,
                e.ValorDocumentoIdentidad,
                m.idTipoMovimiento,
                tm.Nombre AS NombreTipoMovimiento,
                tm.TipoAccion,
                m.Monto,
                m.NuevoSaldo,
                m.Fecha,
                m.PostTime,
                m.IpPostIn,
                u.Username AS UsuarioRegistro
            FROM Movimiento m
            INNER JOIN Empleado e ON m.idEmpleado = e.id
            INNER JOIN TipoMovimiento tm ON m.idTipoMovimiento = tm.id
            INNER JOIN Usuario u ON m.idUsuario = u.id
            WHERE e.ValorDocumentoIdentidad = @ValorDocumentoIdentidad
            ORDER BY m.Fecha DESC, m.PostTime DESC;

            SET @outResultCode = 0;
        END TRY
        BEGIN CATCH
            SET @outResultCode = 50008;
        END CATCH
    END;
  • SP de inserción con transacción, validaciones y bitácora listo (pendiente probar)
    USE VacacionesDB;
    GO

    -- =====================================================
    -- SP 2: Insertar movimiento de vacaciones
    -- =====================================================
    DROP PROCEDURE IF EXISTS sp_InsertMovimiento;
    GO

    CREATE PROCEDURE sp_InsertMovimiento
        @ValorDocumentoIdentidad VARCHAR(32),
        @NombreTipoMovimiento VARCHAR(64),
        @Monto DECIMAL(10,2),
        @Username VARCHAR(64),
        @IpPostIn VARCHAR(32),
        @PostTime DATETIME,
        @Fecha DATE,
        @outResultCode INT OUTPUT
    AS
    BEGIN
        SET NOCOUNT ON;
        SET XACT_ABORT ON;

        DECLARE @IdEmpleado INT;
        DECLARE @IdTipoMovimiento INT;
        DECLARE @idUsuario INT;
        DECLARE @TipoAccion VARCHAR(64);
        DECLARE @SaldoActual DECIMAL(10,2);
        DECLARE @NuevoSaldo DECIMAL(10,2);
        DECLARE @DescripcionBitacora VARCHAR(512);

        BEGIN TRY
            SELECT @idUsuario = u.id
            FROM Usuario u
            WHERE u.Username = @Username;

            IF @idUsuario IS NULL
            BEGIN
                SET @outResultCode = 50001;
                RETURN;
            END;

            SELECT @IdEmpleado = e.id,
                    @SaldoActual = e.SaldoVacaciones
            FROM Empleado e
            WHERE e.ValorDocumentoIdentidad = @ValorDocumentoIdentidad
                AND e.EsActivo = 1;

            IF @IdEmpleado IS NULL
            BEGIN
                SET @outResultCode = 50008;
                RETURN;
            END;

            SELECT @IdTipoMovimiento = tm.id,
                    @TipoAccion = tm.TipoAccion
            FROM TipoMovimiento tm
            WHERE tm.Nombre = @NombreTipoMovimiento;

            IF @IdTipoMovimiento IS NULL
            BEGIN
                SET @outResultCode = 50008;
                RETURN;
            END;

            IF @TipoAccion = 'Credito'
                SET @NuevoSaldo = @SaldoActual + @Monto;
            ELSE IF @TipoAccion = 'Debito'
                SET @NuevoSaldo = @SaldoActual - @Monto;
            ELSE
            BEGIN
                SET @outResultCode = 50008;
                RETURN;
            END;

            IF @NuevoSaldo < 0
            BEGIN
                SET @outResultCode = 50011;
                RETURN;
            END;

            SET @DescripcionBitacora = 'Intento de insertar movimiento para el empleado con documento ' + @ValorDocumentoIdentidad;

            INSERT INTO BitacoraEvento (idTipoEvento, Descripcion, idUsuario, IpPostIn, PostTime)
            VALUES (13, @DescripcionBitacora, @idUsuario, @IpPostIn, @PostTime);

            BEGIN TRANSACTION;

                INSERT INTO Movimiento (idEmpleado, idTipoMovimiento, Fecha, Monto, NuevoSaldo, idUsuario, IpPostIn, PostTime)
                VALUES (@IdEmpleado, @IdTipoMovimiento, @Fecha, @Monto, @NuevoSaldo, @idUsuario, @IpPostIn, @PostTime);

                UPDATE Empleado
                SET SaldoVacaciones = @NuevoSaldo
                WHERE id = @IdEmpleado;

                SET @DescripcionBitacora = 'Insertar movimiento exitoso para el empleado con documento ' + @ValorDocumentoIdentidad;

                INSERT INTO BitacoraEvento (idTipoEvento, Descripcion, idUsuario, IpPostIn, PostTime)
                VALUES (14, @DescripcionBitacora, @idUsuario, @IpPostIn, @PostTime);

            COMMIT TRANSACTION;

            SET @outResultCode = 0;
        END TRY
        BEGIN CATCH
            IF @@TRANCOUNT > 0
                ROLLBACK TRANSACTION;

            INSERT INTO DBError ([UserName], [Number], [State], [Severity], [Line], [Procedure], [Message], [DateTime])
            VALUES (
                @Username,
                ERROR_NUMBER(),
                CAST(ERROR_STATE() AS VARCHAR(32)),
                CAST(ERROR_SEVERITY() AS VARCHAR(32)),
                ERROR_LINE(),
                ISNULL(ERROR_PROCEDURE(), 'sp_InsertMovimiento'),
                ERROR_MESSAGE(),
                GETDATE()
            );

            SET @outResultCode = 50008;
        END CATCH
    END;

  • Scripts y consultas alineados al nuevo estándar de nombres (idUsuario, IpPostIn).

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
MORALEJAS / BUENAS PRÁCTICAS
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Primero validar estándar de nombres con el profesor evita retrabajo en toda la capa SQL, haber preguntado antes y esperar la respuesta antes de empezar.
Después de cada cambio importante, verificar columnas reales en SSMS antes de seguir con SPs, por que uno se equivoca y escribe algo mal y de repente nada tiene el nombre que en teoria deberia tener.
Un errorde sintaxis puede bloquear todo, hay que revisar muy el nombre de las cosas.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PRÓXIMA SESIÓN: ¿QUÉ SIGUE?
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Ejecutar pruebas controladas

Ejecutar los SPs a ver si no hay ningun error 

 

Comentarios

Entradas más populares de este blog

Entrada 16 (Controlador de movimientos)

Entrada 20 (Lógica de insertarMovimientos, conectarla y probarla)

Entrada 21 (Análisis de resultados)