I have a trigger for After insert notes After delete notes After update notes
You need to update multiple tables like sales, sales, sales.
I tested using a cursor for each table, at first it worked normally, my question is about performance and if there is another way to implement it.
Follow implemented code:
/**********************************************************************************************/
DROP TRIGGER depoisInsertNotas;
DELIMITER $$
CREATE
TRIGGER 'depoisInsertNotas' AFTER INSERT ON 'notas'
FOR EACH ROW BEGIN
DECLARE done BOOLEAN DEFAULT FALSE;
DECLARE datan INT DEFAULT 0;
DECLARE totaln DECIMAL(18,4);
DECLARE codven INT;
DECLARE nomeven VARCHAR(150);
DECLARE vendas CURSOR FOR
SELECT DATE_FORMAT(notas.datreg, '%Y%m') AS anomes, SUM(notas.totnot) AS total
FROM notas
WHERE DATE_FORMAT(notas.datreg, '%Y%m') = DATE_FORMAT(NEW.datreg, '%Y%m')
GROUP BY anomes;
DECLARE vendas_vendedor CURSOR FOR
SELECT DATE_FORMAT(notas.datreg, '%Y%m') AS anomes, SUM(notas.totnot) AS total, notas.codven, notas.nomven
FROM notas
WHERE notas.codven = NEW.codven AND DATE_FORMAT(notas.datreg, '%Y%m') = DATE_FORMAT(NEW.datreg, '%Y%m')
GROUP BY notas.codven, DATE_FORMAT(notas.datreg,'%Y%m');
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE;
OPEN vendas;
done: LOOP
FETCH vendas INTO datan, totaln;
IF done THEN
LEAVE done;
END IF;
CALL deletaNotas(datan, NULL);
INSERT INTO vendas(anomes, totven) VALUES (datan, totaln);
END LOOP;
CLOSE vendas;
/*********************************************/
SET done = 0;
OPEN vendas_vendedor;
done: LOOP
FETCH vendas_vendedor INTO datan, totaln, codven, nomeven;
IF done THEN
LEAVE done;
END IF;
CALL deletaNotas(NULL, codven);
INSERT INTO vendas_vendedor(anomes, totven, codven, nomeven) VALUES (datan, totaln, codven, nomeven);
END LOOP;
CLOSE vendas_vendedor;
END;
$$
DELIMITER ;