MySQL - Trigger MySQL

   
Vista:

Trigger MySQL

Publicado por Luz Facundo E. (6 intervenciones) el 08/01/2012 05:19:39
Hola
Por favor alguien me puede ayudar.
Cuando corro en el MySQL Command Line Client mi trigger con el siguiente contenido corre

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 = t_stockalm.nm_stockr - NEW.dc_cantid_prod,
t_kardex.in_id_estado = NEW.in_id_estado;
END;//
DELIMITER ;

y no corre con el siguiente codigo

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 = t_stockalm.nm_stockr - NEW.dc_cantid_prod,
t_kardex.in_id_estado = NEW.in_id_estado,
t_kardex.ch_moned_costo = t_productos.ch_mone_cost,
t_kardex.nm_cost_unit = t_productos.nm_costo
where new.in_id_product = t_stockalm.in_id_producto and new.in_id_product = t_productos.in_id_product and
new.in_id_almacen = t_productos.in_id_genero and new.in_id_almacen = t_stockalm.in_id_almacen;

END;//
DELIMITER ;

Por favor, alguien me puede decir que esta mal.
Agradesco 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

Trigger MySQL

Publicado por Gonzalo GC (339 intervenciones) el 08/01/2012 15:44:01
Un INSERT no posee condiciones, por lo que el WHERE no es parte de la sentencia, y por ende es un error de sintaxis.
Si lo que quieres hacer es actualizar un registro ya existente, usas UPDATE, si quieres reemplazar si existe y si no crearlo, usas REPLACE.
Además, incluso en el caso de ser un UPDATE lo que debes hacer, tampoco puedes hacer esto:
1
2
3
4
5
6
7
new.in_id_product = t_stockalm.in_id_producto
AND
new.in_id_product = t_productos.in_id_product
AND
new.in_id_almacen = t_productos.in_id_genero
AND
new.in_id_almacen = t_stockalm.in_id_almacen;

porque las tablas t_stockalm y t_productos no existen en el proceso de esa consulta. ya que para consultar esos datos en ellas debes hacer un SELECT...
¿Se entiende?

Una tabla sólo puede devolver datos si es consultada por medio de SELECT o es parte declarada de un JOIN. No se las puede consultar como si fuesen objetos de programación.

No estás programando. Estás usando SQL. Respeta las reglas del SQL.
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

Trigger MySQL

Publicado por Luz Facundo E (6 intervenciones) el 09/01/2012 02:02:18
Hola
Gracias por la ayuda.
Aclarastes mis dudas.
Y realice el siguiente codigo y corre.

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 ;
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

Trigger MySQL

Publicado por Gonzalo GC (339 intervenciones) el 09/01/2012 02:17:07
Bueno, es un código bastante ineficiente, sin optimización, peo si te sirve...
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