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.

Imagen 1

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.

Imagen 2

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






Imagen 5

Referencias
https://www.youtube.com/watch?v=UJ8Fri7L1Eg

Evidencias
  1. USE [Tarea3]
  2. GO
  3. SET ANSI_NULLS ON
  4. GO
  5. SET QUOTED_IDENTIFIER ON
  6. GO
  7. ALTER PROCEDURE [dbo].[SP_GenerarEstados]
  8. @inIdCuenta INT
  9. ,@inTablaEC TablaEC READONLY
  10. ,@inFecha DATE
  11. ,@OutResultCode INT
  12. AS
  13. BEGIN
  14. SET NOCOUNT ON
  15. BEGIN TRY
  16. DECLARE @IdCuenta INT
  17. , @Saldo INT
  18. , @AplicarComATM INT
  19. , @AplicarComHum INT
  20. , @AplicarMulta INT
  21. , @MontoMultaATM INT
  22. , @MontoMultaHumano INT
  23. , @MontoMultaMinimo INT
  24. , @IdEstadoCuenta INT
  25. , @IdMoneda INT
  26. , @CargoServicio INT
  27. , @Interes INT
  28. , @FechaInicio DATE
  29. , @FechaFin DATE
  30. , @SaldoMinimo INT
  31. , @SaldoMinimoPermitido INT
  32. , @MontoInteres INT;
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39. SELECT @IdCuenta = CC.Idcuenta
  40. , @IdEstadoCuenta = CC.IdEC
  41. , @IdMoneda = CC.IdMoneda
  42. , @CargoServicio = CC.CargoServicio
  43. , @Interes = CC.Interes
  44. , @AplicarComATM = CC.AplicarMultaATM
  45. , @AplicarComHum = CC.AplicarMultaHumano
  46. , @AplicarMulta = CC.AplicarMultaSaldoMinimo
  47. , @MontoMultaATM = CC.MontoMultaExcesoATM
  48. , @MontoMultaHumano = CC.MontoMultaExcesoCajeroH
  49. , @MontoMultaMinimo = CC.MontoMultaSalMinimo
  50. , @SaldoMinimo = CC.SaldoMinimo
  51. , @MontoInteres = (CC.SaldoMinimo * CC.Interes)/100
  52. , @Saldo = CC.Saldo
  53. FROM @inTablaEC CC
  54. WHERE CC.IdCuenta = @inIdCuenta;
  55.  
  56.  
  57.  
  58. BEGIN TRANSACTION TSaveMov
  59.  
  60. -- Insertar Movimiento, intereses mensuales
  61. INSERT INTO dbo.Movimientos(
  62. IdCambio
  63. , IdMovimiento
  64. , IdMoneda
  65. , IdCuenta
  66. , Monto
  67. , Descripcion
  68. , Fecha
  69. , NuevoSaldo
  70. )
  71. VALUES(
  72. @IdMoneda
  73. , 13
  74. , @IdMoneda
  75. , @IdCuenta
  76. , @MontoInteres
  77. , 'Intereses Mensuales'
  78. , @inFecha
  79. , @Saldo + @MontoInteres
  80. );
  81.  
  82. SET @Saldo = @Saldo + @MontoInteres;
  83.  
  84. -- Insertar Movimiento, cargo de servicio mensual
  85.  
  86. INSERT INTO dbo.Movimientos(
  87. IdCambio
  88. , IdMovimiento
  89. , IdMoneda
  90. , IdCuenta
  91. , Monto
  92. , Descripcion
  93. , Fecha
  94. , NuevoSaldo
  95. )
  96. VALUES(
  97. @IdMoneda
  98. , 12
  99. , @IdMoneda
  100. , @IdCuenta
  101. , -1*@CargoServicio
  102. , 'Cargo Servicio Mensual'
  103. , @inFecha
  104. , @Saldo - @CargoServicio
  105. );
  106.  
  107. SET @Saldo = @Saldo - @CargoServicio;
  108.  
  109. -- Insertar Movimiento, incumplimiento saldo minimo
  110. INSERT INTO dbo.Movimientos(
  111. IdCambio
  112. , IdMovimiento
  113. , IdMoneda
  114. , IdCuenta
  115. , Monto
  116. , Descripcion
  117. , Fecha
  118. , NuevoSaldo
  119. )
  120. SELECT
  121. @IdMoneda
  122. , 17
  123. , @IdMoneda
  124. , @IdCuenta
  125. , -1*@MontoMultaMinimo
  126. ,'Multa por incumplimiento de saldo minimo'
  127. , @inFecha
  128. ,@Saldo - @MontoMultaMinimo
  129. WHERE @AplicarMulta=1;
  130.  
  131. SET @Saldo = CASE WHEN @AplicarMulta = 1 THEN @Saldo - @MontoMultaMinimo ELSE @Saldo END;
  132.  
  133. --Insertar Movimiento, exceso ATM
  134. INSERT INTO dbo.Movimientos(
  135. IdCambio
  136. , IdMovimiento
  137. , IdMoneda
  138. , IdCuenta
  139. , Monto
  140. , Descripcion
  141. , Fecha
  142. , NuevoSaldo
  143. )
  144. SELECT
  145. @IdMoneda
  146. , 10
  147. , @IdMoneda
  148. , @IdCuenta
  149. , -1 * @MontoMultaATM
  150. , 'Comision Cajero Automatico'
  151. , @inFecha
  152. , @Saldo - @MontoMultaATM
  153. WHERE @AplicarComATM = 1;
  154.  
  155. SET @Saldo = CASE WHEN @AplicarComATM = 1 THEN @Saldo - @MontoMultaATM ELSE @Saldo END;
  156.  
  157. --Insertar Movimiento, exceso Cajero Humano
  158. INSERT INTO dbo.Movimientos(
  159. IdCambio
  160. , IdMovimiento
  161. , IdMoneda
  162. , IdCuenta
  163. , Monto
  164. , Descripcion
  165. , Fecha
  166. , NuevoSaldo
  167. )
  168. SELECT
  169. @IdMoneda
  170. , 9
  171. , @IdMoneda
  172. , @IdCuenta
  173. , -1 * @MontoMultaHumano
  174. , 'Comision Cajero Humano'
  175. , @inFecha
  176. , @Saldo - @MontoMultaHumano
  177. WHERE @AplicarComHum = 1;
  178.  
  179. SET @Saldo = CASE WHEN @AplicarComHum = 1 THEN @Saldo - @MontoMultaHumano ELSE @Saldo END;
  180.  
  181. UPDATE dbo.Cuentas
  182. SET Saldo = @Saldo
  183. WHERE Id = @IdCuenta;
  184.  
  185. UPDATE dbo.EstadoCuenta
  186. SET SaldoFin = @Saldo
  187. , SaldoMinimo = @SaldoMinimo
  188. WHERE Id = @IdEstadoCuenta;
  189.  
  190. INSERT dbo.EstadoCuenta(
  191. IdCuenta,
  192. FechaInicio,
  193. FechaFin,
  194. SaldoInicio,
  195. SaldoFin,
  196. OperacionesAtm,
  197. OperacionesPersona,
  198. SaldoMinimo
  199. )
  200. VALUES(
  201. @IdCuenta,
  202. DATEADD(DAY,1,@inFecha),
  203. DATEADD(MONTH,1,@inFecha),
  204. @Saldo,
  205. 0,
  206. 0,
  207. 0,
  208. 0
  209. );
  210.  
  211.  
  212. COMMIT TRANSACTION TSaveMov
  213.  
  214.  
  215. END TRY
  216. BEGIN CATCH
  217. IF @@Trancount>0
  218. ROLLBACK TRANSACTION TSaveMov;
  219.  
  220. INSERT INTO dbo.Errores VALUES (
  221. SUSER_SNAME(),
  222. ERROR_NUMBER(),
  223. ERROR_STATE(),
  224. ERROR_SEVERITY(),
  225. ERROR_LINE(),
  226. ERROR_PROCEDURE(),
  227. ERROR_MESSAGE(),
  228. GETDATE()
  229. );
  230.  
  231. SET @OutResultCode=50005;
  232. END CATCH
  233. SET NOCOUNT OFF
  234. END
  1. USE [Tarea3]
  2. GO
  3.  
  4. SET ANSI_NULLS ON
  5. GO
  6. SET QUOTED_IDENTIFIER ON
  7. GO
  8. ALTER PROCEDURE [dbo].[SP_InsertarBeneficiario]
  9. @inIdCuenta INT
  10. ,@inTablaBeneficiarios TablaBeneficiarios READONLY
  11. ,@outresultCode INT
  12. AS
  13.  
  14. BEGIN
  15. SET NOCOUNT ON
  16. BEGIN TRY
  17.  
  18. DECLARE @BeneficiariosProcesar TABLE(
  19. sec INT IDENTITY (1,1)
  20. ,IdCuenta INT
  21. ,IdPersona INT
  22. ,IdParentezco INT
  23. ,Porcentaje INT
  24. )
  25. DECLARE @IdCuenta INT
  26. , @IdPersona INT
  27. , @IdParentezco INT
  28. , @Porcentaje INT
  29. , @lo INT
  30. , @hi INT
  31.  
  32. INSERT INTO @BeneficiariosProcesar(
  33. IdCuenta
  34. , IdPersona
  35. , IdParentezco
  36. , Porcentaje
  37. )SELECT
  38. IdCuenta
  39. ,IdPersona
  40. ,ParentezcoId
  41. ,Porcentaje
  42. FROM @inTablaBeneficiarios TB
  43. WHERE TB.IdCuenta = @inIdCuenta
  44.  
  45.  
  46.  
  47. SELECT @lo = MIN(sec), @hi = MAX(sec)
  48. FROM @BeneficiariosProcesar
  49.  
  50. WHILE @lo <= @hi
  51. BEGIN
  52. SELECT @IdCuenta = IdCuenta
  53. , @IdPersona = IdPersona
  54. , @IdParentezco = IdParentezco
  55. , @Porcentaje = Porcentaje
  56. FROM @BeneficiariosProcesar
  57. WHERE sec = @lo;
  58.  
  59.  
  60. BEGIN TRANSACTION TSaveMov
  61.  
  62. INSERT INTO dbo.Beneficiarios(
  63. IdCuenta
  64. ,IdPersona
  65. ,IdParentezco
  66. ,Porcentaje
  67. ,Activo
  68. )VALUES(
  69. @IdCuenta
  70. ,@IdPersona
  71. ,@IdParentezco
  72. ,@Porcentaje
  73. ,1
  74. );
  75.  
  76. COMMIT TRANSACTION TSaveMov;
  77. SET @lo = @lo +1
  78. END
  79. END TRY
  80. BEGIN CATCH
  81. IF @@Trancount>0
  82. ROLLBACK TRANSACTION TSaveMov;
  83. INSERT INTO dbo.Errores VALUES (
  84. SUSER_SNAME(),
  85. ERROR_NUMBER(),
  86. ERROR_STATE(),
  87. ERROR_SEVERITY(),
  88. ERROR_LINE(),
  89. ERROR_PROCEDURE(),
  90. ERROR_MESSAGE(),
  91. GETDATE()
  92. );
  93.  
  94. SET @OutResultCode=50005;
  95. END CATCH
  96.  
  97. SET NOCOUNT OFF
  98. END


  1. USE [Tarea3]
  2. GO
  3.  
  4. SET ANSI_NULLS ON
  5. GO
  6. SET QUOTED_IDENTIFIER ON
  7. GO
  8. ALTER PROCEDURE [dbo].[SP_InsertarAccionesCO]
  9. @inIdCuenta INT,
  10. @inTablaAccionesCO TablaAccionesCO READONLY,
  11. @inFecha DATE,
  12. @OutResultCode INT
  13. AS
  14. BEGIN
  15. SET NOCOUNT ON
  16. DECLARE @AccionesProcesar TABLE (
  17. sec INT IDENTITY(1,1)
  18. , IdCuenta INT
  19. , IdCO INT
  20. , HacerDeposito INT
  21. , HacerRedencion INT
  22. , DiaDeAhorro INT
  23. , FechaInicio DATE
  24. , FechaFin DATE
  25. , MontoDeposito INT
  26. , MontoInteres INT
  27. , SaldoCuenta INT
  28. , TipoInteres INT
  29. , SaldoCO INT
  30. , InteresAcumulado INT
  31. )
  32. DECLARE @lo INT
  33. ,@hi INT
  34. ,@IdCuenta INT
  35. ,@IdCO INT
  36. ,@HacerDeposito INT
  37. ,@HacerRedencion INT
  38. ,@MontoDeposito INT
  39. ,@MontoInteres INT
  40. ,@SaldoCuenta INT
  41. ,@TipoInteres INT
  42. ,@SaldoCO INT
  43. ,@InteresAcumulado INT
  44. ,@TempInteresAcumulado INT;
  45.  
  46. BEGIN TRY
  47.  
  48. INSERT INTO @AccionesProcesar(
  49. IdCuenta
  50. , IdCo
  51. , HacerDeposito
  52. , HacerRedencion
  53. , DiaDeAhorro
  54. , FechaInicio
  55. , FechaFin
  56. , MontoDeposito
  57. , MontoInteres
  58. , SaldoCuenta
  59. , TipoInteres
  60. , SaldoCO
  61. , InteresAcumulado
  62. )
  63. SELECT
  64. TAC.IdCuenta
  65. ,TAC.IdCO
  66. ,TAC.HacerDeposito
  67. ,TAC.HacerRedencion
  68. ,TAC.DiaDeAhorro
  69. ,TAC.FechaInicio
  70. ,TAC.FechaFin
  71. ,TAC.MontoDeposito
  72. ,TAC.MontoInteres
  73. ,C.Saldo
  74. ,DATEDIFF(MONTH,TAC.FechaInicio,TAC.FechaFin)
  75. , CO.Saldo
  76. , 0
  77. FROM @inTablaAccionesCO TAC
  78. INNER JOIN dbo.Cuentas C ON TAC.IdCuenta = C.Id
  79. INNER JOIN dbo.CuentasObjetivo CO ON TAC.IdCO = CO.Id
  80. WHERE TAC.IdCuenta = @inIdCuenta;
  81.  
  82.  
  83.  
  84. UPDATE @AccionesProcesar
  85. SET HacerDeposito = CASE WHEN (AC.SaldoCuenta - AC.MontoDeposito) >= 0 THEN 1 ELSE 0 END
  86. ,MontoInteres = (AC.SaldoCO * (TI.Interes * 100))/10000
  87. FROM @AccionesProcesar AC
  88. INNER JOIN dbo.TasaInteresCO TI ON AC.TipoInteres = TI.Id
  89. INNER JOIN dbo.CuentasObjetivo CO ON AC.IdCO = CO.Id
  90.  
  91.  
  92.  
  93. SELECT @lo = MIN(sec), @hi = MAX(sec) FROM @AccionesProcesar
  94. WHILE @lo <= @hi
  95. BEGIN
  96. SELECT @IdCO = IdCO FROM @AccionesProcesar
  97. WHERE sec = @lo;
  98.  
  99. SELECT @TempInteresAcumulado = MAX(NuevoInteresAcumulado)
  100. FROM dbo.MovimientosInteresCO
  101. WHERE IdCuentaCO = @IdCO;
  102.  
  103. SET @TempInteresAcumulado = CASE WHEN @TempInteresAcumulado IS NOT NULL THEN @TempInteresAcumulado ELSE 0 END;
  104.  
  105. UPDATE @AccionesProcesar
  106. SET InteresAcumulado = @TempInteresAcumulado
  107. WHERE sec = @lo;
  108.  
  109. SET @lo = @lo+1;
  110. END
  111.  
  112.  
  113.  
  114.  
  115. SELECT @lo = MIN(sec), @hi = MAX(sec) FROM @AccionesProcesar
  116.  
  117. WHILE @lo <= @hi
  118. BEGIN
  119. SELECT @IdCuenta = IdCuenta
  120. ,@IdCO = IdCO
  121. ,@HacerDeposito = HacerDeposito
  122. ,@HacerRedencion = HacerRedencion
  123. ,@MontoDeposito = MontoDeposito
  124. ,@MontoInteres = MontoInteres
  125. ,@SaldoCuenta =SaldoCuenta
  126. ,@TipoInteres = TipoInteres
  127. ,@SaldoCO = SaldoCO
  128. ,@InteresAcumulado = InteresAcumulado
  129. FROM @AccionesProcesar
  130. WHERE sec = @lo;
  131.  
  132. BEGIN TRANSACTION TSaveMov
  133. --INTERESES
  134. INSERT INTO dbo.MovimientosInteresCO(
  135. IdCuentaCO
  136. ,IdInteres
  137. ,Fecha
  138. ,Monto
  139. ,SaldoCO
  140. ,NuevoInteresAcumulado
  141. )VALUES(
  142. @IdCO
  143. ,@TipoInteres
  144. ,@inFecha
  145. ,@MontoInteres
  146. ,@SaldoCO
  147. ,@InteresAcumulado +@MontoInteres
  148. );
  149.  
  150. SET @InteresAcumulado = @InteresAcumulado + @MontoInteres;
  151. --INTERESES
  152.  
  153. --DEPOSITO
  154. INSERT INTO dbo.MovimientosCO(
  155. IdTipoMovimientoCO
  156. ,IdCuentaCO
  157. ,Fecha
  158. ,Monto
  159. ,NuevoSaldo
  160. )SELECT
  161. 1
  162. ,@IdCO
  163. ,@inFecha
  164. ,@MontoDeposito
  165. ,@SaldoCO+@MontoDeposito
  166. WHERE @HacerDeposito = 1;
  167.  
  168. INSERT INTO dbo.Movimientos(
  169. IdCambio
  170. ,IdMovimiento
  171. ,IdMoneda
  172. ,IdCuenta
  173. ,Monto
  174. ,Descripcion
  175. ,Fecha
  176. ,NuevoSaldo
  177. )SELECT
  178. 1
  179. ,14
  180. ,1
  181. ,@IdCuenta
  182. ,-1*@MontoDeposito
  183. ,'Aplicacion monto ahorro en cuenta a subcuenta objetivo'
  184. ,@inFecha
  185. ,@SaldoCuenta - @MontoDeposito
  186. WHERE @HacerDeposito = 1;
  187.  
  188. SET @SaldoCO = CASE WHEN @HacerDeposito = 1 THEN @SaldoCO+@MontoDeposito ELSE @SaldoCO END;
  189. SET @SaldoCuenta = CASE WHEN @HacerDeposito = 1 THEN @SaldoCuenta - @MontoDeposito ELSE @SaldoCuenta END;
  190.  
  191.  
  192. --
  193. UPDATE dbo.CuentasObjetivo
  194. SET Saldo = @SaldoCO
  195. WHERE @HacerDeposito = 1
  196. AND Id = @IdCO;
  197.  
  198. UPDATE dbo.Cuentas
  199. SET Saldo = @SaldoCuenta-@MontoDeposito
  200. WHERE @HacerDeposito = 1
  201. AND Id = @IdCuenta;
  202. --DEPOSITO
  203.  
  204. --REDENCION
  205. INSERT INTO dbo.MovimientosInteresCO(
  206. IdCuentaCO
  207. ,IdInteres
  208. ,Fecha
  209. ,Monto
  210. ,SaldoCO
  211. ,NuevoInteresAcumulado
  212. )SELECT
  213. @IdCO
  214. ,@TipoInteres
  215. ,@inFecha
  216. ,-1*@InteresAcumulado
  217. ,@SaldoCO
  218. ,0
  219. WHERE @HacerRedencion = 1;
  220.  
  221. INSERT INTO dbo.MovimientosCO(
  222. IdTipoMovimientoCO
  223. ,IdCuentaCO
  224. ,Fecha
  225. ,Monto
  226. ,NuevoSaldo
  227. )SELECT
  228. 2
  229. ,@IdCO
  230. ,@inFecha
  231. ,@InteresAcumulado
  232. ,@SaldoCO + @InteresAcumulado
  233. WHERE @HacerRedencion = 1;
  234.  
  235. SET @SaldoCO = CASE WHEN @HacerRedencion = 1 THEN @SaldoCO + @InteresAcumulado ELSE @SaldoCO END;
  236.  
  237. INSERT INTO dbo.MovimientosCO(
  238. IdTipoMovimientoCO
  239. ,IdCuentaCO
  240. ,Fecha
  241. ,Monto
  242. ,NuevoSaldo
  243. )SELECT
  244. 3
  245. ,@IdCO
  246. ,@inFecha
  247. ,-1*@SaldoCO
  248. ,0
  249. WHERE @HacerRedencion = 1;
  250.  
  251. INSERT INTO dbo.Movimientos(
  252. IdCambio
  253. ,IdMovimiento
  254. ,IdMoneda
  255. ,IdCuenta
  256. ,Monto
  257. ,Descripcion
  258. ,Fecha
  259. ,NuevoSaldo
  260. )SELECT
  261. 1
  262. ,15
  263. ,1
  264. ,@IdCuenta
  265. ,@SaldoCO
  266. ,'Redencion de subcuenta objetivo'
  267. ,@inFecha
  268. ,@SaldoCuenta + @SaldoCO
  269. WHERE @HacerRedencion = 1;
  270.  
  271. SET @SaldoCuenta = CASE WHEN @HacerRedencion = 1 THEN @SaldoCuenta + @SaldoCO ELSE @SaldoCuenta END;
  272.  
  273. UPDATE dbo.CuentasObjetivo
  274. SET Activo = 0,
  275. Saldo = 0
  276. WHERE Id = @IdCO
  277. AND @HacerRedencion = 1;
  278.  
  279. UPDATE dbo.Cuentas
  280. SET Saldo = @SaldoCuenta
  281. WHERE Id = @IdCuenta
  282. AND @HacerRedencion = 1;
  283. --REDENCION
  284.  
  285. COMMIT TRANSACTION TSaveMov
  286.  
  287. SET @lo = @lo +1;
  288. END
  289.  
  290. END TRY
  291. BEGIN CATCH
  292. IF @@Trancount>0
  293. ROLLBACK TRANSACTION TSaveMov;
  294.  
  295. INSERT INTO dbo.Errores VALUES (
  296. SUSER_SNAME(),
  297. ERROR_NUMBER(),
  298. ERROR_STATE(),
  299. ERROR_SEVERITY(),
  300. ERROR_LINE(),
  301. ERROR_PROCEDURE(),
  302. ERROR_MESSAGE(),
  303. GETDATE()
  304. );
  305.  
  306. SET @OutResultCode=50005;
  307. END CATCH
  308. SET NOCOUNT OFF
  309. END
  310.  
  311.  
  1. USE [Tarea3]
  2. GO
  3.  
  4. SET ANSI_NULLS ON
  5. GO
  6. SET QUOTED_IDENTIFIER ON
  7. GO
  8. ALTER PROCEDURE [dbo].[SP_InsertarMovimiento]
  9. @inIdCuenta INT,
  10. @inTablaMovimientos TablaMovimientos READONLY,
  11. @inFecha DATE,
  12. @OutResultCode INT
  13. AS
  14. BEGIN
  15. SET NOCOUNT ON
  16. DECLARE @MovimientosProcesar TABLE (
  17. sec INT IDENTITY(1,1)
  18. , Descripcion VARCHAR(32)
  19. , IdMoneda INT
  20. , Monto INT
  21. , IdCuenta INT
  22. , TipoMov INT
  23. , OpAtm INT
  24. , OpCaja INT
  25. , MonedaCuenta INT
  26. , HacerCambio INT
  27. , IdCambio INT
  28. , IdEC INT
  29. )
  30. DECLARE @lo INT
  31. ,@hi INT
  32. ,@Descripcion VARCHAR(32)
  33. ,@IdMoneda INT
  34. ,@Monto INT
  35. ,@IdCuenta INT
  36. ,@TipoMov INT
  37. ,@OpAtm INT
  38. ,@OpCaja INT
  39. ,@Cambio INT
  40. ,@Compra INT
  41. ,@Venta INT
  42. ,@IdUltimoCambio INT
  43. ,@IdCambio INT
  44. ,@SaldoAct INT
  45. ,@IdEC INT
  46. BEGIN TRY
  47.  
  48. INSERT INTO @MovimientosProcesar(
  49. Descripcion
  50. , IdMoneda
  51. , Monto
  52. , IdCuenta
  53. , TipoMov
  54. , OpAtm
  55. , OpCaja
  56. , MonedaCuenta
  57. , HacerCambio
  58. , IdCambio
  59. , IdEC
  60. )SELECT
  61. TM.Descripcion
  62. , TM.IdMoneda
  63. , TM.Monto
  64. , TM.IdCuenta
  65. , TM.TipoMov
  66. , 0
  67. , 0
  68. , TC.IdTipoMoneda
  69. , 0
  70. , 1
  71. , IdEC = MAX(EC.Id)
  72.  
  73. FROM @inTablaMovimientos TM
  74. INNER JOIN dbo.Cuentas C ON C.Id= TM.IdCuenta
  75. INNER JOIN dbo.TipoCuentaAhorro TC ON TC.Id = C.IdTipoCuenta
  76. INNER JOIN dbo.EstadoCuenta EC ON EC.idCuenta=C.Id
  77. WHERE TM.IdCuenta = @inIdCuenta
  78. GROUP BY TM.Descripcion
  79. , TM.IdMoneda
  80. , TM.Monto
  81. , TM.IdCuenta
  82. , TM.TipoMov
  83. , TC.IdTipoMoneda;
  84.  
  85.  
  86. UPDATE @MovimientosProcesar
  87. SET Monto = CASE WHEN T.Operacion = 1 THEN Monto ELSE -1*Monto END
  88. , OpAtm = CASE WHEN M.TipoMov = 6 THEN 1 ELSE 0 END
  89. , OpCaja = CASE WHEN M.TipoMov = 7 THEN 1 ELSE 0 END
  90. , HacerCambio = CASE WHEN M.IdMoneda != M.MonedaCuenta THEN 1 ELSE 0 END
  91. FROM @MovimientosProcesar M
  92. INNER JOIN dbo.TipoMovimiento T ON T.Id = M.TipoMov;
  93.  
  94. SELECT @lo = MIN(sec),@hi = MAX(sec)
  95. FROM @MovimientosProcesar;
  96.  
  97.  
  98. SELECT @IdUltimoCambio = MAX(Id) FROM dbo.TipoCambio;
  99.  
  100.  
  101.  
  102. SELECT @Compra = CB.Compra
  103. ,@Venta = CB.Venta
  104. FROM dbo.TipoCambio CB
  105. WHERE Id = @IdUltimoCambio;
  106.  
  107. UPDATE @MovimientosProcesar
  108. SET Monto = CASE WHEN MP.IdMoneda = 2 THEN Monto * @Compra ELSE Monto / @Venta END
  109. ,IdCambio = @IdUltimoCambio
  110. FROM @MovimientosProcesar MP
  111. WHERE HacerCambio = 1
  112.  
  113.  
  114.  
  115.  
  116. SELECT @lo = MIN(sec),@hi = MAX(sec)
  117. FROM @MovimientosProcesar;
  118.  
  119.  
  120. WHILE @lo <= @hi
  121. BEGIN
  122.  
  123. SELECT @Descripcion = MP.Descripcion
  124. ,@IdMoneda = MP.IdMoneda
  125. ,@Monto = MP.Monto
  126. ,@IdCuenta = MP.IdCuenta
  127. ,@TipoMov = MP.TipoMov
  128. ,@IdCambio = MP.IdCambio
  129. ,@OpAtm = MP.OpAtm
  130. ,@OpCaja = MP.OpCaja
  131. ,@SaldoAct = C.Saldo
  132. ,@IdEC = MP.IdEC
  133. FROM @MovimientosProcesar MP
  134. INNER JOIN dbo.Cuentas C ON C.Id = MP.IdCuenta
  135. WHERE sec = @lo;
  136.  
  137.  
  138.  
  139. SET @SaldoAct = @SaldoAct + @Monto
  140. BEGIN TRANSACTION TSaveMov
  141.  
  142.  
  143. INSERT INTO dbo.Movimientos(
  144. IdCambio
  145. ,IdMovimiento
  146. ,IdMoneda
  147. ,IdCuenta
  148. ,Monto
  149. ,Descripcion
  150. ,Fecha
  151. ,NuevoSaldo
  152. )VALUES(
  153. @IdCambio
  154. ,@TipoMov
  155. ,@IdMoneda
  156. ,@IdCuenta
  157. ,@Monto
  158. ,@Descripcion
  159. ,@inFecha
  160. ,@SaldoAct
  161. );
  162.  
  163. UPDATE dbo.Cuentas
  164. SET Saldo = @SaldoAct
  165. WHERE Id = @IdCuenta;
  166.  
  167. UPDATE dbo.EstadoCuenta
  168. SET
  169. OperacionesAtm = OperacionesAtm+@OpAtm,
  170. OperacionesPersona = OperacionesPersona + @OpCaja
  171. WHERE Id = @IdEC;
  172.  
  173. COMMIT TRANSACTION
  174. SET @lo = @lo+1;
  175. END
  176.  
  177. END TRY
  178. BEGIN CATCH
  179. IF @@Trancount>0
  180. ROLLBACK TRANSACTION TSaveMov;
  181.  
  182. INSERT INTO dbo.Errores VALUES (
  183. SUSER_SNAME(),
  184. ERROR_NUMBER(),
  185. ERROR_STATE(),
  186. ERROR_SEVERITY(),
  187. ERROR_LINE(),
  188. ERROR_PROCEDURE(),
  189. ERROR_MESSAGE(),
  190. GETDATE()
  191. );
  192.  
  193. SET @OutResultCode=50005;
  194. END CATCH
  195. SET NOCOUNT OFF
  196. END
  197.  



Comentarios

Entradas más populares de este blog

Revision de Base de Datos