Probando el nuevo codigo
12 de noviembre (5 horas y 40 minutos) Inicio: 10:00 am, Fin: 3:40 pm
Procedimientos Almacenado creados:
* SP_InsertarCO,
* SP_InsertarMovimientos,
* SP_InsertarAccionesCO,
* SP_InsertarBeneficiarios
* SP_GenerarEstados
El dia de hoy se realizó una reunion para poder finalizar la estructura principal de la simulacion de la base de datos. Las partes principales a corregir fueron, cambiar la eliminacion de filas de las tablas variable de @personas y @cuentas, a la implementacion de una columna 'sec' para poder ir iterando sobre la tabla e ir solicitando los datos fila por fila y asi mejorar el tiempo de ejecucion de la simulacion, este cambio se puede ver en la imagen 1. En esta parte se tardo aproximadamente una media hora debido a que se tuvo que cambiar la implementacion de un SP que no estaba reconociendo los paramentros que se enviaban, despues de revisarlo, no dimos cuenta de que el error estaba en un 'END' que no estaba bien colocado.
Luego se empezo con la implementacion de nuevos tipos de tablas en las que se pudiesen guardar los valores que se precisaban para cada procedimiento, Insertar Movimiento o Estados de Cuenta, esto se realizo debido a que se necesitaban enviar estas tablas a los SP encargados de insertar la informacion y se necesitaba definir un tipo de tabla especifico, ver imagen 2 para los tipos de tablas implementadas. En esto se duro aproximadamente media hora ya que tambien se decidio optimizar dos procedimientos en los cuales estas nuevas tablas eran cargadas, ademas de tener que buscar la informacion sobre como crear una tabla definida, ver referencia 1.
Despues se inicio con la creacion de los procedimientos almacenados que se encargarian de insertar los valores en la tablas de la base de datos, siguiendo el orden de las cuentas que se hayan visto afectadas ese dia. Los procedimientos almacenados creados fueron SP_InsertarCO, SP_InsertarMovimientos, SP_InsertarAccionesCO, SP_InsertarBeneficiarios y SP_GenerarEstados. En la creacion de estos se tomo aproximadamente 4 horas, la razon por la que se tomo tanto tiempo a la hora de implementar estos procedimientos fue que estaban dando muchos tipos de errores, el primer error importante que se obtenia era que existia un 'arithmetic overflow'. Este error no sabiamos porque era que sucedia ya que invetigabamos el codigo en la parte del error y todo parecia estar bien, pensabamos que el error era porque se intentaba pasar de un 'FLOAT' a un 'INT ' asi que se usaron las funciones 'CONVERT' y 'CAST', sin embargo ninguna de las dos funciono. Luego se decidio ver cuales eran las condiciones en las que se generaba este error. Nos dimos cuenta de que el error era generado debido a que el numero en realidad no era un flotante si no un numero negativo muy grande y este desataba el error. Al analizarlo mejor se decidio cambiar el orden de ejecucion del calculo para realizar primero divisiones antes que las multiplicaciones, se respeto que los resultados siempre fueran iguales, asi evitar que se genera un numero negativo muy grande y eso soluciono el problema, se dedico una hora aproximadamente. Ver Imagen 3
Luego otro de los errores que se obtuvieron fue a la hora de realizar la generacion de estados de cuenta, ya que en ciertas partes del codigo daba un error de que la variable no se permitia que la columna SaldoFin fuese NULA, ver imagen 4. Este problema nos dejo perdidos ya que no sabiamos porque en algunos casos si funcionaba y en otros casos no, revisamos el codigo repetidamente sin ningun exito porque a nuestro parecer todas las asignaciones de los valores estaban bien, entonces pensamos que podia ser un error de software, por lo cual reiniciamos la aplicacion y las computadores, pero si ningun resultado. Se decidio luego a hacer 'PRINT' de la variable que se le asignaba a la hora de crear la para saber en que fechas y con cuales cuentas era que sucedia el error. Luego de mucho tiempo se vio que el problema se daba que en algunos casos se realizaba la multiplicacion de la variable @Saldo por otra varible @Monto la cual habian ocasiones en la que no se inicializaba por la condicion de Exceso de Operaciones en Cajero Automatico. Una vez corregido eso el error se resolvio para todas las iteraciones, resolver este problema tomo alrededor de una hora.
Imagen 4
El ultimo error que obtuvimos hoy fue a la hora de realizar las Acciones de las Cuentas Objetivo, al igual que el error pasado existian situaciones en las cuales habian valores que se tornaban nulos y que se intentaban insertar en la tabla pero estos no lo permitian. Con el error anterior ya resuelto sabiamos cual era el problema, una vez se logro identificar el problema se corrigio facilmente y ya el codigo no daba mas errores, sin embargo los valores que se insertaban en la tabla no eran correctos, ya que no se hacia la suma correcta de los intereses en la tabla correspondiente. Revisando el codigo nos dimos cuenta de que una comparacion con NULL estaba mal realizada, ver imagen 5. Una vez corregida se pudo seguir el codigo y ya los valores eran correctos. Se tardo aproximadamente 40 minutos en esta parte.
Imagen 5
Por ultimo para la creacion de la logica de los SP se dedico una hora y 20 minutos para poder implementarlos de una manera optimizada y que no causara retrasos innecesarios a la hora de su ejecucion. Ademas se estuvo asegurando de que la implementacion de 'INNER JOIN' no diese problema en ningun momento ya que en proyectos anteriores hubo varias ocasiones en las que si daba errores por eso es que se invirtio mas tiempo del esperado. Ver Evidencias
Para finalizar se dedicaron los ultimos 40 minutos a la discusion de como se iba a diseñar la pagina web para poder mostrar los datos necesarios que se solicitaban en las consultas. Ademas se discutio la forma en la que se debian de implementar las consulta, las formas de accesar a los datos y como se iba a retornar la informacion, ver imagen 5
- USE [Tarea3]
- GO
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- ALTER PROCEDURE [dbo].[SP_GenerarEstados]
- @inIdCuenta INT
- ,@inTablaEC TablaEC READONLY
- ,@inFecha DATE
- ,@OutResultCode INT
- AS
- BEGIN
- SET NOCOUNT ON
- BEGIN TRY
- DECLARE @IdCuenta INT
- , @Saldo INT
- , @AplicarComATM INT
- , @AplicarComHum INT
- , @AplicarMulta INT
- , @MontoMultaATM INT
- , @MontoMultaHumano INT
- , @MontoMultaMinimo INT
- , @IdEstadoCuenta INT
- , @IdMoneda INT
- , @CargoServicio INT
- , @Interes INT
- , @FechaInicio DATE
- , @FechaFin DATE
- , @SaldoMinimo INT
- , @SaldoMinimoPermitido INT
- , @MontoInteres INT;
- SELECT @IdCuenta = CC.Idcuenta
- , @IdEstadoCuenta = CC.IdEC
- , @IdMoneda = CC.IdMoneda
- , @CargoServicio = CC.CargoServicio
- , @Interes = CC.Interes
- , @AplicarComATM = CC.AplicarMultaATM
- , @AplicarComHum = CC.AplicarMultaHumano
- , @AplicarMulta = CC.AplicarMultaSaldoMinimo
- , @MontoMultaATM = CC.MontoMultaExcesoATM
- , @MontoMultaHumano = CC.MontoMultaExcesoCajeroH
- , @MontoMultaMinimo = CC.MontoMultaSalMinimo
- , @SaldoMinimo = CC.SaldoMinimo
- , @MontoInteres = (CC.SaldoMinimo * CC.Interes)/100
- , @Saldo = CC.Saldo
- FROM @inTablaEC CC
- WHERE CC.IdCuenta = @inIdCuenta;
- BEGIN TRANSACTION TSaveMov
- -- Insertar Movimiento, intereses mensuales
- INSERT INTO dbo.Movimientos(
- IdCambio
- , IdMovimiento
- , IdMoneda
- , IdCuenta
- , Monto
- , Descripcion
- , Fecha
- , NuevoSaldo
- )
- VALUES(
- @IdMoneda
- , 13
- , @IdMoneda
- , @IdCuenta
- , @MontoInteres
- , 'Intereses Mensuales'
- , @inFecha
- , @Saldo + @MontoInteres
- );
- SET @Saldo = @Saldo + @MontoInteres;
- -- Insertar Movimiento, cargo de servicio mensual
- INSERT INTO dbo.Movimientos(
- IdCambio
- , IdMovimiento
- , IdMoneda
- , IdCuenta
- , Monto
- , Descripcion
- , Fecha
- , NuevoSaldo
- )
- VALUES(
- @IdMoneda
- , 12
- , @IdMoneda
- , @IdCuenta
- , -1*@CargoServicio
- , 'Cargo Servicio Mensual'
- , @inFecha
- , @Saldo - @CargoServicio
- );
- SET @Saldo = @Saldo - @CargoServicio;
- -- Insertar Movimiento, incumplimiento saldo minimo
- INSERT INTO dbo.Movimientos(
- IdCambio
- , IdMovimiento
- , IdMoneda
- , IdCuenta
- , Monto
- , Descripcion
- , Fecha
- , NuevoSaldo
- )
- SELECT
- @IdMoneda
- , 17
- , @IdMoneda
- , @IdCuenta
- , -1*@MontoMultaMinimo
- ,'Multa por incumplimiento de saldo minimo'
- , @inFecha
- ,@Saldo - @MontoMultaMinimo
- WHERE @AplicarMulta=1;
- SET @Saldo = CASE WHEN @AplicarMulta = 1 THEN @Saldo - @MontoMultaMinimo ELSE @Saldo END;
- --Insertar Movimiento, exceso ATM
- INSERT INTO dbo.Movimientos(
- IdCambio
- , IdMovimiento
- , IdMoneda
- , IdCuenta
- , Monto
- , Descripcion
- , Fecha
- , NuevoSaldo
- )
- SELECT
- @IdMoneda
- , 10
- , @IdMoneda
- , @IdCuenta
- , -1 * @MontoMultaATM
- , 'Comision Cajero Automatico'
- , @inFecha
- , @Saldo - @MontoMultaATM
- WHERE @AplicarComATM = 1;
- SET @Saldo = CASE WHEN @AplicarComATM = 1 THEN @Saldo - @MontoMultaATM ELSE @Saldo END;
- --Insertar Movimiento, exceso Cajero Humano
- INSERT INTO dbo.Movimientos(
- IdCambio
- , IdMovimiento
- , IdMoneda
- , IdCuenta
- , Monto
- , Descripcion
- , Fecha
- , NuevoSaldo
- )
- SELECT
- @IdMoneda
- , 9
- , @IdMoneda
- , @IdCuenta
- , -1 * @MontoMultaHumano
- , 'Comision Cajero Humano'
- , @inFecha
- , @Saldo - @MontoMultaHumano
- WHERE @AplicarComHum = 1;
- SET @Saldo = CASE WHEN @AplicarComHum = 1 THEN @Saldo - @MontoMultaHumano ELSE @Saldo END;
- UPDATE dbo.Cuentas
- SET Saldo = @Saldo
- WHERE Id = @IdCuenta;
- UPDATE dbo.EstadoCuenta
- SET SaldoFin = @Saldo
- , SaldoMinimo = @SaldoMinimo
- WHERE Id = @IdEstadoCuenta;
- INSERT dbo.EstadoCuenta(
- IdCuenta,
- FechaInicio,
- FechaFin,
- SaldoInicio,
- SaldoFin,
- OperacionesAtm,
- OperacionesPersona,
- SaldoMinimo
- )
- VALUES(
- @IdCuenta,
- DATEADD(DAY,1,@inFecha),
- DATEADD(MONTH,1,@inFecha),
- @Saldo,
- 0,
- 0,
- 0,
- 0
- );
- COMMIT TRANSACTION TSaveMov
- END TRY
- BEGIN CATCH
- IF @@Trancount>0
- ROLLBACK TRANSACTION TSaveMov;
- INSERT INTO dbo.Errores VALUES (
- SUSER_SNAME(),
- ERROR_NUMBER(),
- ERROR_STATE(),
- ERROR_SEVERITY(),
- ERROR_LINE(),
- ERROR_PROCEDURE(),
- ERROR_MESSAGE(),
- GETDATE()
- );
- SET @OutResultCode=50005;
- END CATCH
- SET NOCOUNT OFF
- END
- USE [Tarea3]
- GO
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- ALTER PROCEDURE [dbo].[SP_InsertarBeneficiario]
- @inIdCuenta INT
- ,@inTablaBeneficiarios TablaBeneficiarios READONLY
- ,@outresultCode INT
- AS
- BEGIN
- SET NOCOUNT ON
- BEGIN TRY
- DECLARE @BeneficiariosProcesar TABLE(
- sec INT IDENTITY (1,1)
- ,IdCuenta INT
- ,IdPersona INT
- ,IdParentezco INT
- ,Porcentaje INT
- )
- DECLARE @IdCuenta INT
- , @IdPersona INT
- , @IdParentezco INT
- , @Porcentaje INT
- , @lo INT
- , @hi INT
- INSERT INTO @BeneficiariosProcesar(
- IdCuenta
- , IdPersona
- , IdParentezco
- , Porcentaje
- )SELECT
- IdCuenta
- ,IdPersona
- ,ParentezcoId
- ,Porcentaje
- FROM @inTablaBeneficiarios TB
- WHERE TB.IdCuenta = @inIdCuenta
- SELECT @lo = MIN(sec), @hi = MAX(sec)
- FROM @BeneficiariosProcesar
- WHILE @lo <= @hi
- BEGIN
- SELECT @IdCuenta = IdCuenta
- , @IdPersona = IdPersona
- , @IdParentezco = IdParentezco
- , @Porcentaje = Porcentaje
- FROM @BeneficiariosProcesar
- WHERE sec = @lo;
- BEGIN TRANSACTION TSaveMov
- INSERT INTO dbo.Beneficiarios(
- IdCuenta
- ,IdPersona
- ,IdParentezco
- ,Porcentaje
- ,Activo
- )VALUES(
- @IdCuenta
- ,@IdPersona
- ,@IdParentezco
- ,@Porcentaje
- ,1
- );
- COMMIT TRANSACTION TSaveMov;
- SET @lo = @lo +1
- END
- END TRY
- BEGIN CATCH
- IF @@Trancount>0
- ROLLBACK TRANSACTION TSaveMov;
- INSERT INTO dbo.Errores VALUES (
- SUSER_SNAME(),
- ERROR_NUMBER(),
- ERROR_STATE(),
- ERROR_SEVERITY(),
- ERROR_LINE(),
- ERROR_PROCEDURE(),
- ERROR_MESSAGE(),
- GETDATE()
- );
- SET @OutResultCode=50005;
- END CATCH
- SET NOCOUNT OFF
- END
- USE [Tarea3]
- GO
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- ALTER PROCEDURE [dbo].[SP_InsertarAccionesCO]
- @inIdCuenta INT,
- @inTablaAccionesCO TablaAccionesCO READONLY,
- @inFecha DATE,
- @OutResultCode INT
- AS
- BEGIN
- SET NOCOUNT ON
- DECLARE @AccionesProcesar TABLE (
- sec INT IDENTITY(1,1)
- , IdCuenta INT
- , IdCO INT
- , HacerDeposito INT
- , HacerRedencion INT
- , DiaDeAhorro INT
- , FechaInicio DATE
- , FechaFin DATE
- , MontoDeposito INT
- , MontoInteres INT
- , SaldoCuenta INT
- , TipoInteres INT
- , SaldoCO INT
- , InteresAcumulado INT
- )
- DECLARE @lo INT
- ,@hi INT
- ,@IdCuenta INT
- ,@IdCO INT
- ,@HacerDeposito INT
- ,@HacerRedencion INT
- ,@MontoDeposito INT
- ,@MontoInteres INT
- ,@SaldoCuenta INT
- ,@TipoInteres INT
- ,@SaldoCO INT
- ,@InteresAcumulado INT
- ,@TempInteresAcumulado INT;
- BEGIN TRY
- INSERT INTO @AccionesProcesar(
- IdCuenta
- , IdCo
- , HacerDeposito
- , HacerRedencion
- , DiaDeAhorro
- , FechaInicio
- , FechaFin
- , MontoDeposito
- , MontoInteres
- , SaldoCuenta
- , TipoInteres
- , SaldoCO
- , InteresAcumulado
- )
- SELECT
- TAC.IdCuenta
- ,TAC.IdCO
- ,TAC.HacerDeposito
- ,TAC.HacerRedencion
- ,TAC.DiaDeAhorro
- ,TAC.FechaInicio
- ,TAC.FechaFin
- ,TAC.MontoDeposito
- ,TAC.MontoInteres
- ,C.Saldo
- ,DATEDIFF(MONTH,TAC.FechaInicio,TAC.FechaFin)
- , CO.Saldo
- , 0
- FROM @inTablaAccionesCO TAC
- INNER JOIN dbo.Cuentas C ON TAC.IdCuenta = C.Id
- INNER JOIN dbo.CuentasObjetivo CO ON TAC.IdCO = CO.Id
- WHERE TAC.IdCuenta = @inIdCuenta;
- UPDATE @AccionesProcesar
- SET HacerDeposito = CASE WHEN (AC.SaldoCuenta - AC.MontoDeposito) >= 0 THEN 1 ELSE 0 END
- ,MontoInteres = (AC.SaldoCO * (TI.Interes * 100))/10000
- FROM @AccionesProcesar AC
- INNER JOIN dbo.TasaInteresCO TI ON AC.TipoInteres = TI.Id
- INNER JOIN dbo.CuentasObjetivo CO ON AC.IdCO = CO.Id
- SELECT @lo = MIN(sec), @hi = MAX(sec) FROM @AccionesProcesar
- WHILE @lo <= @hi
- BEGIN
- SELECT @IdCO = IdCO FROM @AccionesProcesar
- WHERE sec = @lo;
- SELECT @TempInteresAcumulado = MAX(NuevoInteresAcumulado)
- FROM dbo.MovimientosInteresCO
- WHERE IdCuentaCO = @IdCO;
- SET @TempInteresAcumulado = CASE WHEN @TempInteresAcumulado IS NOT NULL THEN @TempInteresAcumulado ELSE 0 END;
- UPDATE @AccionesProcesar
- SET InteresAcumulado = @TempInteresAcumulado
- WHERE sec = @lo;
- SET @lo = @lo+1;
- END
- SELECT @lo = MIN(sec), @hi = MAX(sec) FROM @AccionesProcesar
- WHILE @lo <= @hi
- BEGIN
- SELECT @IdCuenta = IdCuenta
- ,@IdCO = IdCO
- ,@HacerDeposito = HacerDeposito
- ,@HacerRedencion = HacerRedencion
- ,@MontoDeposito = MontoDeposito
- ,@MontoInteres = MontoInteres
- ,@SaldoCuenta =SaldoCuenta
- ,@TipoInteres = TipoInteres
- ,@SaldoCO = SaldoCO
- ,@InteresAcumulado = InteresAcumulado
- FROM @AccionesProcesar
- WHERE sec = @lo;
- BEGIN TRANSACTION TSaveMov
- --INTERESES
- INSERT INTO dbo.MovimientosInteresCO(
- IdCuentaCO
- ,IdInteres
- ,Fecha
- ,Monto
- ,SaldoCO
- ,NuevoInteresAcumulado
- )VALUES(
- @IdCO
- ,@TipoInteres
- ,@inFecha
- ,@MontoInteres
- ,@SaldoCO
- ,@InteresAcumulado +@MontoInteres
- );
- SET @InteresAcumulado = @InteresAcumulado + @MontoInteres;
- --INTERESES
- --DEPOSITO
- INSERT INTO dbo.MovimientosCO(
- IdTipoMovimientoCO
- ,IdCuentaCO
- ,Fecha
- ,Monto
- ,NuevoSaldo
- )SELECT
- 1
- ,@IdCO
- ,@inFecha
- ,@MontoDeposito
- ,@SaldoCO+@MontoDeposito
- WHERE @HacerDeposito = 1;
- INSERT INTO dbo.Movimientos(
- IdCambio
- ,IdMovimiento
- ,IdMoneda
- ,IdCuenta
- ,Monto
- ,Descripcion
- ,Fecha
- ,NuevoSaldo
- )SELECT
- 1
- ,14
- ,1
- ,@IdCuenta
- ,-1*@MontoDeposito
- ,'Aplicacion monto ahorro en cuenta a subcuenta objetivo'
- ,@inFecha
- ,@SaldoCuenta - @MontoDeposito
- WHERE @HacerDeposito = 1;
- SET @SaldoCO = CASE WHEN @HacerDeposito = 1 THEN @SaldoCO+@MontoDeposito ELSE @SaldoCO END;
- SET @SaldoCuenta = CASE WHEN @HacerDeposito = 1 THEN @SaldoCuenta - @MontoDeposito ELSE @SaldoCuenta END;
- --
- UPDATE dbo.CuentasObjetivo
- SET Saldo = @SaldoCO
- WHERE @HacerDeposito = 1
- AND Id = @IdCO;
- UPDATE dbo.Cuentas
- SET Saldo = @SaldoCuenta-@MontoDeposito
- WHERE @HacerDeposito = 1
- AND Id = @IdCuenta;
- --DEPOSITO
- --REDENCION
- INSERT INTO dbo.MovimientosInteresCO(
- IdCuentaCO
- ,IdInteres
- ,Fecha
- ,Monto
- ,SaldoCO
- ,NuevoInteresAcumulado
- )SELECT
- @IdCO
- ,@TipoInteres
- ,@inFecha
- ,-1*@InteresAcumulado
- ,@SaldoCO
- ,0
- WHERE @HacerRedencion = 1;
- INSERT INTO dbo.MovimientosCO(
- IdTipoMovimientoCO
- ,IdCuentaCO
- ,Fecha
- ,Monto
- ,NuevoSaldo
- )SELECT
- 2
- ,@IdCO
- ,@inFecha
- ,@InteresAcumulado
- ,@SaldoCO + @InteresAcumulado
- WHERE @HacerRedencion = 1;
- SET @SaldoCO = CASE WHEN @HacerRedencion = 1 THEN @SaldoCO + @InteresAcumulado ELSE @SaldoCO END;
- INSERT INTO dbo.MovimientosCO(
- IdTipoMovimientoCO
- ,IdCuentaCO
- ,Fecha
- ,Monto
- ,NuevoSaldo
- )SELECT
- 3
- ,@IdCO
- ,@inFecha
- ,-1*@SaldoCO
- ,0
- WHERE @HacerRedencion = 1;
- INSERT INTO dbo.Movimientos(
- IdCambio
- ,IdMovimiento
- ,IdMoneda
- ,IdCuenta
- ,Monto
- ,Descripcion
- ,Fecha
- ,NuevoSaldo
- )SELECT
- 1
- ,15
- ,1
- ,@IdCuenta
- ,@SaldoCO
- ,'Redencion de subcuenta objetivo'
- ,@inFecha
- ,@SaldoCuenta + @SaldoCO
- WHERE @HacerRedencion = 1;
- SET @SaldoCuenta = CASE WHEN @HacerRedencion = 1 THEN @SaldoCuenta + @SaldoCO ELSE @SaldoCuenta END;
- UPDATE dbo.CuentasObjetivo
- SET Activo = 0,
- Saldo = 0
- WHERE Id = @IdCO
- AND @HacerRedencion = 1;
- UPDATE dbo.Cuentas
- SET Saldo = @SaldoCuenta
- WHERE Id = @IdCuenta
- AND @HacerRedencion = 1;
- --REDENCION
- COMMIT TRANSACTION TSaveMov
- SET @lo = @lo +1;
- END
- END TRY
- BEGIN CATCH
- IF @@Trancount>0
- ROLLBACK TRANSACTION TSaveMov;
- INSERT INTO dbo.Errores VALUES (
- SUSER_SNAME(),
- ERROR_NUMBER(),
- ERROR_STATE(),
- ERROR_SEVERITY(),
- ERROR_LINE(),
- ERROR_PROCEDURE(),
- ERROR_MESSAGE(),
- GETDATE()
- );
- SET @OutResultCode=50005;
- END CATCH
- SET NOCOUNT OFF
- END
- USE [Tarea3]
- GO
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- ALTER PROCEDURE [dbo].[SP_InsertarMovimiento]
- @inIdCuenta INT,
- @inTablaMovimientos TablaMovimientos READONLY,
- @inFecha DATE,
- @OutResultCode INT
- AS
- BEGIN
- SET NOCOUNT ON
- DECLARE @MovimientosProcesar TABLE (
- sec INT IDENTITY(1,1)
- , Descripcion VARCHAR(32)
- , IdMoneda INT
- , Monto INT
- , IdCuenta INT
- , TipoMov INT
- , OpAtm INT
- , OpCaja INT
- , MonedaCuenta INT
- , HacerCambio INT
- , IdCambio INT
- , IdEC INT
- )
- DECLARE @lo INT
- ,@hi INT
- ,@Descripcion VARCHAR(32)
- ,@IdMoneda INT
- ,@Monto INT
- ,@IdCuenta INT
- ,@TipoMov INT
- ,@OpAtm INT
- ,@OpCaja INT
- ,@Cambio INT
- ,@Compra INT
- ,@Venta INT
- ,@IdUltimoCambio INT
- ,@IdCambio INT
- ,@SaldoAct INT
- ,@IdEC INT
- BEGIN TRY
- INSERT INTO @MovimientosProcesar(
- Descripcion
- , IdMoneda
- , Monto
- , IdCuenta
- , TipoMov
- , OpAtm
- , OpCaja
- , MonedaCuenta
- , HacerCambio
- , IdCambio
- , IdEC
- )SELECT
- TM.Descripcion
- , TM.IdMoneda
- , TM.Monto
- , TM.IdCuenta
- , TM.TipoMov
- , 0
- , 0
- , TC.IdTipoMoneda
- , 0
- , 1
- , IdEC = MAX(EC.Id)
- FROM @inTablaMovimientos TM
- INNER JOIN dbo.Cuentas C ON C.Id= TM.IdCuenta
- INNER JOIN dbo.TipoCuentaAhorro TC ON TC.Id = C.IdTipoCuenta
- INNER JOIN dbo.EstadoCuenta EC ON EC.idCuenta=C.Id
- WHERE TM.IdCuenta = @inIdCuenta
- GROUP BY TM.Descripcion
- , TM.IdMoneda
- , TM.Monto
- , TM.IdCuenta
- , TM.TipoMov
- , TC.IdTipoMoneda;
- UPDATE @MovimientosProcesar
- SET Monto = CASE WHEN T.Operacion = 1 THEN Monto ELSE -1*Monto END
- , OpAtm = CASE WHEN M.TipoMov = 6 THEN 1 ELSE 0 END
- , OpCaja = CASE WHEN M.TipoMov = 7 THEN 1 ELSE 0 END
- , HacerCambio = CASE WHEN M.IdMoneda != M.MonedaCuenta THEN 1 ELSE 0 END
- FROM @MovimientosProcesar M
- INNER JOIN dbo.TipoMovimiento T ON T.Id = M.TipoMov;
- SELECT @lo = MIN(sec),@hi = MAX(sec)
- FROM @MovimientosProcesar;
- SELECT @IdUltimoCambio = MAX(Id) FROM dbo.TipoCambio;
- SELECT @Compra = CB.Compra
- ,@Venta = CB.Venta
- FROM dbo.TipoCambio CB
- WHERE Id = @IdUltimoCambio;
- UPDATE @MovimientosProcesar
- SET Monto = CASE WHEN MP.IdMoneda = 2 THEN Monto * @Compra ELSE Monto / @Venta END
- ,IdCambio = @IdUltimoCambio
- FROM @MovimientosProcesar MP
- WHERE HacerCambio = 1
- SELECT @lo = MIN(sec),@hi = MAX(sec)
- FROM @MovimientosProcesar;
- WHILE @lo <= @hi
- BEGIN
- SELECT @Descripcion = MP.Descripcion
- ,@IdMoneda = MP.IdMoneda
- ,@Monto = MP.Monto
- ,@IdCuenta = MP.IdCuenta
- ,@TipoMov = MP.TipoMov
- ,@IdCambio = MP.IdCambio
- ,@OpAtm = MP.OpAtm
- ,@OpCaja = MP.OpCaja
- ,@SaldoAct = C.Saldo
- ,@IdEC = MP.IdEC
- FROM @MovimientosProcesar MP
- INNER JOIN dbo.Cuentas C ON C.Id = MP.IdCuenta
- WHERE sec = @lo;
- SET @SaldoAct = @SaldoAct + @Monto
- BEGIN TRANSACTION TSaveMov
- INSERT INTO dbo.Movimientos(
- IdCambio
- ,IdMovimiento
- ,IdMoneda
- ,IdCuenta
- ,Monto
- ,Descripcion
- ,Fecha
- ,NuevoSaldo
- )VALUES(
- @IdCambio
- ,@TipoMov
- ,@IdMoneda
- ,@IdCuenta
- ,@Monto
- ,@Descripcion
- ,@inFecha
- ,@SaldoAct
- );
- UPDATE dbo.Cuentas
- SET Saldo = @SaldoAct
- WHERE Id = @IdCuenta;
- UPDATE dbo.EstadoCuenta
- SET
- OperacionesAtm = OperacionesAtm+@OpAtm,
- OperacionesPersona = OperacionesPersona + @OpCaja
- WHERE Id = @IdEC;
- COMMIT TRANSACTION
- SET @lo = @lo+1;
- END
- END TRY
- BEGIN CATCH
- IF @@Trancount>0
- ROLLBACK TRANSACTION TSaveMov;
- INSERT INTO dbo.Errores VALUES (
- SUSER_SNAME(),
- ERROR_NUMBER(),
- ERROR_STATE(),
- ERROR_SEVERITY(),
- ERROR_LINE(),
- ERROR_PROCEDURE(),
- ERROR_MESSAGE(),
- GETDATE()
- );
- SET @OutResultCode=50005;
- END CATCH
- SET NOCOUNT OFF
- END
Comentarios
Publicar un comentario