none
Update, pago de una Amortización con clausula (IF-ELSE) RRS feed

  • 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

    viernes, 3 de agosto de 2018 20:34

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

    sábado, 4 de agosto de 2018 7: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
    jueves, 9 de agosto de 2018 5:22

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

    sábado, 4 de agosto de 2018 7:58
  • 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
    miércoles, 8 de agosto de 2018 21:24
  • 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
    jueves, 9 de agosto de 2018 5:22