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 :

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'
Avec ? étant la variable que je souhaite injecter depuis Excel.
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.

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'
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".

J'ai aussi essayé avec une sous requête comme ceci...

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'
... Sans succès.

Je commence à désespérer. Avez-vous d'autres idées ? Ou un correctif à faire sur mes requêtes ?

Merci.

Catab