Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Uso de Old en un Trigger

Estas en el tema de Uso de Old en un Trigger en el foro de Mysql en Foros del Web. Hola a todos, quisiera saber si en Mysql 6 todavia se puede usar la palabra reservada OLD en un trigger, pues resulta que estoy creando ...
  #1 (permalink)  
Antiguo 28/03/2014, 17:14
 
Fecha de Ingreso: noviembre-2010
Mensajes: 13
Antigüedad: 13 años, 5 meses
Puntos: 0
Uso de Old en un Trigger

Hola a todos, quisiera saber si en Mysql 6 todavia se puede usar la palabra reservada OLD en un trigger, pues resulta que estoy creando uno que se me active cuando se actualice o elimine un registro en una tabla, pero lo raro es que me da error precisamente al ejecutar esa sentencia; la duda surge a raiz de que la palabra reservada NEW si la reconoce por el hecho de que le cambia el color a azul automaticamente pero con la palabra OLD no pasa nada me la deja igual como que no fuera reservada, y me da error. Les agradecere mucho si me pueden orientar o dar mas informacion para resolver este problema. Saludos.

Este es el Trigger

Código SQL:
Ver original
  1. CREATE TRIGGER TgVentasAct AFTER UPDATE ON Ventas
  2. FOR EACH ROW
  3. BEGIN
  4.  
  5.         DECLARE Devuelto INT;
  6.         Devuelto=OLD.Cantidad-NEW.Cantidad; #(EN ESTA LINEA ME MUESTRA EL ERROR POR LA PALABRA RESERVADA OLD QUE NO LA RECONOCE)
  7.         UPDATE Inventario SET Existencia=Existencia+Devuelto WHERE idProducto=NEW.Id_Producto;
  8.         INSERT INTO Movimientos (idTipoMov,IdProducto,Fecha,Cantidad) VALUES (5,NEW.Id_Producto,Now(),NEW.Cantidad);
  9. END;

Última edición por gnzsoloyo; 28/03/2014 a las 17:27
  #2 (permalink)  
Antiguo 28/03/2014, 17:31
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Uso de Old en un Trigger

Es un error en la definición del TRIGGER, lo estás creando para ejecutarse antes del UPDATE, y en ese caso el estado del registro no admite la existencia de OLD, porque aún está vigente.
Cita:
Within the trigger body, you can refer to columns in the subject table (the table associated with the trigger) by using the aliases OLD and NEW. OLD.col_name refers to a column of an existing row before it is updated or deleted. NEW.col_name refers to the column of a new row to be inserted or an existing row after it is updated.
PAra que te funcione el trigger debe ser BEFORE UPDATE, no AFTER.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 28/03/2014, 18:06
 
Fecha de Ingreso: noviembre-2010
Mensajes: 13
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Uso de Old en un Trigger

Hola gracias por tu comentario, pues si no estoy mal el AFTER se dispara despues de que se actualice la tabla y el BEFORE antes de que esto ocurra (Segun documentacion de Mysql), aun asi realice el cambio y el error persiste, el problema que yo veo es como mencione anteriormente la palabra aparantemente reserveda OLD no cambia de color (azul en mi editor) cosa que si sucede con New, entonces estoy dudando sera que la palabra reservada sigue siendo OLD o por la version del Mysql ya le cambiaron el nombre. No se yo pienso que por ahi va la cosa pero no termino de entender.

Asi quedo el Trigger:

Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. USE 'Farmacia'$$
  4.  
  5. CREATE TRIGGER TgVentasAct BEFORE UPDATE ON Ventas
  6.  
  7.         Declare Devuelto INT;
  8.         Devuelto=Old.Cantidad-New.Cantidad;
  9.         Update Inventario set Existencia=Existencia+Devuelto where idProducto=New.Id_Producto;
  10.         Insert Into Movimientos (idTipoMov,IdProducto,Fecha,Cantidad) values (5,New.Id_Producto,Now(),New.Cantidad);
  11. $$
  12. DELIMITER;

El error que me da es este:


Script line: 5 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '=Old.Cantidad-New.Cantidad;
Update Inventario set Existencia=Existencia+Devue' at line 6

Gracias.

Última edición por gnzsoloyo; 28/03/2014 a las 19:19
  #4 (permalink)  
Antiguo 28/03/2014, 19:25
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Uso de Old en un Trigger

Ajá...

¿Y el SET, dónde lo pusiste?

Te recomiendo usar alguna herramienta con analizador sintáctico, como por ejemplo MySQL Workbench.
Te ahorrarás errores básicos.

Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. CREATE TRIGGER farmacia.TgVentasAct BEFORE UPDATE ON farmacia.Ventas
  4.  
  5.         DECLARE Devuelto INT;
  6.         SET Devuelto=Old.Cantidad-New.Cantidad;
  7.         UPDATE Inventario SET Existencia=Existencia+Devuelto WHERE idProducto=New.Id_Producto;
  8.         INSERT INTO Movimientos (idTipoMov,IdProducto,Fecha,Cantidad) VALUES (5,New.Id_Producto,NOW(),New.Cantidad);
  9. END$$
  10.  
  11. DELIMITER ;
Además, no debes confundir los apóstrofos (') con los acentos agudos (`).
Los primeros se usan para cadenas de texto, los segundos para nombres de objetos como bases, tablas, columnas, etc. El nombre de una base no se pone entre apóstrofos.
Mal:
Código MySQL:
Ver original
  1. USE 'Farmacia'
Bien:
Código MySQL:
Ver original
  1. USE Farmacia
Bien:
Código MySQL:
Ver original
  1. USE `Farmacia`
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 28/03/2014, 21:49
 
Fecha de Ingreso: noviembre-2010
Mensajes: 13
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Uso de Old en un Trigger

Perfecto ese era el problema gracias, fijate que soy relativamente nuevo en el uso de Mysql, y quisiera ver si me puedes ayudar con otra cosa si no es tanta la molestia, quiero asignar el campo que me resulta de una consulta condicionada a una variable, ya probe de los dos maneras pero no me funciona, no se cual es la sintaxis en Mysql para hacer eso, el codigo que he probado y no funciona es el siguiente:

Forma 1:

CREATE TRIGGER TgComprasAg AFTER INSERT ON Detalle_Compra
FOR EACH ROW
BEGIN
DECLARE Numero as INT;
Select count(*) Into Numero from Detalle_Lote where IdProducto=New.id_Producto and IdLote=New.idLote;
END;
$$
DELIMITER;

Forma 2:

CREATE TRIGGER TgComprasAg AFTER INSERT ON Detalle_Compra
FOR EACH ROW
BEGIN
DECLARE Numero as INT;
Set Numero=Select count(*) from Detalle_Lote where IdProducto=New.id_Producto and IdLote=New.idLote;
END;
$$
DELIMITER;

Marque con negrita la sentencia de asignacion que no me funciona, desde ya gracias por la ayuda.
  #6 (permalink)  
Antiguo 29/03/2014, 08:19
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Uso de Old en un Trigger

Aclarame una cosa: ¿No te funciona porque dispara un error, o porque no cumple con lo que quieres?

Por otro lado, no me queda claro qué haces con ese "Numero" después. Depende de para qué lo uses y cómo te funcionará o no.

Por lo pronto, las dos formas funcionan, aunque la segunda se debería escribir de otro modo:

Caso 1:
Código MySQL:
Ver original
  1. CREATE TRIGGER TgComprasAg AFTER INSERT ON Detalle_Compra
  2.     DECLARE Numero as INT;
  3.     SELECT COUNT(*)
  4.     FROM Detalle_Lote
  5.     WHERE IdProducto=NEW.id_Producto AND IdLote=NEW.idLote
  6.     INTO Numero;
  7.     -- Por las dudas...
  8.     IF Numero IS NULL THEN
  9.         SET Numero = 0;
  10.     END IF;
  11. END$$
DELIMITER ;

Caso 2:
Código MySQL:
Ver original
  1. CREATE TRIGGER TgComprasAg AFTER INSERT ON Detalle_Compra
  2.     DECLARE Numero as INT;
  3.     SET Numero = (SELECT COUNT(*)
  4.         FROM Detalle_Lote
  5.         WHERE IdProducto=NEW.id_Producto AND IdLote=NEW.idLote);
  6.     -- Por las dudas...
  7.     IF Numero IS NULL THEN
  8.         SET Numero = 0;
  9.     END IF;
  10. END$$
  11. -- Deja un espacio luego del DELIMITER, de lo contrario marcará errores.
  12. DELIMITER;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 29/03/2014, 18:15
 
Fecha de Ingreso: noviembre-2010
Mensajes: 13
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Uso de Old en un Trigger

Hola "gnzsoloyo" pues te comento que la sentencia la puse con la finalidad de no ingresar datos repetidos mi tabla detalle_lote, por ello lo que pretendo con la variable numero es asignarle a estar el conteo (count (*)) de todos los registros que tienen el mismo numero de lote y numero de producto para que en caso ya exista uno, solo se actualice, de lo contrario se inserte uno nuevo, te adjunto nuevamente el codigo:

DELIMITER $$

USE Farmacia $$

CREATE TRIGGER TgComprasAg AFTER INSERT ON Detalle_Compra
FOR EACH ROW
BEGIN
DECLARE Numero INT;

SELECT COUNT(*) INTO Numero FROM Detalle_Lote WHERE IdLote=NEW.idLote AND IdProducto=NEW.Id_Producto;
IF Numero>0 THEN
UPDATE Inventario SET Existencia=Existencia+NEW.Cantidad WHERE idProducto=NEW.Id_Producto;
INSERT INTO Movimientos (idTipoMov,IdProducto,Fecha,Cantidad) VALUES (2,NEW.Id_Producto,Now(),NEW.Cantidad);
ELSEIF Numero=0 THEN
UPDATE Inventario SET Existencia=Existencia+NEW.Cantidad WHERE idProducto=NEW.Id_Producto;
INSERT INTO Detalle_Lote(IdProducto,IdLote,Fechaingreso) VALUES (NEW.Id_Producto,NEW.idLote,Now());
INSERT INTO Movimientos (idTipoMov,IdProducto,Fecha,Cantidad) VALUES (2,NEW.Id_Producto,Now(),NEW.Cantidad);
END IF;

END;
$$

DELIMITER;

No se si estoy poniendo mal la condicion, pero lo que pretendo con ella es verificar si numero es mayor que 0, quiere decir que ya existe un registro con los datos que estoy ingresando y solo actualizo tabla inventario de lo contrario si es igual a 0, aparte de actualizarme la tabla que me inserte un nuevo registro en detalle_lote.

Te agradecere mucho tu ayuda.

Etiquetas: registro, sql, tabla, trigger
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:26.