Bonjour,
Je bute sur un problème de trigger sans parvenir à en trouver l'explication, encore moins la solution.
Soit 3 tables, ta, tb et tc.
ta comprend les colonnes :
idA num surfTotal
tb comprend les colonnes :
idB refA autres cols...
tc comprend les colonnes :
idC refB long larg surf
tb.refA référence ta.idA
tc.refB référence tb.idB
Pour chaque ligne de ta, je peux avoir de 1 à N lignes la référençant dans tb
Pour chaque ligne de tb, je peux avoir de 0 à 1 ligne la référençant dans tc. tc étend en quelque sorte tb.
Un trigger est positionné sur tc pour :
1. calculer et mettre à jour tc.surf d'après les valeurs saisies de tc.long et tc.larg : ça fonctionne.
2. calculer et mettre à jour ta.surfTotal, sachant qu'il peut y avoir plusieurs lignes dans tb référençant ta... : ça ne fonctionne pas.
Mais pourtant ça marche si j'exécute dans PMA :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 TRIGGER `CompleteSurface` BEFORE INSERT ON `TableC` FOR EACH ROW BEGIN DECLARE surfTotal double; DECLARE num int; /* calcul et màj de tc.surf */ SET NEW.surf = NEW.long * NEW.larg; /* calcul et màj de ta.surfTotal */ SET num = (SELECT refA FROM tb WHERE tb.idB = NEW.refB); UPDATE ta SET ta.surfTotal = (SELECT SUM(tc.surf) FROM tc LEFT JOIN tb ON tc.refB = tb.idB WHERE tb.refA = num GROUP BY tb.refA) WHERE ta.num = num; END;
UPDATE ta
où valeur-de-refB correspond à NEW.refB.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SET ta.surfTotal = (SELECT SUM(tc.surf) FROM tc LEFT JOIN tb ON tc.refB = tb.idB WHERE tb.refA = (SELECT refA FROM tb WHERE tb.idB = valeur-de-refB) GROUP BY tb.refA) WHERE ta.num = (SELECT refA FROM tb WHERE tb.idB = valeur-de-refB);
Je sèche un peu là... Je ne dois pas m'y prendre comme il faut.
Partager