Bonjour à tous!
J'ai un problème que je n'arrive pas à résoudre et ce, depuis quelques mois déjà.
Bien que je n'ai pas travaillé constament dessus depuis tout ce temps, j'y ai mit beaucoup de réflexion.
Mon problème est le suivant :
J'ai une production à gérer. Selon les caratéristiques du produit commandé, il peut ou non se faire sur une ou plusieurs machines.
Ce que je désire, c'est une requête SQL qui retourne le ou les numéros de machine qui peuvent fabriquer le produit.
J'ai construit deux table test qui représente sommairement le problème et une requête qui se rapproche au mieux de ce que j'ai de besoin.
Vous aurez besoin de créer une base de donnée au nom de Thermoform ou de modifier la requête suivante pour l'adapter à votre base de donné.
Voilà pour la table regroupant les critères :
Voilà pour la table regroupant les commandes client :
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 -- phpMyAdmin SQL Dump -- version 3.2.0.1 -- http://www.phpmyadmin.net -- -- Host: localhost -- Generation Time: Oct 18, 2010 at 03:17 PM -- Server version: 5.1.36 -- PHP Version: 5.3.0 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; -- -- Database: `thermoform` -- -- -------------------------------------------------------- -- -- Table structure for table `test_produit_critere` -- CREATE TABLE IF NOT EXISTS `test_produit_critere` ( `NoIdent` int(11) NOT NULL AUTO_INCREMENT, `CodeProduit` varchar(20) NOT NULL, `CouleurProduit` varchar(5) NOT NULL, `Machine` varchar(10) NOT NULL, PRIMARY KEY (`NoIdent`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ; -- -- Dumping data for table `test_produit_critere` -- INSERT INTO `test_produit_critere` (`NoIdent`, `CodeProduit`, `CouleurProduit`, `Machine`) VALUES (1, '55', '', '1'), (2, '55', '10', '2'), (3, '', '9', '3'), (4, '5623', '', '4');
Voilà la requête que j'utilise pour l'extration du numéro de machine :
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 -- phpMyAdmin SQL Dump -- version 3.2.0.1 -- http://www.phpmyadmin.net -- -- Host: localhost -- Generation Time: Oct 18, 2010 at 03:27 PM -- Server version: 5.1.36 -- PHP Version: 5.3.0 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; -- -- Database: `thermoform` -- -- -------------------------------------------------------- -- -- Table structure for table `test_produit` -- CREATE TABLE IF NOT EXISTS `test_produit` ( `NoIdent` int(11) NOT NULL AUTO_INCREMENT, `CodeProduit` varchar(20) NOT NULL, `CouleurProduit` int(11) NOT NULL, PRIMARY KEY (`NoIdent`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ; -- -- Dumping data for table `test_produit` -- INSERT INTO `test_produit` (`NoIdent`, `CodeProduit`, `CouleurProduit`) VALUES (1, '2400', 10), (2, '2401', 10), (3, '5501', 10), (4, '5501', 13), (5, '5501', 12), (6, '5501', 10), (7, '5503', 9), (8, '5623', 10);
Résultat de la requête :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 SELECT test_produit.*,test_produit_critere.Machine FROM test_produit_critere INNER JOIN test_produit ON ((test_produit.CodeProduit REGEXP CONCAT('^',test_produit_critere.CodeProduit) AND test_produit_critere.CodeProduit != '') OR test_produit_critere.CodeProduit = test_produit.CodeProduit OR test_produit_critere.CodeProduit = '') AND (test_produit_critere.CouleurProduit = '' OR test_produit_critere.CouleurProduit = test_produit.CouleurProduit)
Puisque je ne sais pas d'avance les critères et de plus, ils peuvent changer d'une semaine à l'autre de façon imprévisible (exemple : un outil brise sur la machine #2 empêchant de faire tel ou tel produit).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 NoIdent CodeProduit CouleurProduit Machine 3 5501 10 1 3 5501 10 2 4 5501 13 1 5 5501 12 1 6 5501 10 1 6 5501 10 2 7 5503 9 1 7 5503 9 3 8 5623 10 4
Le résultat de cette requête est presque ce que j'ai de besoin. Il y a un problème. Certain produit tel que le 5501 en couleur 10 ne peut seulement se faire sur la machine 2 (tel que présenté dans la table critere), mais ma requête retourne les deux machines. Un autre problème, la couleur 9 ne peut se faire que sur la machine 3 et la requête retourne deux machines, la 1 et la 3 (voir NoIdent 7).
Alors, ce qui me manque c'est d'exclure les produits qui ont déjà une combinaison gagnante.
Enfin, peut-être que mon approche est fausse aussi.
Dans mon cas réel, j'ai 9 critères qui ont chacun une possibilité plusieurs possibilité (dans certain cas, booléen, dans d'autre VARCHAR de 20, certain sont des int, enfin un mélange de tout).
Le fait d'avoir des millions de possibilité m'empêche de faire une table exhaustive de toutes les possibilités et d'y lister les machines correspondantes. De plus, la maintenance serait compliqué.
Alors, peut-être dois-je aller plus simple et gérer les doublons dans mon code?
Si vous avez déjà vécu une sitution semble, qu'avez-vous fait?
Merci à tous!
antoine
Partager