Bonjour,
Voilà le topo.
J'ai deux tables :
Promo (
ID,
Magasin,
Nom,
CatProf (catégories professionnelles de clients visées par la promo),
DateDebut,
DateFin)
CatProf (
ID,
Nom)
Bien sûr, il devrait y avoir une table de jointure entre les deux puisqu'il s'agit d'une relation n,n (une promo peut viser plusieurs catégories de client et une catégorie de client peut être touchée par plusieurs promos).
Mais ce n'est pas le cas. Le fondateur de notre DB ne l'entendait visiblement pas de cette oreille. Il a préféré identifier les catégories professionnelles visées par une promo grâce à un code (croyez-moi ça vaut le détour...).
Un string de 100 caractères avec des "X" et des espace " ". La position d'un X dans la chaîne de caractère correspond à l'ID d'une catégorie professionnelle visée.
Un exemple pour que ce soit bien claire :
Imaginons les catégories professionnelles :
(1, Entreprise générale)
(2, Menuisier)
(3, Peintre)
(4, Plafonneur)
Si Promo.CatProf = "X XX", cela veut dire que la promo en question vise les entreprises générales, les peintres et les plafonneurs mais pas les menuisiers.
Maintenant, il me faut trouver une solution pour isoler les promos visant une catégorie professionnelle spécifique. Ce paramètre étant variable d'une requête à l'autre.
Je précise également que j'utilise MSQuery pour extraire mon résultat et l'afficher dans Excel. MSQuery est fort limité comme je vais vous le montrer. Et j'aurais besoin de vous pour m'aider à contourner certaines restrictions.
L'idée, c'est d'utiliser SUBSTRING(Promo.CatProf, ma_variable, 1) = 'X' avec ma_variable = l'ID de la catégorie professionnelle dont je souhaite récupérer les promos.
Le tout dans une clause WHERE afin de tester la valeur du caractère qui correspond à ma CatProf.
Voici ma 1ère tentative :
Avec ? étant la variable que je souhaite injecter depuis Excel.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 SELECT Promo.ID, Promo.Magasin, Promo.Nom, Promo.DateDébut, Promo.DateFin FROM Promo WHERE Promo.Magasin = 70 AND SUBSTRING(Promo.CatProf, ?, 1) = 'X'
MSQuery permet à Excel d'injecter des paramètres dans une requête.
Malheureusement, il semblerait qu'il ne le permette qu'à droite du = dans une clause WHERE.
Exemple : "WHERE Promo.Magasin = ?" aurait fonctionné. Le ? serait alors une valeur variable arbitraire comme le contenu d'une celle Excel par exemple.
Je me suis donc mis en quête de faire passer le ? de l'autre côté du = d'une façon ou d'une autre.
Voici ma seconde tentative.
Mais je ne suis pas certain qu'on puisse imbriquer un SELECT dans SUBSTRING() de cette façon. En tout cas MSQuery m'annonce que "l'argument 2 de la fonction SUBSTRING est incorrecte".
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 SELECT Promo.ID, Promo.Magasin, Promo.Nom, Promo.DateDébut, Promo.DateFin FROM Promo WHERE Promo.Magasin = 70 AND SUBSTRING ( Promo.CatProf, ( SELECT CatProf.ID FROM CatProf WHERE CatProf.ID = ? ), 1 ) = 'X'
J'ai aussi essayé avec une sous requête comme ceci...
... Sans succès.
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 SELECT Promo.ID, Promo.Magasin, Promo.Nom, Promo.DateDébut, Promo.DateFin, CategPro.ID AS Variable FROM Promo, ( SELECT CatProf.ID FROM CatProf WHERE CatProf.ID = ? ) AS CategPro WHERE Promo.Magasin = 70 AND SUBSTRING(Promo.CatProf, Variable, 1) = 'X'
Je commence à désespérer. Avez-vous d'autres idées ? Ou un correctif à faire sur mes requêtes ?
Merci.
Catab
Partager