Principales respuestas
Update, pago de una Amortización con clausula (IF-ELSE)

Pregunta
-
Buen dia, mi problema es el siguiente:
Tengo la siguiente tabla
en la cual debo realizar una amortización de la esa deuda con pagos diferentes a la Columna "TotalDeuda" Filtrado por CodigoPredio y por Estado, esto lo realice mediante excel pero necesito tenerlo en Sql Server para hacer una coneccion con visual studio
En la tabla de arriba seria la tabla que tendría en Sql mas una columna llamada Acumulado con la cual hago el descuento de la Cantidad = 120.000 pagada.Y en la tabla de abajo es como debe quedar.
este es el codigo que tengo hasta el momento:
use SistemaRecaudoTributario declare @Cantidad decimal (12,2)= 6387.64 ; with Ejemplo2 (id, CodigoPredio, Año, TotalDeuda, Acumulado, Estado) as ( select id, CodigoPredio, Año, TotalDeuda, SUM(SUM(TotalDeuda)) over (order by año asc) as Acumulado, Estado from Ejemplo where CodigoPredio ='010000120003000' and Estado <> 'Pago' group by id, CodigoPredio, año, totaldeuda, estado ) select * from Ejemplo2 if @Cantidad >= --(SELECT acumulado.ejemplo2)??? update --modifucar la tabla si????? begin print 'Si funciona' end
Si alguien me puede ayudar se lo agradecería mucho.
JorgeLeonardoDC
Respuestas
-
Hola JorgeLeonardoDC:
Puedes hacerlo con una idea similar a esta:
CREATE TABLE ejemplo (id INT IDENTITY(1, 1), codigoPredio VARCHAR(100), Año INT, TotalDeuda DECIMAL(12,2), estado VARCHAR(10) ); GO insert into ejemplo (codigoPredio, Año, TotalDeuda, estado) values ('01',2011,1000.00,'Debe'), ('01',2012,2000.00,'Debe'), ('02',2011,15000.00,'Debe'), ('03',2011,50000.00,'Debe'), ('03',2012,50500.00,'Debe'), ('03',2013,51500.00,'Debe'), ('03',2014,53000.00,'Debe'), ('03',2015,55000.00,'Debe'), ('03',2016,57500.00,'Debe'), ('03',2017,59000.00,'Debe'), ('03',2018,62000.00,'Debe') go DECLARE @tbl TABLE (id INT, codigoPredio VARCHAR(100), Año INT, TotalDeuda DECIMAL(12, 2), Acumulado DECIMAL(12, 2), Resultado DECIMAL(12, 2), estado VARCHAR(10) ); DECLARE @Cantidad FLOAT= 120000.00; WITH Ejemplo2(id, CodigoPredio, Año, TotalDeuda, Acumulado, Estado) AS ( SELECT id, CodigoPredio, Año, TotalDeuda, SUM(SUM(TotalDeuda)) OVER(ORDER BY año ASC) AS Acumulado, Estado FROM ejemplo WHERE CodigoPredio = '03' AND Estado <> 'Pago' GROUP BY id, CodigoPredio, año, totaldeuda, estado) INSERT INTO @tbl SELECT id, CodigoPredio, Año, TotalDeuda, Acumulado, 0, Estado FROM Ejemplo2; DECLARE @FILA INT= -1; SET @FILA = ( SELECT MIN(ID) AS FILA FROM @tbl WHERE Acumulado > @Cantidad ); IF @FILA IS NULL UPDATE @tbl SET TotalDeuda = 0, estado = 'Pago' WHERE CodigoPredio = '03' AND Estado <> 'Pago'; ELSE BEGIN UPDATE @tbl SET TotalDeuda = 0, estado = 'Pago' WHERE CodigoPredio = '03' AND Estado <> 'Pago' AND id < @FILA; UPDATE @tbl SET TotalDeuda = Acumulado - @Cantidad WHERE id = @fila; END; SELECT * FROM @tbl;
Lo he metido en una variable de tabla y las update las realizó en esta, no en Ejemplo, para que veas los resultados, sin modificar los datos.
Espero te ayude.
Un saludo
- Marcado como respuesta Pablo RubioModerator lunes, 6 de agosto de 2018 16:50
-
Hola JorgeLeonardoDC:
La update se puede realizar por ejemplo así:
IF @FILA IS NULL UPDATE ejemplo SET TotalDeuda = 0, estado = 'Pago' WHERE CodigoPredio = '03' AND Estado <> 'Pago'; ELSE BEGIN UPDATE ejemplo SET TotalDeuda = 0, estado = 'Pago' WHERE CodigoPredio = '03' AND Estado <> 'Pago' AND id < @FILA; UPDATE e SET e.TotalDeuda = t.Acumulado - @Cantidad from ejemplo e inner join @tbl t on e.id= t.id WHERE e.id = @fila; END; SELECT * FROM ejemplo;
Dado que tenemos un id, puedes relacionar una fila de una tabla con su identificador de la tabla de origen.
Lo que te ayudaría bastante, y sería supongo importante es cambiar la consulta por un procedure, que reciba como parámetro el importe.
create procedure sp_miejemplo (@CANTIDAD FLOAT) AS ….código del procedure return
Y luego el consumo, si es desde SQL
exec sp_miejemplo @CANTIDAD = 120000 /* o */ exec sp_miejemplo 120000
Un saludo
- Marcado como respuesta JorgeDiazC jueves, 9 de agosto de 2018 14:56
Todas las respuestas
-
Hola JorgeLeonardoDC:
Puedes hacerlo con una idea similar a esta:
CREATE TABLE ejemplo (id INT IDENTITY(1, 1), codigoPredio VARCHAR(100), Año INT, TotalDeuda DECIMAL(12,2), estado VARCHAR(10) ); GO insert into ejemplo (codigoPredio, Año, TotalDeuda, estado) values ('01',2011,1000.00,'Debe'), ('01',2012,2000.00,'Debe'), ('02',2011,15000.00,'Debe'), ('03',2011,50000.00,'Debe'), ('03',2012,50500.00,'Debe'), ('03',2013,51500.00,'Debe'), ('03',2014,53000.00,'Debe'), ('03',2015,55000.00,'Debe'), ('03',2016,57500.00,'Debe'), ('03',2017,59000.00,'Debe'), ('03',2018,62000.00,'Debe') go DECLARE @tbl TABLE (id INT, codigoPredio VARCHAR(100), Año INT, TotalDeuda DECIMAL(12, 2), Acumulado DECIMAL(12, 2), Resultado DECIMAL(12, 2), estado VARCHAR(10) ); DECLARE @Cantidad FLOAT= 120000.00; WITH Ejemplo2(id, CodigoPredio, Año, TotalDeuda, Acumulado, Estado) AS ( SELECT id, CodigoPredio, Año, TotalDeuda, SUM(SUM(TotalDeuda)) OVER(ORDER BY año ASC) AS Acumulado, Estado FROM ejemplo WHERE CodigoPredio = '03' AND Estado <> 'Pago' GROUP BY id, CodigoPredio, año, totaldeuda, estado) INSERT INTO @tbl SELECT id, CodigoPredio, Año, TotalDeuda, Acumulado, 0, Estado FROM Ejemplo2; DECLARE @FILA INT= -1; SET @FILA = ( SELECT MIN(ID) AS FILA FROM @tbl WHERE Acumulado > @Cantidad ); IF @FILA IS NULL UPDATE @tbl SET TotalDeuda = 0, estado = 'Pago' WHERE CodigoPredio = '03' AND Estado <> 'Pago'; ELSE BEGIN UPDATE @tbl SET TotalDeuda = 0, estado = 'Pago' WHERE CodigoPredio = '03' AND Estado <> 'Pago' AND id < @FILA; UPDATE @tbl SET TotalDeuda = Acumulado - @Cantidad WHERE id = @fila; END; SELECT * FROM @tbl;
Lo he metido en una variable de tabla y las update las realizó en esta, no en Ejemplo, para que veas los resultados, sin modificar los datos.
Espero te ayude.
Un saludo
- Marcado como respuesta Pablo RubioModerator lunes, 6 de agosto de 2018 16:50
-
Gracias Javi Fernandez F
Me funciona muy bien!pero tengo una una duda.
Como hago para hacer el UPDATE en la tabla Ejemplo ya que en esta no tengo la Columna Acumulado?
JorgeLeonardoDC
- Editado JorgeDiazC miércoles, 8 de agosto de 2018 22:58
-
Hola JorgeLeonardoDC:
La update se puede realizar por ejemplo así:
IF @FILA IS NULL UPDATE ejemplo SET TotalDeuda = 0, estado = 'Pago' WHERE CodigoPredio = '03' AND Estado <> 'Pago'; ELSE BEGIN UPDATE ejemplo SET TotalDeuda = 0, estado = 'Pago' WHERE CodigoPredio = '03' AND Estado <> 'Pago' AND id < @FILA; UPDATE e SET e.TotalDeuda = t.Acumulado - @Cantidad from ejemplo e inner join @tbl t on e.id= t.id WHERE e.id = @fila; END; SELECT * FROM ejemplo;
Dado que tenemos un id, puedes relacionar una fila de una tabla con su identificador de la tabla de origen.
Lo que te ayudaría bastante, y sería supongo importante es cambiar la consulta por un procedure, que reciba como parámetro el importe.
create procedure sp_miejemplo (@CANTIDAD FLOAT) AS ….código del procedure return
Y luego el consumo, si es desde SQL
exec sp_miejemplo @CANTIDAD = 120000 /* o */ exec sp_miejemplo 120000
Un saludo
- Marcado como respuesta JorgeDiazC jueves, 9 de agosto de 2018 14:56