Bonjour à toutes et à tous,

Je me présente vite fait, je suis l’emmerdeur de la journée avec la question de merde, celui qui essaie de tout faire lui-même mais qui après des semaines passées à tester des tas de solutions en regardant, lisant beaucoup de messages, de conseils, n’y arrive toujours pas.
Parce qu’il ne connait que quelques balbutiements.
Inutile de vous préciser qu’il n’applique pas les règles et les consignes (c’était déjà le cas au collège. Il n’est pas allé plus loin. Et à cinquante balais, difficile de tout faire rentrer dans sa caboche.)
Ah, des idées il en voit mais après des tas d’essais infructueux il se décide enfin à poser « LA » question.
Le plus terrible dans tout ça c’est que j’aime ce que je suis en train d’essayer de faire pour simplifier les taches de ma Femme et que je sais qu’il y a une solution.
Je ne vous demande pas la réponse clefs en main, même si à la fin vous en aurez marre et vous vous direz qu’il vaut mieux lui donner le truc, mais je voudrais comprendre, savoir à coté de quoi je suis passé durant des semaines.

Elle (ma Femme), s’occupe de plusieurs petits dépôts dans cinq villes différentes qui stockent des produits que les employées prennent quand ils en ont besoin. Ils notent alors sur une feuille ce qu’ils ont pris. Et quand il n’y en a plus, ma Femme remet du produit.
Extrêmement simple. Je lui ai fait un petit truc dans « Calc », mais je voudrais aller plus loin.

J’utilise donc « PHPMyAdmin 4.7.3 ».
J’ai créé (depuis tous les bons tuyaux et les exemples que j’ai trouvé sur le forum) deux tables : une « produit » et une « mouvement » dont je vous joins un échantillon.

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
 
--
-- Structure de la table `produit`
--
 
CREATE TABLE `produit` (
  `produit_id` int(11) NOT NULL,
  `code_produit` varchar(17) NOT NULL,
  `nom_produit` text NOT NULL,
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Index pour la table `produit`
--
ALTER TABLE `produit`
  ADD PRIMARY KEY (`produit_id`);
--
-- AUTO_INCREMENT pour la table `produit`
--
ALTER TABLE `produit`
  MODIFY `produit_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=126;COMMIT;
 
 
 
--
-- Structure de la table `mouvement`
--
 
CREATE TABLE `mouvement` (
  `mouvement_id` int(11) NOT NULL,
  `mouvement_date` date NOT NULL,
  `mouvement` varchar(20) NOT NULL,
  `mouvement_type` varchar(100) NOT NULL,
  `produit_id` int(11) NOT NULL,
  `quantite` int(11) NOT NULL,
  `depot` varchar(3) NOT NULL,
  ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- Index pour la table `mouvement`
--
ALTER TABLE `mouvement`
  ADD PRIMARY KEY (`mouvement_id`);
--
-- AUTO_INCREMENT pour les tables déchargées
--
--
-- AUTO_INCREMENT pour la table `mouvement`
--
ALTER TABLE `mouvement`
  MODIFY `mouvement_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=178;COMMIT;
« mouvement » est soit « entree » soit « sortie »
« mouvement_type » est soit « livraison » soit « utilisation » soit « manquant »
« depot » sont « AU1 », « LO2 », « SP3 », «SP4 », « MR5 », « AN6 »

Les quantités sont toujours saisies en positif, j’effectue une soustraction sur les mouvements.

Toutes les saisies se font depuis PHPMyAdmin, pour rester simple.

Et la requête également.

J’en viens à ce que je voudrais arriver à lui faire. Un joli tableau avec des colonnes

Comme celui-ci :

Nom : Tableau Requête SQL.PNG
Affichages : 258
Taille : 10,8 Ko

A l’aide d’une requête.

Alors j’ai rédigé celle-là :
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
 
SELECT 
/*COLONNE 1 : On sélectionne tous les produits qui sont enregistrés dans la BDD*/
produit_id,
/*COLONNE 2 : On soustrait les entrees aux sorties pour obtenir les produits disponibles*/
(SELECT COALESCE (SUM(quantite),0)
FROM mouvement
WHERE produit.produit_id=mouvement.produit_id
AND mouvement.mouvement='entree'
AND depot='AU1'
GROUP BY mouvement.produit_id)
-
(SELECT COALESCE (SUM(quantite),0)
FROM mouvement
WHERE produit.produit_id=mouvement.produit_id
AND mouvement.mouvement='sortie'
AND depot='AU1'
)
AS Dispo
,
/*COLONNE 2 : Indique le nombre de produit qui ont été livrés*/
(SELECT COALESCE (SUM(quantite),0)
FROM mouvement
WHERE produit.produit_id=mouvement.produit_id
AND mouvement.mouvement_type='livraison'
AND depot='AU1'
GROUP BY mouvement.produit_id
)
AS Livré
,
/*COLONNE 2 : Indique le nombre de produit qui ont été utilisés*/
(SELECT COALESCE (SUM(quantite),0)
FROM mouvement
WHERE produit.produit_id=mouvement.produit_id
AND mouvement.mouvement_type='utilisation'
AND depot='AU1'
)
AS Utilisé
 
FROM produit
 
GROUP BY produit_id
 
ORDER BY produit_id
Cette requête affiche un tableau avec la liste des produits et des quantités dans chaque colonne, uniquement pour le dépôt « AU1 ».

Ce que je me dis, c’est que si je duplique le « SELECT » pour chaque dépôt, ce que je n’ai pas testé d’ailleurs, je vais créer une requête à rallonge, et qu’il y a donc forcément une autre solution.

Et c’est là que je compte sur votre génie, pour m’oriente
r vers la meilleure façon d’écrire cette requête pour ne pas en faire une usine à gaz. Ceci dit, c’est peut-être déjà le cas, mais j’ai fait ce qui était à ma portée.

Merci à toutes et à tous de votre lecture, de vos lumières, orientations et indulgences.

Gregus