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

[SOLUCIONADO] Problema con triggers

Estas en el tema de Problema con triggers en el foro de Mysql en Foros del Web. Buenas, necesito desarrollar un trigger para una bd en la cual tengo una tabla llamada detalle_Obra en la cual al momento de agregar un valor ...
  #1 (permalink)  
Antiguo 03/02/2015, 05:52
 
Fecha de Ingreso: enero-2015
Ubicación: Valparaiso
Mensajes: 88
Antigüedad: 9 años, 3 meses
Puntos: 0
Problema con triggers

Buenas, necesito desarrollar un trigger para una bd en la cual tengo una tabla llamada detalle_Obra en la cual al momento de agregar un valor a las variables egresos, ingresos y recepcion, la respectiva obra actualice sus datos también (egresos_t, ingresos_t, recepcion_t). creo que debería ser algo así:
Código MySQL:
Ver original
  1. UPDATE obra SET(`egresos_t`, `ingresos_t`, `recepcion_t`, `combustible_recepcion_t`,
  2. `combustible_emision_t`) VALUES (obra.egresos_t +
  3. NEW.egresos, obra.ingresos_t + NEW.ingresos, obra.recepcion_t +  NEW.recepcion,
  4. obra.combustible_recepcion_t + NEW.combustible_recepcion, obra.combustible_emision_t + NEW.combustible_emision)
  5. WHERE obra.codigo = NEW.cod_obra;
No puse delimiters y todo el protocolo porque estoy trabajando con php myadmin
BD:
  #2 (permalink)  
Antiguo 03/02/2015, 05:58
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, 4 meses
Puntos: 2658
Respuesta: Problema con triggers

Lo que tienes es errores en la sentencia UPDATE. Está simplemente mal escrita.
Vamos al manual de referencia:
Cita:
13.2.11 UPDATE Syntax

Single-table syntax:

Código MySQL:
Ver original
  1. UPDATE [LOW_PRIORITY] [IGNORE] table_reference
  2.     SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
  3.     [WHERE where_condition]
  4.     [ORDER BY ...]

Multiple-table syntax:

Código MySQL:
Ver original
  1. UPDATE [LOW_PRIORITY] [IGNORE] table_references
  2.     SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
  3.     [WHERE where_condition]
¿Dónde ves que esté la cláusula VALUES?

...



Exacto: En ninguna parte.

Corrige la sintaxis, prueba de nuevo y si aparecen problemas, dinos qué emnsajes se visualizan.
__________________
¿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 03/02/2015, 06:27
 
Fecha de Ingreso: enero-2015
Ubicación: Valparaiso
Mensajes: 88
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Problema con triggers

Código MySQL:
Ver original
  1. UPDATE obra SET(`egresos_t`= obra.egresos_t + NEW.egresos, `ingresos_t` = obra.ingresos_t +
  2. NEW.ingresos,
  3. `recepcion_t`= obra.recepcion_t +  NEW.recepcion, `combustible_recepcion_t`= obra.combustible_recepcion_t +
  4. NEW.combustible_recepcion, `combustible_emision_t` = obra.combustible_emision_t +
  5. NEW.combustible_emision)
  6.  WHERE obra.codigo = NEW.cod_obra;

me da error de sintaxis (error 1064), al parecer es dentro del "SET"


Última edición por gnzsoloyo; 03/02/2015 a las 06:34
  #4 (permalink)  
Antiguo 03/02/2015, 06:36
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, 4 meses
Puntos: 2658
Respuesta: Problema con triggers

Vuelvo a lo que te dije: Manual de referencia...

¿Donde ves que se usen paréntesis para agrupar los campos afectadospor el SET?

En ninguna parte.

La sintaxis de UPDATE en MySQL es del ANSI-SQL, es decir, es estandar. Se usa igual en todos los DBMS...

Por favor, lee con cuidado los ejemplos del manual, y algun que otro tutorial.
__________________
¿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 03/02/2015, 06:44
 
Fecha de Ingreso: enero-2015
Ubicación: Valparaiso
Mensajes: 88
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Problema con triggers

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Vuelvo a lo que te dije: Manual de referencia...

¿Donde ves que se usen paréntesis para agrupar los campos afectadospor el SET?

En ninguna parte.

La sintaxis de UPDATE en MySQL es del ANSI-SQL, es decir, es estandar. Se usa igual en todos los DBMS...

Por favor, lee con cuidado los ejemplos del manual, y algun que otro tutorial.
ya lo solucione, me estaba confundiendo ya que lo estaba haciendo de otra forma anteriormente, ademas los manuales son bastante complicados de entender, es mejor un ejemplo y se entiende mucho mejor. Gracias por la ayuda, dejo la solucion:
Código MySQL:
Ver original
  1. UPDATE obra SET `egresos_t`= obra.egresos_t + NEW.egresos, `ingresos_t` = obra.ingresos_t + NEW.ingresos,
  2. `recepcion_t`= obra.recepcion_t +  NEW.recepcion, `combustible_recepcion_t`= obra.combustible_recepcion_t +
  3. NEW.combustible_recepcion, `combustible_emision_t` = obra.combustible_emision_t + NEW.combustible_emision
  4. WHERE obra.codigo = NEW.cod_obra

Última edición por gnzsoloyo; 03/02/2015 a las 06:49
  #6 (permalink)  
Antiguo 03/02/2015, 07:26
 
Fecha de Ingreso: enero-2015
Ubicación: Valparaiso
Mensajes: 88
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Problema con triggers

Vuelvo a consultar acá ya que me surgió un inconveniente, cree otro trigger para cuando la tabla detalle_Obra fuera actualizada, los cambios se vieran en obra hasta ahí todo bien pero el problema surgió al crear el trigger para cuando las tablas detalle_Obra fueran eliminadas ya que en ningún momento elimino realmente los valores si no que cambio el atributo "estado" a cero y no se vuelven a visualizar. Esto me genera problemas ya que existen 2 tipos de actualización (la real y la supuesta eliminación). ¿Como puedo diferenciar cada UPDATE?
  #7 (permalink)  
Antiguo 03/02/2015, 08:01
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, 4 meses
Puntos: 2658
Respuesta: Problema con triggers

Tendrás que programar todo dentro del mismo trigger, lo que significa que deberás analizar los datos entrantes y determinar a partir de eso qué UPDATE debe ejecutarse.
No se admiten triggers sobre el mismo evento, por lo que todo pasará por lo que recibe la tabla.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 03/02/2015, 08:19
 
Fecha de Ingreso: enero-2015
Ubicación: Valparaiso
Mensajes: 88
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Problema con triggers

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Tendrás que programar todo dentro del mismo trigger, lo que significa que deberás analizar los datos entrantes y determinar a partir de eso qué UPDATE debe ejecutarse.
No se admiten triggers sobre el mismo evento, por lo que todo pasará por lo que recibe la tabla.
entendido, ¿como se puede saber si un atributo fue editado o no? para hacer una condicion
  #9 (permalink)  
Antiguo 03/02/2015, 08:48
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, 4 meses
Puntos: 2658
Respuesta: Problema con triggers

Cita:
¿como se puede saber si un atributo fue editado o no?
No puedes. Sólo podrás ver si hay un datos entrantes válidos en el UPDATE que haces...
Pero creo que si piensas un momento lo que tu mismo dices, verás la respuesta: Si tienes un campo que sólo cargas cuando haces el borrado lógico (así se denomina), entonces ese campo será NULL en todos los UPDATE excepto en ese caso...
Me parece que con sólo razonarlo ya puedes ver cuál es la condición a cumplir. ¿no?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 03/02/2015, 08:59
 
Fecha de Ingreso: enero-2015
Ubicación: Valparaiso
Mensajes: 88
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Problema con triggers

Cita:
Iniciado por gnzsoloyo Ver Mensaje
No puedes. Sólo podrás ver si hay un datos entrantes válidos en el UPDATE que haces...
Pero creo que si piensas un momento lo que tu mismo dices, verás la respuesta: Si tienes un campo que sólo cargas cuando haces el borrado lógico (así se denomina), entonces ese campo será NULL en todos los UPDATE excepto en ese caso...
Me parece que con sólo razonarlo ya puedes ver cuál es la condición a cumplir. ¿no?
No se si en este caso el valor cero se considera NULL pero se podría poner una condición para el nuevo valor de "estado" (si es uno hace las operaciones de actualización y si es cero hace las operaciones del borrado lógico) pero de nuevo tengo problemas con la sintaxis, ¿Podrías ayudarme?
Código MySQL:
Ver original
  1. if NEW.estado == 1 THEN BEGIN //actualizacion
  2. UPDATE obra SET `egresos_t`= obra.egresos_t + (NEW.egresos - OLD.egresos), `ingresos_t` = obra.ingresos_t + (NEW.ingresos - OLD.ingresos), `recepcion_t`= obra.recepcion_t +  (NEW.recepcion - OLD.recepcion) , `combustible_recepcion_t`= obra.combustible_recepcion_t + (NEW.combustible_recepcion - OLD.combustible_recepcion), `combustible_emision_t` = obra.combustible_emision_t + (NEW.combustible_emision - OLD.combustible_emision) WHERE obra.codigo = OLD.cod_obra;
  3. if NEW.estado == 0 THEN BEGIN //borrado logico
  4. UPDATE obra SET `egresos_t`= obra.egresos_t - OLD.egresos, `ingresos_t` = obra.ingresos_t - OLD.ingresos, `recepcion_t`= obra.recepcion_t - OLD.recepcion, `combustible_recepcion_t`= obra.combustible_recepcion_t - OLD.combustible_recepcion, `combustible_emision_t` = obra.combustible_emision_t - OLD.combustible_emision WHERE obra.codigo = OLD.cod_obra;
  5. WHERE obra.codigo = NEW.cod_obra

Última edición por gnzsoloyo; 03/02/2015 a las 09:13
  #11 (permalink)  
Antiguo 03/02/2015, 09:13
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, 4 meses
Puntos: 2658
Respuesta: Problema con triggers

Por favor, usa los Highligt. Hay uno específico para MySQL.

Por otro lado, acuerdate que no estás esribiendo PHP, ni C#. Las sintaxis ecada DBMS es propia y el"==", no existe en el procedural de MySQL.
Además de eso, NULL no es cero. No es siquiera un dato. es un estado que se evalua con IS NULL o IS NOT NULL.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 03/02/2015, 09:29
 
Fecha de Ingreso: enero-2015
Ubicación: Valparaiso
Mensajes: 88
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Problema con triggers

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Por favor, usa los Highligt. Hay uno específico para MySQL.

Por otro lado, acuerdate que no estás esribiendo PHP, ni C#. Las sintaxis ecada DBMS es propia y el"==", no existe en el procedural de MySQL.
Además de eso, NULL no es cero. No es siquiera un dato. es un estado que se evalua con IS NULL o IS NOT NULL.
el error no es ese, tampoco puedo ver bien el error ya que el popup se sale de la pantalla y no puedo bajar.

  #13 (permalink)  
Antiguo 03/02/2015, 09: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, 4 meses
Puntos: 2658
Respuesta: Problema con triggers

¿Qué herramienta estás usando para crear ese trigger?

No la reconozco...

En cuanto al popup, debería ser perfectamente visible, incluso trabajando desde un telefono (cosa quye yo a veces hago). Tienes algún problema de navegador u otro componente...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 03/02/2015, 09:45
 
Fecha de Ingreso: enero-2015
Ubicación: Valparaiso
Mensajes: 88
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Problema con triggers

es phpmyadmin la version que se instala junto a wamp y no creo que sea problema de navegador ya que tanto en chrome como mozilla ocurre lo mismo pero revisando el codigo con firebug pude visualizar el error:

Falló la siguiente consulta: "CREATE TRIGGER `actualizarObra2` AFTER UPDATE ON `detalle_obra` FOR EACH ROW if NEW.estado = 1 THEN UPDATE obra SET `egresos_t`= obra.egresos_t + (NEW.egresos - OLD.egresos), `ingresos_t` = obra.ingresos_t + (NEW.ingresos - OLD.ingresos), `recepcion_t`= obra.recepcion_t + (NEW.recepcion - OLD.recepcion) , `combustible_recepcion_t`= obra.combustible_recepcion_t + (NEW.combustible_recepcion - OLD.combustible_recepcion), `combustible_emision_t` = obra.combustible_emision_t + (NEW.combustible_emision - OLD.combustible_emision) WHERE obra.codigo = OLD.cod_obra END; END IF; if NEW.estado = 0 THEN UPDATE obra SET `egresos_t`= obra.egresos_t - OLD.egresos, `ingresos_t` = obra.ingresos_t - OLD.ingresos, `recepcion_t`= obra.recepcion_t - OLD.recepcion, `combustible_recepcion_t`= obra.combustible_recepcion_t - OLD.combustible_recepcion, `combustible_emision_t` = obra.combustible_emision_t - OLD.combustible_emision WHERE obra.codigo = OLD.cod_obra WHERE obra.codigo = NEW.cod_obra END; END IF;"
<br/>
MySQL ha dicho: #1064 - Erreur de syntaxe près de 'END; END IF; if NEW.estado = 0 THEN UPDATE obra SET `egresos_t`= obra.egresos_' à la ligne 3
  #15 (permalink)  
Antiguo 03/02/2015, 09:56
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, 4 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)
  #16 (permalink)  
Antiguo 03/02/2015, 12:28
 
Fecha de Ingreso: enero-2015
Ubicación: Valparaiso
Mensajes: 88
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Problema con triggers

aun no logra funcionar, tengo este error ahora: MySQL ha dicho: #1064 - Erreur de syntaxe près de 'ELSE IF NEW.estado = 0 THEN UPDATE obra ' à la ligne 9
  #17 (permalink)  
Antiguo 03/02/2015, 12:58
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, 4 meses
Puntos: 2658
Respuesta: Problema con triggers

Yo no puse ningún "ELSE IF NEW.estado = 0 THEN ". Solo un ELSE....
¿Acaso vas a ingresar más valores que 0 ó 1?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #18 (permalink)  
Antiguo 03/02/2015, 13:41
 
Fecha de Ingreso: enero-2015
Ubicación: Valparaiso
Mensajes: 88
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Problema con triggers

Modifique un poco el codigo para ir probando pero el error es en esa parte, ademas la variable estado solo recibe cero y uno ya que es para el borrado logico (como mensionaste anteriormente). En cambio si se desea editar realmente, esa variable se mantiene tal cual, las variables que se ingresan son egresos, ingresos, recepcion, combustible recepcion y combustible emision.

PD: No creo que la logica sea el problema ya que el otro trigger que realice funciona bien.
  #19 (permalink)  
Antiguo 03/02/2015, 13:44
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, 4 meses
Puntos: 2658
Respuesta: Problema con triggers

Para simplificar tu problema, necesitas un campo que sea fecha_baja, nulable. Y sólo enviar la fecha del día cuando quieras darlo de baja.
Es lo mas usual, y lo mas simple de validar.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #20 (permalink)  
Antiguo 03/02/2015, 15:04
 
Fecha de Ingreso: enero-2015
Ubicación: Valparaiso
Mensajes: 88
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Problema con triggers

pero aun asi tendria que hacer una comparacion dentro del trigger o me equivoco? creo que el problema no esta en eso.
  #21 (permalink)  
Antiguo 03/02/2015, 16:07
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, 4 meses
Puntos: 2658
Respuesta: Problema con triggers

Cita:
Iniciado por Begotten Ver Mensaje
pero aun asi tendria que hacer una comparacion dentro del trigger o me equivoco? creo que el problema no esta en eso.
Completamente errado. La comparación se vuelve muchísimo mas simple y eficiente.

Código MySQL:
Ver original
  1. delimiter $$
  2. CREATE TRIGGER `actualizarObra2`
  3. AFTER UPDATE ON `detalle_obra`
  4.     IF NEW.fecha_baja IS NULL THEN
  5.         UPDATE obra
  6.             SET `egresos_t`= obra.egresos_t + (NEW.egresos - OLD.egresos),
  7.             `ingresos_t` = obra.ingresos_t + (NEW.ingresos - OLD.ingresos),
  8.             `recepcion_t`= obra.recepcion_t + (NEW.recepcion - OLD.recepcion) ,
  9.             `combustible_recepcion_t`= obra.combustible_recepcion_t + (NEW.combustible_recepcion - OLD.combustible_recepcion),
  10.             `combustible_emision_t` = obra.combustible_emision_t + (NEW.combustible_emision - OLD.combustible_emision)
  11.         WHERE obra.codigo = OLD.cod_obra;
  12.     ELSE
  13.         UPDATE obra
  14.             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.             `fecha_baja` = NEW.fecha_baja
  20.         WHERE obra.codigo = OLD.cod_obra ;
  21.     END IF;
  22. END $$
  23. delimiter ;
Además, la existencia de un campo de fecha de baja permite algo que tu no estás considerando: trazabilidad.

Por cierto, había un error severo: faltaban los cierres de las sentencias UPDATE...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 03/02/2015 a las 16:19
  #22 (permalink)  
Antiguo 04/02/2015, 06:02
 
Fecha de Ingreso: enero-2015
Ubicación: Valparaiso
Mensajes: 88
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Problema con triggers

Al fin funciono

Código MySQL:
Ver original
  1. CREATE TRIGGER `actualizarObra2` AFTER UPDATE ON `detalle_obra`
  2.     IF NEW.estado = 1 THEN
  3.         UPDATE obra
  4.             SET `egresos_t`= obra.egresos_t + (NEW.egresos - OLD.egresos),
  5.             `ingresos_t` = obra.ingresos_t + (NEW.ingresos - OLD.ingresos),
  6.             `recepcion_t`= obra.recepcion_t + (NEW.recepcion - OLD.recepcion) ,
  7.             `combustible_recepcion_t`= obra.combustible_recepcion_t + (NEW.combustible_recepcion - OLD.combustible_recepcion),
  8.             `combustible_emision_t` = obra.combustible_emision_t + (NEW.combustible_emision - OLD.combustible_emision)
  9.         WHERE obra.codigo = NEW.cod_obra;
  10.     ELSE
  11.         UPDATE obra
  12.             SET `egresos_t`= obra.egresos_t - OLD.egresos,
  13.             `ingresos_t` = obra.ingresos_t - OLD.ingresos,
  14.             `recepcion_t`= obra.recepcion_t - OLD.recepcion,
  15.             `combustible_recepcion_t`= obra.combustible_recepcion_t - OLD.combustible_recepcion,
  16.             `combustible_emision_t` = obra.combustible_emision_t - OLD.combustible_emision
  17.         WHERE obra.codigo = OLD.cod_obra;
  18.     END IF;
Gracias por la ayuda.
  #23 (permalink)  
Antiguo 04/02/2015, 06:05
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, 4 meses
Puntos: 2658
Respuesta: Problema con triggers

__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: php, tabla, update
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 07:04.