Tema: Trigger
Ver Mensaje Individual
  #2 (permalink)  
Antiguo 15/02/2016, 06:13
Avatar de gnzsoloyo
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: Trigger

En principio, habría que analizar el INSERT que ejecutas para el detalle. Si ese INSERT usa la tabla PRODUCTOS en alguna forma, entonces no puedes utilizarla en este trigger. En caso de no ser eso, hay que revisar todos los SP y triggers que puedan estar involucrados en la operación, ya que puede haber un bloqueo en alguna etapa no visible.
Este tipo de entrecruzamientos de triggers no es tan raro como parece. Si abusas innecesariamente de los TRIGGERs es fácil que aparezcan interbloqueos de difícil diagnóstico. Tienes que tener muy en cuenta que un SELECT en una subconsulta que alimenta un INSERT/UPDATE, o bien un TRIGGER que ejecute una lectura de una tabla cualquiera, genera un bloqueo de escritura en esa tabla.

Por otro lado, hay un error de lógica: Los productos a entregar en una venta se deben reservar al momento de insertarse en la factura, pero sólo deben restarse al emitir el comprobante de venta/cobro.
Si la factura es el comprobante de venta, se hace entonces con el alta del pago en la caja.
La idea es que:
1) Sólo al emitir el pago el cliente el cliente se hace dieño del bien adquirido.
2) El bien en stock debe ser reservado para evitar que una venta en curso iniciada después de esta, lo elimine del stock antes de completar la venta.

Eso es a nivel sistema.

Por lo demás, esta línea es innecesaria:
Código MySQL:
Ver original
  1. SET vstock = (SELECT stock FROM productos WHERE id_producto=NEW.id_producto);
Puedes escribirlo asi:
Código MySQL:
Ver original
  1. DELIMITER $$
  2. DROP TRIGGER IF EXISTS actualizar_stock$$
  3. CREATE TRIGGER actualizar_stock AFTER INSERT ON detalles FOR EACH ROW
  4.  
  5.  
  6.     UPDATE productos SET stock = stock - NEW.cantidad
  7.     WHERE id_producto=NEW.id_producto;
  8.  
  9. END $$
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)