Jump to content

Triggers Mysql


oka

Recommended Posts

Hola a todos.

 

Estoy intentando ejecutar un trigger de mysql en el evento update de la tabla ps_product.

 

Creamos una tabla llamada "tigre":

 

create table tigre (ref varchar(255), price float);

 

Creamos el disparador:

 

 


create trigger mi_tigre after update on ps_product for each row BEGIN insert into tigre (ref,price) VALUES (NEW.reference, NEW.price); END; //


 

La idea es que cuando se cambie algo de la ficha de un producto (sin combinaciones) se ejecute el trigger y meta en la tabla "tigre" la referencia del producto y el nuevo precio.

 

El Trigger funciona, cuando en el BO modifico un precio de un artículo, el disparador se ejecuta y me inserta en la tabla "tigre" la referencia del producto y su precio, pero lo hace 3 veces por cada update:

 

mysql> select * from tigre//
+-----------+---------+
| ref	   | price   |
+-----------+---------+
| G-DGG1 | 80.1653 |
| G-DGG1 | 80.1653 |
| G-DGG1 | 80.1653 |
+-----------+---------+

 

¿Sabéis por qué inserta 3 líneas en vez de una sola?

 

Un saludo.

Edited by oka (see edit history)
Link to comment
Share on other sites

¡Aquí se cambia el papel ! Pon aquí tus modulos gratis, pequeñas sobrecargas, optimizacion y otros codigos que cambian la vida y que deseas compartir con otros miembros.

 

Vaya pensaba que estaba bien puesto en la sección en la que lo puse....

Link to comment
Share on other sites

Vaya pensaba que estaba bien puesto en la sección en la que lo puse....

 

La sección de: "Modulos gratis, sobrecargas y otras astucias que cambian la vida", es para cuando se publican aportes completos y funcionales.

 

Las dudas, se preguntan en la secciones de "Discusión General" o "Instalación, configuración y actualización"

 

Un Saludo

 

PD: Ademas, date cuenta que en la sección de "Discusión General", tu duda sera mas visible, para todos los usuarios.

Link to comment
Share on other sites

Hola a todos.

 

No sé por qué me inserta 3 veces por cada update en la tabla "tigre", de todas formas la idea es:

 

Cuando se actualice el precio de un producto (sin combinaciones) en el BO de prestashop actualizar la tabla llx_product de Dolibarr.

 

El código que funciona es este (aunque hay que afinar los decimales con round)

 

Trigger ps_product actualiza tabla llx_product dolibarr

mysql> delimiter |
mysql> CREATE TRIGGER price_presta_doli AFTER UPDATE ON prestashop.ps_product
-> FOR EACH ROW
-> BEGIN
-> update erp.llx_product set price = NEW.price WHERE ref = OLD.reference;
-> END;
-> |

 

Obviamente hay que tener previamente cargados todos los productos de prestashop en dolibarr, eso es fácil de hacer con moussiq o con el módulo All4doli.

 

Un saludo

Link to comment
Share on other sites

Hola Oka y con un LIMIT 1 ¿no valdría? o dandole a la columna ref indice unico... no se si valdria...

 

Saludos

 

Hola Statictic, eso es precisamente las dos cosas que he intentado, tanto ponerle UNIQUE al campo referencia como pasarle un limit 1 se queda el BO congelado al actualizar un precio.

 

Es raro, es como si cuando prestashop actualiza algo de la ficha de producto desde el BO hace que el trigger se ejecute 3 veces.

 

Cosa que no pasa con el trigger que tengo para actualizar los precios en la BBDD de dolibarr si se modifica en el BO de presta.

 

Un saludo.

Link to comment
Share on other sites

El "triplicado" lo inserta en la tabla tigre cada vez que modifico un precio en la pestaña de un producto y le doy a salvar, con lo que prestashop hace un "update table ps_product set price = $price where id_product = 33" y se supone que el trigger se ejecuta una sola vez por cada update que hace prestashop.

 

El caso es que por cada update se triplica en la tabla tigre los valores, raro raro.....

 

De todas formas activaré el log de mysql para ver qué hace por debajo con esa consulta.

 

Un saludo

Link to comment
Share on other sites

Hola

 

Statictic no me había fijado en tu edición, si hacemos eso cuando insertas da un error de duplicate key (que se puede solventar con un REPLACE o con un ON DUPLICATE KEY UPDATE) pero he abandonado el tema de actualizar directamente dolibarr desde prestashop "al vuelo".

 

Por cierto tengo un trigger funcionando porque necesito saber la última fecha de modificación de un producto y prestashop no actualiza el campo ps_product.date_upd con el timestamp cuando modificas una combinación, es decir si modificas el stock de la ficha de un producto el campo ps_product.date_upd se actualiza, si modificas el stock de una combinación de ese producto no se actualiza.

 

 

 

DELIMITER |

CREATE TRIGGER fecha_mod_prod AFTER UPDATE ON ps_product_attribute FOR EACH ROW BEGIN update ps_product set date_upd = NOW() where id_product = OLD.id_product; END|

 

Un saludo.

Edited by oka (see edit history)
Link to comment
Share on other sites

Hola Pepete2008, te refieres a la solución del trigger que actualiza la table "tigre" desde prestashop ?

 

No lo he vuelto a mirar, pero creo que con pasarle un Limit 1 funcionaría.

 

create trigger mi_tigre after update on ps_product for each row BEGIN insert into tigre (ref,price) VALUES (NEW.reference, NEW.price) LIMIT 1; END; //

 

Un saludo

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...