Bonjour,
J'ai un problème pour réaliser une liaison particulièrement complexe sous Access. Je tiens à remercier les courageux qui me liront jusqu'au bout et qui s'intéresseront à mon problème.
Je crée une table "CoutArticle" dans laquelle j'ai 6 champs : CodeArticle, CoutMatiere, CoutTotal, CouTemps, CoutDecoupe, CoutVulcanisation et CoutSurface. CodeArticle, CoutMatiere et CoutTotal sont des données provenant d'une table Table2.
CoutTemps est la somme de CoutTotal et CoutMatiere. CoutSurface est la somme de CoutDecoupe et CoutVulcanisation.
Table1 contient le CodeArticle et un PrixStandard pour chaque article. Table2 contient les données de prix pour le calcul du CoutMatiere et du CoutTotal. On ne s'en occupera pas le problème que j'ai ici.
La Table3 contient un CodeOperation, en fonction du CodeArticle, égal à "99996" (j'ai alors un CoutVulcanisation) ou "99997" (m'indiquant un CoutDecoupe) me donnant, pour chacun des deux, un TarifHoraire distinct.
Ma Table1 contient deux enregistrements où le CodeArticle est égal à "99996" et "99997" avec des PrixStandard distincts.
Le principe est, pour chaque CodeArticle, je calcule le CoutTemps par la Table2.
Puis je calcule le CoutSurface par la Table3. Le cheminement de calcul est le suivant : dans ma Table1, j'ai un CodeArticle. Par cette donnée, je vais chercher dans la Table3 son CodeOperation. S'il est égal à "99996" ou "99997", je récupère le TarifHoraire correspondant. Par ce CodeOperation, je vais chercher dans ma Table1, qui contient deux enregistrement dont le CodeArticle est égal à "99996" et "99997", leur PrixStandard. Je fais ensuite ce calcul : TarifHoraire * PrixStandard.
Ma première démarche a été de créer ma table CoutArticle avec mes CoutDecoupe, CoutVulcanisation et CoutSurface égaux à 0. J'effectuai ensuite 3 mises à jour de ma table CoutArticle afin de remplir ces 3 champs (CoutDecoupe, puis CoutVulcanisation, et enfin CoutSurface). Maintenant j'aimerais faire ces 4 requêtes en une seule. La liaison que j'aimerais faire ressemblerait donc à ceci :
((Table1 INNER JOIN Table2) LEFT JOIN Table3) INNER JOIN Table1
J'ai deux cas possibles : Le CodeOperation est égal à "99996" ou "99997". J'ai donc 2 SELECT. J'ai pensé les introduire directement dans mon FROM. Voici don à quoi ressemblerait ma liaison :
Table1 INNER JOIN Table2
LEFT JOIN Table3-1 INNER JOIN Table1-1
LEFT JOIN Table3-2 INNER JOIN Table1-2
Or ce type de liaison (un INNER JOIN après un LEFT JOIN) m'est interdit sous Access, tout comme le RIGHT JOIN...
J'ai donc pensé à intégrer directement les requêtes "Table3-1 INNER JOIN Table1-1" et "Table3-2 INNER JOIN Table1-2" directement dans mon FROM final.
Table1-1 est obtenu par un SELECT de Table1 :
SELECT CodeArticle, PrixStandard FROM Table1 WHERE Trim(Table1.CodeArticle) = "99997"
Table3-1 est la requête suivante :
SELECT Table3.CodeArticle, Table3.CodeOperation, Table3.TarifHoraire, Table1-1.PrixStandard AS PrixStandard FROM Table3 INNER JOIN [SELECT CodeArticle, PrixStandard FROM Table1 WHERE Trim(Table1.CodeArticle) = "99997"]. AS Table1-1 ON Table3.CodeArticle = Table1-1.CodeArticle WHERE Left(Table3.Code, 5) = "99997"
J'ai donc intégré directement ma requête Table1-1 dans cette requête 3-1.
De même j'obtiens la requête de Table 1-2 et Table 3-2 où le CodeOperation est "99996" :
SELECT Table3.CodeArticle, Table3.CodeOperation, Table3.TarifHoraire, Table1-2.PrixStandard AS PrixStandard FROM Table3 INNER JOIN [SELECT CodeArticle, PrixStandard FROM Table1 WHERE Trim(Table1.CodeArticle) = "99996"]. AS Table1-2 ON Table3.CodeArticle = Table1-2.CodeArticle WHERE Left(Table3.Code, 5) = "99996"
Je pense qu'il y a une erreur dans le premier SELECT des Table3-1/2, au moment où je fais appel à Table1-1/2.PrixStandard AS PrixStandard ; j'y fais appel trop tôt (puisqu'à ce moment-là, ma Table1/2 n'est pas encore créée...), mais je ne vois pas comment procéder autrement.
Voilà donc le code de mon FROM final (je sais, c'est imbuvable, sincèrement désolé...) :
FROM ((Table1 INNER JOIN Table2 ON Trim(Table1.CodeArticle) = Trim(Table2.CodeArticle)) LEFT JOIN [SELECT Table3.CodeArticle, Table3.CodeOperation, Table3.TarifHoraire, Table1-1.PrixStandard AS PrixStandard FROM Table3 INNER JOIN [SELECT CodeArticle, PrixStandard FROM Table1 WHERE Trim(Table1.CodeArticle) = "99997"]. AS Table1-1 ON Table3.CodeArticle = Table1-2.CodeArticle WHERE Left(Table3.CodeOperation, 5) = "99997"]. AS Table3-1 ON Trim(Table1.CodeArticle) = Trim(Table3.CodeArticle)) LEFT JOIN [SELECT Table3.CodeArticle, Table3.CodeOperation, Table3.TarifHoraire, Table1-2.PrixStandard AS PrixStandard FROM Table3 INNER JOIN [SELECT CodeArticle, PrixStandard FROM Table1 WHERE Trim(Table1.CodeArticle) = "99996"]. AS Table1-2 ON Table3.CodeArticle = Table1-2.CodeArticle WHERE Left(Table3.CodeOperation, 5)="99996"]. AS Table3-2 ON Trim(Table1.CodeArticle) = Trim(Table3-2.CodeArticle)
A l'enregistrement de cette requête, j'obtiens un message d'erreur : "Syntax error in JOIN operation."
Quelqu'un pourrait-il m'éclairer?
D'avance merci de votre intérêt.
Partager