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.

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;
Mais pourtant ça marche si j'exécute dans PMA :
UPDATE ta
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);
où valeur-de-refB correspond à NEW.refB.

Je sèche un peu là... Je ne dois pas m'y prendre comme il faut.