none
Cambiar numero positivo a negativo RRS feed

  • Pregunta

  • necesito crear un store procedure de actualizacion

    Tabla Recibo

    Num_Recibo      Total

           25             10.00

    Tabla Recibo_Detalle

    Num_Recibo    Precio_1     Precio_2 

           25           10.00          0.00

    necesito hacer un update de la tabla Recibo como de la tabla Recibo_Detalle que me convierta los valores de positivo a negativo siempre que ese valor no sea 0.00 osea en este caso concreto me actualizaria el total de la tabla Recibo a         (Total) -10.00 y la tabla Recibo_Detalle a (Precio_1) -10.00 pero si fuera el caso que la tabla Recibo_Detalle tuviera (Precio_1)5.00 y (Precio_2) tambien me los pusiera (Precio_1) -5.00 y (Precio_2) -5.00, Gracias

    miércoles, 26 de septiembre de 2018 13:58

Respuestas

  • Hola efrain

    Según lo que explicas yo diría que solo multiplique tus campos por -1, no importa si es 0, el 0 no tiene signo pues no es un número ni positivo ni negativo.

    UPDATE Recibo SET Total = Total * -1 WHERE num_recibo = 25
    
    UPDATE Recibo_Detalle SET Precio_1 = Precio_1 * -1,Precio_2 = Precio_2 * -1 WHERE num_recibo = 25

    Ahora bien si existiesen monto negativos que no quieres alterar, es decir talvez tengas precio_1 = -5 y al actualizar multiplicas por -1 entonces quedaría precio_1 = 5, para evitar eso solo hay que poner un condicional   

    UPDATE Recibo SET Total = Total * (CASE WHEN Total>0 THEN -1 ELSE 1 END)
    WHERE num_recibo = 25
    
    UPDATE Recibo_Detalle SET 
        Precio_1 = Precio_1 * (CASE WHEN Precio_1>0 THEN -1 ELSE 1 END),
        Precio_2 = Precio_2 * (CASE WHEN Precio_2>0 THEN -1 ELSE 1 END),
    WHERE num_recibo = 25

    ¡Saludos!


    • Editado Yerald Mora miércoles, 26 de septiembre de 2018 14:20 Añadir excepción para negativos
    • Marcado como respuesta Efrain Diaz miércoles, 26 de septiembre de 2018 15:03
    miércoles, 26 de septiembre de 2018 14:13
  • Hola Efrain Diaz:

    CREATE TABLE recibo
    (num_recibo INT,
     total      FLOAT
    );
    CREATE TABLE recibo_detalle
    (num_Recibo INT,
     precio_1   FLOAT,
     precio_2   FLOAT
    );
    GO
    INSERT INTO recibo
    (num_recibo,
     total
    )
    VALUES
    (25,
     10.00
    );
    GO
    INSERT INTO recibo_detalle
    (num_Recibo,
     precio_1,
     precio_2
    )
    VALUES
    (25,
     10.00,
     0.00
    );
    GO
    CREATE PROCEDURE sp_actualizarRecibos(@recibo INT)
    AS
         DECLARE @total FLOAT=
    (
        SELECT total
        FROM Recibo
        WHERE num_recibo = @recibo
    );
         UPDATE Recibo
           SET
               total = CASE
                           WHEN total > 0
                           THEN ABS(total) * -1
                           ELSE(total) - 10
                       END
         WHERE num_recibo = @recibo;
         UPDATE recibo_detalle
           SET
               precio_1 = (CASE
                               WHEN @total <> 0
                               THEN(CASE
                                        WHEN precio_1 = -5
                                        THEN(precio_1) - 5
                                    END)
                               ELSE(precio_1) - 10
                           END)
         WHERE num_Recibo = @recibo;
         RETURN;
    

    También podrías sin recibir el parametro, relacionar en la update, las dos tablas.
    Pero básicamente, es utilizar el case para las condiciones, de tu lógica.

    Espero te sirva.

    • Marcado como respuesta Efrain Diaz miércoles, 26 de septiembre de 2018 15:03
    miércoles, 26 de septiembre de 2018 14:15

Todas las respuestas

  • Hola efrain

    Según lo que explicas yo diría que solo multiplique tus campos por -1, no importa si es 0, el 0 no tiene signo pues no es un número ni positivo ni negativo.

    UPDATE Recibo SET Total = Total * -1 WHERE num_recibo = 25
    
    UPDATE Recibo_Detalle SET Precio_1 = Precio_1 * -1,Precio_2 = Precio_2 * -1 WHERE num_recibo = 25

    Ahora bien si existiesen monto negativos que no quieres alterar, es decir talvez tengas precio_1 = -5 y al actualizar multiplicas por -1 entonces quedaría precio_1 = 5, para evitar eso solo hay que poner un condicional   

    UPDATE Recibo SET Total = Total * (CASE WHEN Total>0 THEN -1 ELSE 1 END)
    WHERE num_recibo = 25
    
    UPDATE Recibo_Detalle SET 
        Precio_1 = Precio_1 * (CASE WHEN Precio_1>0 THEN -1 ELSE 1 END),
        Precio_2 = Precio_2 * (CASE WHEN Precio_2>0 THEN -1 ELSE 1 END),
    WHERE num_recibo = 25

    ¡Saludos!


    • Editado Yerald Mora miércoles, 26 de septiembre de 2018 14:20 Añadir excepción para negativos
    • Marcado como respuesta Efrain Diaz miércoles, 26 de septiembre de 2018 15:03
    miércoles, 26 de septiembre de 2018 14:13
  • Hola Efrain Diaz:

    CREATE TABLE recibo
    (num_recibo INT,
     total      FLOAT
    );
    CREATE TABLE recibo_detalle
    (num_Recibo INT,
     precio_1   FLOAT,
     precio_2   FLOAT
    );
    GO
    INSERT INTO recibo
    (num_recibo,
     total
    )
    VALUES
    (25,
     10.00
    );
    GO
    INSERT INTO recibo_detalle
    (num_Recibo,
     precio_1,
     precio_2
    )
    VALUES
    (25,
     10.00,
     0.00
    );
    GO
    CREATE PROCEDURE sp_actualizarRecibos(@recibo INT)
    AS
         DECLARE @total FLOAT=
    (
        SELECT total
        FROM Recibo
        WHERE num_recibo = @recibo
    );
         UPDATE Recibo
           SET
               total = CASE
                           WHEN total > 0
                           THEN ABS(total) * -1
                           ELSE(total) - 10
                       END
         WHERE num_recibo = @recibo;
         UPDATE recibo_detalle
           SET
               precio_1 = (CASE
                               WHEN @total <> 0
                               THEN(CASE
                                        WHEN precio_1 = -5
                                        THEN(precio_1) - 5
                                    END)
                               ELSE(precio_1) - 10
                           END)
         WHERE num_Recibo = @recibo;
         RETURN;
    

    También podrías sin recibir el parametro, relacionar en la update, las dos tablas.
    Pero básicamente, es utilizar el case para las condiciones, de tu lógica.

    Espero te sirva.

    • Marcado como respuesta Efrain Diaz miércoles, 26 de septiembre de 2018 15:03
    miércoles, 26 de septiembre de 2018 14:15