sábado, 26 de octubre de 2019

Cambios con respecto a la 2da tarea programada y adición de cuentas objetivo en la simulación

Con respecto a la versión del stored procedure de simulación de la 2da tarea programada se realizaron los siguientes cambios:

1- Se agregó la tabla variable @CuentasObjetivo para procesar las cuentas objetivo provenientes del XML de simulación.

DECLARE @CuentasObjetivo TABLE
       (
       id int identity(1,1),
       NumeroDeCuenta nvarchar(50),
       FechaInicial date,
       FechaFinal date,
       DescripcionObjetivo nvarchar(100),
       MontoAhorrar money
       )

2- Siguiendo la misma estructura de ingreso de datos a las tablas de las operaciones anteriores, se crea el ciclo que se encarga de ingresar las cuentas objetivos por cada fecha de operación. Para ello se cargan primero todas las cuentas objetivo en la tabla variable creada (@CuentasObjetivo) y luego con un valor @lo (el mínimo de la tabla variable) y un valor @hi (el máximo de la tabla variable) se recorren los valores ingresados a la tabla variable para ir insertándolos a la verdadera tabla CuentaObjetivo. Además se sigue la buena práctica de incluir todo dentro de un transaction.

SET @lo = (SELECT COUNT(CO.id) FROM @CuentasObjetivo CO) + 1


               INSERT INTO @CuentasObjetivo
               SELECT Tab.Col.value('@NumeroDeCuenta','nvarchar(50)'),
                          @fechaIteracion,
                          Tab.Col.value('@FechaFinal','date'),
                          Tab.Col.value('@DescripcionObjetivo','nvarchar(100)'),
                          Tab.Col.value('@MontoAhorrar','money')

               FROM @temp.nodes('FechaOperacion/CO') Tab(Col)

               SET @hi = (SELECT COUNT(CO.id) FROM @CuentasObjetivo CO)

               BEGIN TRY

                       IF @@TRANCOUNT = 0

                       BEGIN

                               SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

                               BEGIN TRANSACTION AgregarCuentasObjetivo

                               SET @InicioTran = 1

                       END

                       WHILE @lo <= @hi

                       BEGIN

                               -- Se inserta cada cuenta objetivo leida desde el archivo xml para la fecha de operacion actual
                               INSERT INTO CuentaObjetivo (idCuenta, Saldo, Fecha_Inicio, Fecha_Final, Fecha_Proximo_Credito, Monto_Ahorro, Numero_Cuenta, Descripcion, Activo)

                               SELECT CA.id, 0, CO.FechaInicial, CO.FechaFinal, DATEADD(MONTH,1,CO.FechaInicial), CO.MontoAhorrar, CO.NumeroDeCuenta, CO.DescripcionObjetivo, 1

                               FROM @CuentasObjetivo CO
                               INNER JOIN Cuenta_Ahorro CA ON CA.Numero_Cuenta =  CO.NumeroDeCuenta

                               WHERE CO.id = @lo

                               SET @lo = @lo + 1

                       END

                       IF @InicioTran = 1
                       BEGIN
                               COMMIT TRANSACTION AgregarCuentasObjetivo
                               SET @InicioTran = 0
                       END
               END TRY
               BEGIN CATCH
                       IF @InicioTran = 1
                       BEGIN
                               ROLLBACK TRANSACTION AgregarCuentasObjetivo
                               SELECT 'Hubo un error al agregar las cuentas objetivo'
                               Return -100006
                       END
               END CATCH


3- Revisando detenidamente los archivos XML se descubrió que hay casos en los que las cuentas de ahorro se repetían, por ello se corrigió un problema de validación donde se permitía el ingreso de cuentas repetidas al realizar la lectura de cuentas de ahorro desde el archivo XML, ahora en caso de que haya un repetido se ignora la lectura y se indica el suceso durante la simulación.

IF NOT EXISTS (SELECT CA.id FROM @Cuentas C, Cuenta_Ahorro CA
                    WHERE C.id = @lo and CA.Numero_Cuenta = C.Numero_Cuenta)
BEGIN
-- Código de inserción de cuentas de ahorro
END
ELSE
BEGIN
          SELECT 'Esta repetido' as Descripcion, CA.id, CA.Numero_Cuenta
          FROM @Cuentas C,Cuenta_Ahorro CA
          WHERE C.id = @lo and CA.Numero_Cuenta = C.Numero_Cuenta
END

4- La misma validación de repetidos se realizó para el ingreso de beneficiarios nuevos, para ello se revisa que la c cédula no se haya ingresado previamente. De la misma forma se hizo encierra el código de ingreso de beneficiarios nuevos en una condición IF que verifica que no se ingresen cédulas repetidas, de lo contrario se ignora y se indica durante la simulación.

IF (SELECT COUNT(BE.Documento_Identificacion)
      FROM @BeneficiariosNuevos BE
      WHERE BE.Documento_Identificacion = (SELECT B.Documento_Identificacion
                                                                           FROM @BeneficiariosNuevos B
                                                                           WHERE B.id = @lo)) <=1
BEGIN

-- Código de ingreso del beneficiario nuevo

END
ELSE
BEGIN
          SELECT 'Caso de beneficiario nuevo repetido'
END


Horas de trabajo: 1:45 h

No hay comentarios:

Publicar un comentario