Principales respuestas
Cambiar numero positivo a negativo

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
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
-
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
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
-
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