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

[SOLUCIONADO] Actualizar por medio de disparador (trigger)

Estas en el tema de Actualizar por medio de disparador (trigger) en el foro de Mysql en Foros del Web. Hola compañeros, tengo un par de disparadores que acualizar datos en una tabla, el cual funciona de la siguiente manera: Al realizar una compra automaticamente ...
  #1 (permalink)  
Antiguo 28/11/2014, 15:51
 
Fecha de Ingreso: agosto-2013
Ubicación: Guatemala
Mensajes: 137
Antigüedad: 10 años, 8 meses
Puntos: 4
Actualizar por medio de disparador (trigger)

Hola compañeros, tengo un par de disparadores que acualizar datos en una tabla, el cual funciona de la siguiente manera:

Al realizar una compra automaticamente carga la cantidad comprada con la cantidad existente (hasta aqui todo bien), pero al querer anular esa compra es decir revertir el proceso tengo problemas cuando el producto es el mismo es decir
COMPRA
Código MySQL:
Ver original
  1. CANT | IDARTICULO | PRECIO
  2. 3  |  55  | 55.55
  3. 1 |  55  | 55.55
  4. 2 |  55  | 55.55
Actualizar la existencia del producto agregandole los 6, pero al anular no sabe como operarlo porque me resulta restando 9 en lugar de los 6

El disparador para anular es el siguiente
Código MySQL:
Ver original
  1. if new.estado = 2 and old.estado <> 2 then
  2.         update sys_compra_detalle set estado = new.estado where no_compra = new.no_compra;
  3.         update sys_kardex set estado = new.estado where no_movimiento = new.no_compra;
  4.         update sys_articulo a, (select * from sys_compra_detalle where no_compra=new.no_compra) b set a.existencia=a.existencia-b.cantidadcompra where a.idarticulo=b.idarticulo;
  5.     end if;
Cabe mencionar que el detalle de la compra tiene un idcompra_detalle como clave primaria autonumerica

Por su ayuda gracias.

PD el proceso si funciona cuando hago el after update en la tabla detalle
Código MySQL:
Ver original
  1. AFTER UPDATE ON `sys_compra_detalle` FOR EACH ROW BEGIN
  2.     if new.estado = 2 and old.estado <> 2 then
  3.         update sys_articulo set existencia = existencia - new.cantidadcompra where idarticulo = new.idarticulo;
  4.     end if;
  5.   END
Porque obviamente me cuanta la llaves primarias. Pero en este caso debo hacer 2 disparadores uno para el maestro y otro para el detalle, y lo que quiero es controlarlo desde uno solo

Última edición por oscurogt; 28/11/2014 a las 16:00
  #2 (permalink)  
Antiguo 29/11/2014, 19:14
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: Actualizar por medio de disparador (trigger)

Y digo yo... ¿No sería muchísimo más práctico meter toda esa logica de validaciones e inserciones en un STORED PROCEDURE, en lugar de hacerlo con TRIGGER?

Los trigger no son para hacer tareas de ese tipo. No resultan prácticos por el alto riesgo de hacer acciones anidadas, y los problemas para manejo de excepciones en MySQL. Es muchísimo mas simple crear un SP que realice toda la tarea y devuelva un estado de exito o fracaso por parámetro.
__________________
¿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 02/12/2014, 08:56
 
Fecha de Ingreso: agosto-2013
Ubicación: Guatemala
Mensajes: 137
Antigüedad: 10 años, 8 meses
Puntos: 4
Respuesta: Actualizar por medio de disparador (trigger)

Suena muy bien la solucion el problema es que no se hacer STORED PROCEDURES pero investigaré un poco acerca de eso y veré como me va, por el momento lo deje como lo tenia 1 trigger para el detalle y otro para el maestro. Saludos y gracias por tu respuesta.
  #4 (permalink)  
Antiguo 05/12/2014, 10:32
Avatar de replica  
Fecha de Ingreso: noviembre-2004
Mensajes: 68
Antigüedad: 19 años, 5 meses
Puntos: 2
Respuesta: Actualizar por medio de disparador (trigger)

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Y digo yo... ¿No sería muchísimo más práctico meter toda esa logica de validaciones e inserciones en un STORED PROCEDURE, en lugar de hacerlo con TRIGGER?

Los trigger no son para hacer tareas de ese tipo. No resultan prácticos por el alto riesgo de hacer acciones anidadas, y los problemas para manejo de excepciones en MySQL. Es muchísimo mas simple crear un SP que realice toda la tarea y devuelva un estado de exito o fracaso por parámetro.
Una pregunta: ¿cuál es el propósito principal de uso de un trigger?

Es que tengo una pregunta parecida a la de oscurogt. En mi caso, cuando hago una venta, al insertar en la tabla "linea_pago", quiero descontar la cantidad de la tabla "articulo", haciendo un update en la fila del artículo en cuestión.

Y quería preguntar si debo programarlo en php, que es donde estoy haciendo la aplicación, o es una buena práctica el hacerlo con un trigger.

Ya sé que para las auditorías el trigger es idóneo, pero no sé si aplica en algún caso más.

Gracias, y espero que a oscurogt no le moleste mucho que ocupe su hilo.
  #5 (permalink)  
Antiguo 05/12/2014, 10:47
 
Fecha de Ingreso: agosto-2013
Ubicación: Guatemala
Mensajes: 137
Antigüedad: 10 años, 8 meses
Puntos: 4
Respuesta: Actualizar por medio de disparador (trigger)

Cita:
Iniciado por replica Ver Mensaje
Una pregunta: ¿cuál es el propósito principal de uso de un trigger?

Es que tengo una pregunta parecida a la de oscurogt. En mi caso, cuando hago una venta, al insertar en la tabla "linea_pago", quiero descontar la cantidad de la tabla "articulo", haciendo un update en la fila del artículo en cuestión.

Y quería preguntar si debo programarlo en php, que es donde estoy haciendo la aplicación, o es una buena práctica el hacerlo con un trigger.

Ya sé que para las auditorías el trigger es idóneo, pero no sé si aplica en algún caso más.

Gracias, y espero que a oscurogt no le moleste mucho que ocupe su hilo.
No me molesta para nada que uses mi Hilo, la verdad para eso pregunto y trato de solucionar lo que pregunto para que los demás puedan solucionar problemas similares, en cuanto a tu pregunta es mejor usar un trigger (disparador) para hacer la funcion que deseas, es mas seguro y confiable ya que puede programar desde la base de datos sin tener que alterar tu codigo fuente cada vez que necesites modificar algo.

tengo uno que hace lo que necesitas es este.
Código MySQL:
Ver original
  1. CREATE DEFINER=`root`@`localhost` TRIGGER `salidas_ventas` AFTER INSERT ON `sys_venta_detalle` FOR EACH ROW BEGIN
  2.         update sys_productos set existencia = existencia - new.cantidad where idproducto = new.idproducto;
  3.         insert into sys_kardex (no_movimiento,idproducto,cantp,cantidad,tipo,idmovimiento,sysdate)
  4.         values (new.no_venta,new.idproducto,new.cantidad,new.cantidad,'-1',new.idmovimiento,cast(date_format(new.sysdate,'%Y-%m-%d')AS CHAR));
  5.  END

Etiquetas: tabla
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 03:12.