Trigger - probleme avec les variables
Bonjour à tous,
J'ai un soucis avec les variables "_chep_compteur_palette" et "_chep_compteur_coiffe", j'ai l'impression qu'elles ne se chargent pas avec la donnée retournée par la requête.
2 tables :
`chepbox`
`chep_stock_bac_vide`
Mon objectif est de supprimer les données de la table `chep_stock_bac_vide` lorsque je supprime ces même données de la table `chepbox` avec des conditions.
Voici le code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
CREATE TRIGGER `before_delete_chepbox` BEFORE DELETE ON `chepbox` FOR EACH ROW BEGIN
DECLARE _chep_compteur_palette INT DEFAULT 0;
DECLARE _chep_compteur_coiffe INT DEFAULT 0;
SET _chep_compteur_palette = "SELECT COUNT(`chep_ref_palette`) FROM `chepbox` WHERE OLD.`chep_ref_palette` AND OLD.`chep_cofor`";
SET _chep_compteur_coiffe = "SELECT COUNT(`chep_ref_coiffe`) FROM `chepbox` WHERE OLD.`chep_ref_coiffe` AND OLD.`chep_cofor`";
IF (_chep_compteur_palette = 1) AND (_chep_compteur_coiffe = 1) THEN
BEGIN
IF OLD.`chep_ref_bac` = 0 THEN
DELETE FROM `chep_stock_bac_vide` WHERE `chep_reference_stock_bac_vide` = OLD.`chep_ref_palette` AND `chep_cofor_stock_bac_vide` = OLD.`chep_cofor`;
DELETE FROM `chep_stock_bac_vide` WHERE `chep_reference_stock_bac_vide` = OLD.`chep_ref_coiffe` AND `chep_cofor_stock_bac_vide` = OLD.`chep_cofor`;
ELSE
DELETE FROM `chep_stock_bac_vide` WHERE `chep_reference_stock_bac_vide` = OLD.`chep_ref_bac` AND `chep_cofor_stock_bac_vide` = OLD.`chep_cofor`;
DELETE FROM `chep_stock_bac_vide` WHERE `chep_reference_stock_bac_vide` = OLD.`chep_ref_palette` AND `chep_cofor_stock_bac_vide` = OLD.`chep_cofor`;
DELETE FROM `chep_stock_bac_vide` WHERE `chep_reference_stock_bac_vide` = OLD.`chep_ref_coiffe` AND `chep_cofor_stock_bac_vide` = OLD.`chep_cofor`;
END IF;
END;
ELSE
IF OLD.`chep_ref_bac` <> 0 THEN
BEGIN
DELETE FROM `chep_stock_bac_vide` WHERE `chep_reference_stock_bac_vide` = OLD.`chep_ref_bac` AND `chep_cofor_stock_bac_vide` = OLD.`chep_cofor`;
END;
END IF;
END IF;
END |
Pour information, le dernier bloc fonctionne très bien :
Code:
1 2 3 4 5 6 7 8 9 10
|
ELSE
IF OLD.`chep_ref_bac` <> 0 THEN
BEGIN
DELETE FROM `chep_stock_bac_vide` WHERE `chep_reference_stock_bac_vide` = OLD.`chep_ref_bac` AND `chep_cofor_stock_bac_vide` = OLD.`chep_cofor`;
END;
END IF;
END IF; |
C'est le premier bloc qui me pose des difficultés, j'ai l'impression que les variables "_chep_compteur_palette" et "_chep_compteur_coiffe" ne s’alimente pas du résultat de la requête.
J'ai remplacer ceci :
Code:
1 2 3
|
SET _chep_compteur_palette = "SELECT COUNT(`chep_ref_palette`) FROM `chepbox` WHERE OLD.`chep_ref_palette` AND OLD.`chep_cofor`";
SET _chep_compteur_coiffe = "SELECT COUNT(`chep_ref_coiffe`) FROM `chepbox` WHERE OLD.`chep_ref_coiffe` AND OLD.`chep_cofor`"; |
par cela :
Code:
1 2 3
|
SELECT COUNT(`chep_ref_palette`) INTO _chep_compteur_palette FROM `chepbox` WHERE OLD.`chep_ref_palette` AND OLD.`chep_cofor`;
SELECT COUNT(`chep_ref_coiffe`) INTO _chep_compteur_coiffe FROM `chepbox` WHERE OLD.`chep_ref_coiffe` AND OLD.`chep_cofor`; |
Pas mieux au niveau du résultat.
Dans PhpMyAdmin, les requêtes correspondantes aux données restante dans la table `chepbox` retournent le bon résultat soit "palette =1" et "coiffe =1" :
Code:
1 2 3
|
SELECT COUNT(`chep_ref_palette`) AS palette FROM `chepbox` WHERE `chep_ref_palette`="C60" AND `chep_cofor`="A00ER";
SELECT COUNT(`chep_ref_coiffe`) AS coiffe FROM `chepbox` WHERE `chep_ref_palette`="C61" AND OLD.`chep_cofor`="A00ER"; |
Mais lors de la suppression des données de la table `chepbox`, les données correspondantes restent dans la table `chep_stock_bac_vide`.
Qu'est ce qui ne va pas ?
Merci d'avance pour votre aide précieuse.
PS : en injectant la valeur directement dans la varaiable, cela fonctionne :
Code:
1 2 3
|
SET @_chep_compteur_palette := 1;
SET @_chep_compteur_coiffe := 1; |
La question c'est pourquoi ces 2 lignes ci-dessous ne renvoi pas 1 alors qu'en ligne de cde cela fonctionne ?
Code:
1 2 3 4
|
"SELECT COUNT(`chep_ref_palette`) FROM `chepbox` WHERE OLD.`chep_ref_palette` AND OLD.`chep_cofor`"
"SELECT COUNT(`chep_ref_coiffe`) FROM `chepbox` WHERE OLD.`chep_ref_coiffe` AND OLD.`chep_cofor`"; |
SOLUTION :
Code:
1 2 3
|
SET @_chep_compteur_palette := (SELECT COUNT(`chep_ref_palette`) FROM `chepbox` WHERE `chep_ref_palette` = OLD.`chep_ref_palette` AND `chep_cofor` = OLD.`chep_cofor`);
SET @_chep_compteur_coiffe := (SELECT COUNT(`chep_ref_coiffe`) FROM `chepbox` WHERE `chep_ref_coiffe` = OLD.`chep_ref_coiffe` AND `chep_cofor` = OLD.`chep_cofor`); |