Bonjour les amis, je souffre depuis des jours, j'ai besoin de vos aides.
en effet, j'ai une requête qui me calcule la quantité en stock de mon matériel.
A partir de la deuxième livraison la quantité initiale est sur-additionnée. ce qui n'est pas normal. Est-ce ma requête ou la logique des tables ?
Ma requête:
Mes Tables:
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
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 select m.MaterielId MaterielId , m.MaterielLibelle MaterielLibelle , coalesce(SR.QTCUMRECU, 0) as CUMRECU , coalesce(SS.QTCUMSORTIE, 0) as CUMSOR , st.QuantiteEnstock STOCK_INITIAL , coalesce(st.QuantiteEnstock, 0)+(coalesce(SR.QTCUMRECU, 0) - coalesce(SS.QTCUMSORTIE,0)) as STOCK_ACTUEL , SR.FormeId FormeId , SR.FormeUnite FormeUnite , st.ModifieLe from materiel as m left outer join stock st on st.MaterielId=m.MaterielId left join ( select lr.MaterielId , sum(lr.ReceptionQuantite) as QTCUMRECU , fm.FormeId , fm.FormeUnite from ligne_reception lr inner join forme fm on fm.FormeId=lr.FormeId inner join reception r ON lr.ReceptionId=r.ReceptionId inner join stock st on st.MaterielId=lr.MaterielId where r.ReceptionDate >= st.ModifieLe and r.ReceptionDate='2019-03-05' group by lr.MaterielId, fm.FormeUnite ) SR on SR.MaterielId=m.MaterielId left join ( select ls.MaterielId , sum(ls.SortieQuantite) as QTCUMSORTIE ,fm.FormeId , fm.FormeUnite from ligne_sortie ls inner join forme fm on fm.FormeId=ls.FormeId inner join stock st on st.MaterielId=ls.MaterielId inner join sortie s on s.SortieId=ls.SortieId where s.SortieDate >= st.ModifieLe and s.SortieDate='2019-03-05' group by ls.MaterielId, fm.FormeUnite ) SS on SS.MaterielId=m.MaterielId
script d'insertion:
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
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 /*La tale RECEPTION / ENTREE */ CREATE TABLE RECEPTION ( CommandeId INT NOT NULL, ReceptionId INT NOT NULL auto_increment, ReceptionDate DATETIME NOT NULL, Observation VARCHAR(150) NOT NULL, ModifieLe DATE NOT NULL, ModifieA TIME NOT NULL, ModifiePar VARCHAR(50) NOT NULL, CONSTRAINT RECEPTION_PK PRIMARY KEY (ReceptionId), CONSTRAINT RECEPTION_COMMANDE_FK FOREIGN KEY (CommandeId) REFERENCES COMMANDE_FOURNISSEUR(CommandeId) ON DELETE CASCADE ON UPDATE CASCADE )ENGINE=InnoDB; /*La tale LIGNE_RECEPTION */ CREATE TABLE LIGNE_RECEPTION ( LigneReceptionId INT NOT NULL auto_increment, ReceptionQuantite DECIMAL(6,2) NOT NULL, FormeId INT NOT NULL , MaterielId INT NOT NULL, ReceptionId INT NOT NULL, CONSTRAINT RECEPTION_PK PRIMARY KEY (LigneReceptionId), CONSTRAINT RECEPTION_LIGNE_MATERIEL_FK FOREIGN KEY (MaterielId) REFERENCES MATERIEL (MaterielId) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT RECEPTION_LIGNE_RECEPTION_FK FOREIGN KEY (ReceptionId) REFERENCES RECEPTION(ReceptionId) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT RECEPTION_LIGNE_FORME_FK FOREIGN KEY (FormeId) REFERENCES FORME(FormeId) ON DELETE CASCADE ON UPDATE CASCADE )ENGINE=InnoDB; /*La tale SORTIE / AFFECTATION */ CREATE TABLE SORTIE ( SortieId INT NOT NULL auto_increment, SortieDate DATETIME NOT NULL, Observation VARCHAR(150) NOT NULL, SortieMotif VARCHAR(50) NOT NULL, ServiceId INT , ModifieLe DATE NOT NULL, ModifieA TIME NOT NULL, ModifiePar VARCHAR(50) NOT NULL, CONSTRAINT SORTIE_PK PRIMARY KEY (SortieId), CONSTRAINT SORTIE__SERVICE_FK FOREIGN KEY (ServiceId) REFERENCES SERVICES (ServiceId) ON DELETE CASCADE ON UPDATE CASCADE )ENGINE=InnoDB; /*La tale LIGNE SORTIE / DOTATION*/ CREATE TABLE LIGNE_SORTIE ( LigneSortieId INT NOT NULL auto_increment, SortieQuantite DECIMAL(6,2) NOT NULL, FormeId INT NOT NULL, MaterielId INT NOT NULL, CONSTRAINT LIGNE_SORTIE_PK PRIMARY KEY (LigneSortieId), CONSTRAINT LIGNE_SORTIE_FORME_FK FOREIGN KEY (FormeId) REFERENCES FORME (FormeId) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT LIGNE_SORTIE_MATERIEL_FK FOREIGN KEY (MaterielId) REFERENCES MATERIEL (MaterielId) ON DELETE CASCADE ON UPDATE CASCADE )ENGINE=InnoDB; /*La tale STOCK*/ CREATE TABLE STOCK ( MaterielId INT NOT NULL, QuantiteEnstock DECIMAL(6,2) NOT NULL, QuantiteStockVirtuel DECIMAL(6,2) NOT NULL, Observation VARCHAR(50) NOT NULL, FormeId INT NOT NULL , ModifieLe DATETIME NOT NULL,//pour test ModifieA TIME NOT NULL, ModifiePar VARCHAR(50) NOT NULL, CONSTRAINT STOCK_PK PRIMARY KEY (MaterielId), CONSTRAINT STOCK_FORME_FK FOREIGN KEY (FormeId) REFERENCES FORME (FormeId) ON DELETE CASCADE ON UPDATE CASCADE )ENGINE=InnoDB;
stock initial
livraison
Code : Sélectionner tout - Visualiser dans une fenêtre à part UPDATE `stock` SET `QuantiteEnstock` = '0' WHERE `stock`.`MaterielId` = 2; UPDATE `stock` SET `QuantiteEnstock` = '0' WHERE `stock`.`MaterielId` = 3; UPDATE `stock` SET `QuantiteEnstock` = '0' WHERE `stock`.`MaterielId` = 5; UPDATE `stock` SET `QuantiteEnstock` = '0' WHERE `stock`.`MaterielId` = 6;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 INSERT INTO `reception` (`CommandeId`, `ReceptionId`, `ReceptionDate`, `Observation`, `ModifieLe`, `ModifieA`, `ModifiePar`) VALUES ('4', '59', '2019-03-06 15:01:17', 'OK', '2019-03-06', '15:01:17', 'kouakou'), ('8', '60', '2019-03-06 15:27:15', 'OK', '2019-03-06', '15:27:15', 'kouakou'); INSERT INTO `ligne_reception` (`LigneReceptionId`, `ReceptionQuantite`, `FormeId`, `MaterielId`, `ReceptionId`) VALUES (NULL, '20', '4', '2', '59'), (NULL, '50', '4', '6', '59'), (NULL, '08', '6', '3', '59'), (NULL, '06', '7', '5', '59'), (NULL, '19', '4', '6', '60'), (NULL, '12', '4', '2', '60'), (NULL, '45', '6', '3', '60');
Partager