Ver Mensaje Individual
  #1 (permalink)  
Antiguo 09/06/2010, 02:18
DilakV
 
Fecha de Ingreso: diciembre-2009
Mensajes: 19
Antigüedad: 14 años, 4 meses
Puntos: 0
Trigger Insert After Update

Al grano...

El problema se plantea de la siguiente manera.

Existe una tabla de productos. Y tiene varios campos, pero solo señalaré los que me interesan en la resolucion del problema.

Una tabla de productos tiene los campos.

Nombre de Producto (nombrep), Precio de Compra (preciocompra), y Precio de Venta.

La operación debería ser poder capaz de capturar "solo" el nombre del producto y el precio de compra, y automaticamente generar el precio de venta que sería igual a

Precio de compra + 15%.

El camino que imagine para resolverlo fue, que se insertarán los datos, y despues de que se hubieran insertado, actualizar el precio de venta.

Un trigger llama a un Stored Procedure.

Crear la BD y la tabla
Código MySQL:
Ver original
  1. create database laprueba;
  2.  
  3. create table laprueba(nombrep varchar(20), preciocompra decimal(6,2), precioventa decimal(6,2));

El Stored Procedure
Código MySQL:
Ver original
  1. DELIMITER $$
  2. DROP PROCEDURE IF EXISTS `examenextra`.`pstored`$$
  3. CREATE PROCEDURE `examenextra`.`pstored` (in nomp varchar(20), in preciov decimal(6,2))
  4.  
  5. update laprueba
  6. set laprueba.precioventa = preciov
  7. where nombrep = nomp;
  8.  
  9. END$$
  10. DELIMITER ;

El Trigger
Código MySQL:
Ver original
  1. DELIMITER $$
  2. DROP TRIGGER IF EXISTS `examenextra`.`ponpreven`$$
  3. CREATE TRIGGER `examenextra`.`ponpreven` before INSERT on `examenextra`.`laprueba`
  4.   DECLARE preciov decimal;
  5.   DECLARE CONTINUE HANDLER FOR NOT FOUND SET preciov = 0;
  6.   select preciocompra*(0.15) into preciov from laprueba where nombrep = new.nombrep;
  7.  call pstored(new.nombrep, preciov);
  8. END$$
  9. DELIMITER ;

Según yo, esto deberia funcionar, como estoy aquí, esto logicamente no funciona. Despues de ejecutar la consulta

Código MySQL:
Ver original
  1. insert into laprueba values("algo", 120, 0);

El error que arroja es el siguiente:

Código ErrorMySQL:
Ver original
  1. Can't update table 'laprueba' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

También se que cuando se está insertando la tabla está bloqueada o algo así. Tengo nociones de lo que le sucede a la tabla. Pero honestamente no me interesa mucho, me interesa más como realizar esas acciones sin obtener el error, o alguna manera alternativa de hacerlo, pero igual usando stored y triggers.

¿Alguna idea?

Muchas gracias.

Última edición por DilakV; 09/06/2010 a las 07:34