Ver Mensaje Individual
  #15 (permalink)  
Antiguo 03/02/2015, 09:56
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: Problema con triggers

Disculpa,pero el problema es que no estás estudiando el manual de referencia para escribir rutinas almacenadas... En serio. Son errores de manual.

Código MySQL:
Ver original
  1. CREATE TRIGGER `actualizarObra2`
  2. AFTER UPDATE ON `detalle_obra`
  3. if NEW.estado = 1 THEN
  4.     UPDATE obra
  5.         SET `egresos_t`= obra.egresos_t + (NEW.egresos - OLD.egresos),
  6.         `ingresos_t` = obra.ingresos_t + (NEW.ingresos - OLD.ingresos),
  7.         `recepcion_t`= obra.recepcion_t + (NEW.recepcion - OLD.recepcion) ,
  8.         `combustible_recepcion_t`= obra.combustible_recepcion_t + (NEW.combustible_recepcion - OLD.combustible_recepcion),
  9.         `combustible_emision_t` = obra.combustible_emision_t + (NEW.combustible_emision - OLD.combustible_emision)
  10.     WHERE obra.codigo = OLD.cod_obra
  11.     END; # ESTO ESTÁ DE MÁS
  12.     END IF;
  13.     if NEW.estado = 0 THEN
  14.         UPDATE obra SET `egresos_t`= obra.egresos_t - OLD.egresos,
  15.         `ingresos_t` = obra.ingresos_t - OLD.ingresos,
  16.         `recepcion_t`= obra.recepcion_t - OLD.recepcion,
  17.         `combustible_recepcion_t`= obra.combustible_recepcion_t - OLD.combustible_recepcion,
  18.         `combustible_emision_t` = obra.combustible_emision_t - OLD.combustible_emision
  19.     WHERE obra.codigo = OLD.cod_obra # NO PUEDEN EXISTIR DOS WHERE EN UNA MISMA SENTENCIA!
  20.     WHERE obra.codigo = NEW.cod_obra
  21.     END; # ESTO ESTÁ DE MÁS
  22.  
Además, toda rutina (procedure, function, trigger, event) que contenga un conjunto de sentencias debe forzosamente estar contenido en un bloque BEGIN / END, y no lo estás haciendo.

Código MySQL:
Ver original
  1. CREATE TRIGGER `actualizarObra2`
  2. AFTER UPDATE ON `detalle_obra`
  3.     IF NEW.estado = 1 THEN
  4.         UPDATE obra
  5.             SET `egresos_t`= obra.egresos_t + (NEW.egresos - OLD.egresos),
  6.             `ingresos_t` = obra.ingresos_t + (NEW.ingresos - OLD.ingresos),
  7.             `recepcion_t`= obra.recepcion_t + (NEW.recepcion - OLD.recepcion) ,
  8.             `combustible_recepcion_t`= obra.combustible_recepcion_t + (NEW.combustible_recepcion - OLD.combustible_recepcion),
  9.             `combustible_emision_t` = obra.combustible_emision_t + (NEW.combustible_emision - OLD.combustible_emision)
  10.         WHERE obra.codigo = OLD.cod_obra
  11.     ELSE
  12.         UPDATE obra
  13.             SET `egresos_t`= obra.egresos_t - OLD.egresos,
  14.             `ingresos_t` = obra.ingresos_t - OLD.ingresos,
  15.             `recepcion_t`= obra.recepcion_t - OLD.recepcion,
  16.             `combustible_recepcion_t`= obra.combustible_recepcion_t - OLD.combustible_recepcion,
  17.             `combustible_emision_t` = obra.combustible_emision_t - OLD.combustible_emision
  18.         WHERE obra.codigo = OLD.cod_obra
  19.     END IF;
No puedo garantizarte que eso funcione, proque yo le veo algunos problemas de lógica...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)