MySQL - Disparar 2 triggers

 
Vista:

Disparar 2 triggers

Publicado por Luz Facundo E. (6 intervenciones) el 21/01/2012 23:35:10
Hola.


Por favor cuando guardo mi factura dispara el 1er trigger que inserta datos en la tabla kardex, bueno hasta alli no tengo error.
Pero cuando se dispara el 2do trigger de la tabla kardex hacia la tabla STOCK para actualizar la cantidad sale error.

Nota: Mediante mi sistema solo guardo en la ventana factura y los 2 triggers se deben de disparar en cadena, 1er trigger se dispara de la ventana Factura hacia la tabla KARDEX y despues el 2do trigger de la tabla Kardex hacia la tabla STOCK.

PRIMER TRIGGER
DELIMITER //
CREATE TRIGGER t_I_f_detall_kardex AFTER INSERT ON det_fact_venta
FOR EACH ROW
BEGIN
INSERT INTO t_kardex SET
t_kardex.in_id_almacen = NEW.in_id_almacen,
t_kardex.in_id_producto = NEW.in_id_product,
t_kardex.dt_fecha_reg = NEW.dt_fec_insert,
t_kardex.ch_tipo_docum = 'FA',
t_kardex.vc_nro_docum = NEW.ch_id_num_fact,
t_kardex.in_id_clie_prov = NEW.in_id_cliente,
t_kardex.ch_clie_prov = 'C',
t_kardex.ch_tipo_ing_sal = 'S',
t_kardex.nm_q_ingreso = 0,
t_kardex.nm_q_salida = NEW.dc_cantid_prod,
t_kardex.nm_saldo = (select t_stockalm.nm_stockr from t_stockalm where new.in_id_product = t_stockalm.in_id_producto and new.in_id_almacen = t_stockalm.in_id_almacen) - (NEW.dc_cantid_prod ),
t_kardex.in_id_estado = NEW.in_id_estado,
t_kardex.ch_moned_costo = (select t_productos.ch_mone_cost from t_productos where new.in_id_almacen = t_productos.in_id_genero and new.in_id_product = t_productos.in_id_product),
t_kardex.nm_cost_unit = (select t_productos.nm_costo from t_productos where new.in_id_almacen = t_productos.in_id_genero and new.in_id_product = t_productos.in_id_product);

END;//
DELIMITER ;

SEGUNDO TRIGGER
DELIMITER //
CREATE TRIGGER t_U_kardex_a_stock AFTER INSERT ON bd_system.t_kardex
FOR EACH ROW
BEGIN

IF NEW.nm_q_salida > 0 THEN
UPDATE t_stockalm SET
t_stockalm.nm_stockr = t_stockalm.nm_stockr - NEW.nm_q_salida
where t_stockalm.in_id_almacen = NEW.in_id_almacen and
t_stockalm.in_id_producto = NEW.in_id_producto ;
END IF;


IF NEW.nm_q_ingreso > 0 THEN
UPDATE t_stockalm SET
t_stockalm.nm_stockr = t_stockalm.nm_stockr + NEW.nm_q_ingreso
where t_stockalm.in_id_almacen = NEW.in_id_almacen and
t_stockalm.in_id_producto = NEW.in_id_producto ;
END IF;

END;//
DELIMITER ;

Gracias por la ayuda.
Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Disparar 2 triggers

Publicado por Gonzalo GC (339 intervenciones) el 22/01/2012 00:02:23
Tengo algunas preguntas y algunas observaciones:
La primera pregunta es simple:

Pero cuando se dispara el 2do trigger de la tabla kardex hacia la tabla STOCK para actualizar la cantidad sale error.

Ajá... ¿y qué error es el que se produce? ¿Qué dice? ¿Cómo te percatas de que se ha producido un error?

La segunda pregunta es simple: ¿Por qué haces un código tan complicado? Hay modos muchísimo más sencillos de escribir exactamente lo mismo, y sin tener que haces subselects.

La tercera sería: ¿Por qué quieres hacer en un TRIGGER algo que puedes hacer en un stored procedure de un modo más sencillo?

A mi entender te complicas la vida innecesariamente, y haces que el sistema completo sea complicado.
Un error de inserciones se puede resolver con una transacción, si usas SP, pero con los TRIGGER la cosa se complica, No son tan sencillos de regular porque no tienes tanto control sobre la cadena de ejecuciones.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Disparar 2 triggers

Publicado por Luz Facundo E. (6 intervenciones) el 22/01/2012 04:30:24
Hola, el error que sale es:

Numero: 1442
texto: SQLSTATE = S1000
[MySQL][ODBC 5.1 Driver][mysqld-5.134-community] Can´t
update table 't_stockalm' in stored function/trigger because it is
already used by statement which invoked this stored function/trigger.

No changes made to database.

Pues no logro trabajar o llamar un SP desde PowerBuilder y con triggers me esta diendo mejor, bueno hasta este error.


Gracias por tu ayuda.
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Disparar 2 triggers

Publicado por Luz Facundo E. (6 intervenciones) el 22/01/2012 04:39:29
Hola.
Me percato de que hay error, por que en la tabla 't_stockalm' no se actualiza la nueva cantidad y eso deberia de realizar el 2do trigger.
El 1er trigger si inserta datos en la tabla 't_kardex'
.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Disparar 2 triggers

Publicado por Gonzalo GC (339 intervenciones) el 22/01/2012 06:49:05
Deberías usar el traductor de Google. Te ahorraría dudas.
Esta frase:
Can´t update table 't_stockalm' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
Significa:

"No se puede actualizar la tabla t_stockalm en la función/trigger porque ya está siendo usada por una sentencia que es invocada por este trigger".

Lo que en buen romance significa que estás metiendo la pata: Intentas modificar una tabla que está bloqueada para escritura porque la estás usando en un paso previo.
¿Se entiende?
Ese es uno de los problemas que se produce cuando usas TRIGGERs, y los miras unitarialmente, sin visualizar su funcionamiento integrado. Por eso los TRIGGERS se deben usar sólo como último recurso, y sólo si es estrictamente necesario.

En tu caso el origen del problema es sencillo: El primer trigger invoca en un momento a la tabla que quieres actualizar en el segundo. Como la operación del primero depende de los valores que existan en la tabla, la misma se bloquea para escritura, y por eso el segundo falla. De lo contrario, si pudieses actualizarla y el valor modificado modificara el usado en el primer trigger, el resultado sería una inconsistencia de datos.

Yo, antes que hacer estas pavadas, buscaría mejor hacer funcionar los SP desde el PB, como dices. No es posible que no puedas hacerlos andar. Debes estar escribiéndolos mal.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar