{Access} Trop de jointure dans ma requête?

Fermé
js8bleu Messages postés 576 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 27 janvier 2014 - 24 oct. 2009 à 01:16
js8bleu Messages postés 576 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 27 janvier 2014 - 27 oct. 2009 à 02:14
Bonjour,

je développe sous vb 6.0 et access 2003. Je ne sais pas pourquoi mais ma requête suivante ne marche pas :
cn.Execute " INSERT INTO tableimpdossier " & _
"   select tabledossier.numdossier, tabledossier.datedossier, tabledossier.resultat, tabledossier.commentaire, tabledossier.medecintraitant, " & _
"   tableexamen.nomexamen, tablenature.desnature, tablepropriete.nompropriete, tablepatient.numpatient, tablepatient.nompatient, tablepatient.prenompatient, " & _
"   tablepatient.sexepatient, tablepatient.contactpatient, tablevaleur.valpatient, tablevaleur.valnormale, tablevaleur.interpretation " & _
"   From tabledossier, tableexamen, tablenature, tablepropriete, tablepatient, tablevaleur " & _
"   Where tabledossier.numexamen = tableexamen.numexamen, " & _
"   tableexamen.numnature = tablenature.numnature, " & _
"   tabledossier.numpatient = tablepatient.numpatient, " & _
"   tablevaleur.numpropriete = tablepropriete.numpropriete And tablevaleur.numdossier = " & txtnumdossier & " "


Quelqu'un pourrait-il m'aider s'il vous plaît.

Merci d'avance.

Cordialement.

4 réponses

du crétin, point te moquer tu ne dois
24 oct. 2009 à 03:51
Salut

je me permets avant tout de présenter ta requete d'une manière lisible

INSERT INTO tableimpdossier
select tabledossier.numdossier
, tabledossier.datedossier
, tabledossier.resultat
, tabledossier.commentaire
, tabledossier.medecintraitant
, tableexamen.nomexamen
, tablenature.desnature
, tablepropriete.nompropriete
, tablepatient.numpatient
, tablepatient.nompatient
, tablepatient.prenompatient
, tablepatient.sexepatient
, tablepatient.contactpatient
, tablevaleur.valpatient
, tablevaleur.valnormale
, tablevaleur.interpretation
From tabledossier
, tableexamen
, tablenature
, tablepropriete
, tablepatient
, tablevaleur
Where tabledossier.numexamen = tableexamen.numexamen
, tableexamen.numnature = tablenature.numnature
, tabledossier.numpatient = tablepatient.numpatient
, tablevaleur.numpropriete = tablepropriete.numpropriete
And tablevaleur.numdossier = " & txtnumdossier & " "

Maintenant qqes commentaires (c'est plus fort que moi) :
- les colonnes ne sont pas préfixées par "colonne" alors que les tables sont toutes préfxiées par "table"
- tu peux (tu dois) utiliser des alias lorsque les noms des tables sont (un peu) longs : ici d pour tabledossier, x pour tableexamen, n pour tablenature, p pour tablepropriete, m pour tablepatient et v pour tablevaleur... juste dans le but de faciliter la lecture (la tienne et celle des autres)
- c'est très bien de préciser pour chaque colonne d'où elle vient : aucune ambiguité n'est (et ne sera) possible.ainsi, si plus tard tu rajoutes une colonne homonyme, tes requêtes ne sont pas à retoucher
- pourquoi insérer tout ça dans tableimpdossier ? Pour imprimer un dossier ? profite donc d'être sous Access et utilise donc les objets requête qui te permette la sélection que tu désires sans devoir passer par une table temporaire. Si plus tard, tu migres ton appli sous un sgbd/r tu feras la même chose avec les vues (enfin presque).
- je comprends pas que Access ne t'envoie pas de grosses baffes quand tu joins tes prédicats indifféremment par des virgules ou des AND. tu peux m'expliquer ça ? La réponse à ta question est peut-être alors : remplacer les virgules dans la clause where par des AND pour connecter tous ces prédicats entre eux.
- et en voulant rendre plus lisible ta requête, j'ai passé en revue les prédicats et j'ai remplacé toutes les virgules par des AND. Et de m'y attarder de la sorte m'a fait sauter aux yeux un vérité tout crue : ta jointure n'est pas complète : tu as un joint patient-dossier-examen-nature et un autre valeur-propriété mais rien entre les deux ! j'ai l'impression qu'il manque dossier-valeur sur numdossier mais comme il n'y a que toi qui puisse le valider

tu nous tiens informés stp ?
0
js8bleu Messages postés 576 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 27 janvier 2014 4
24 oct. 2009 à 08:42
Bonjour et Merci pour ton intervention. Tu as effectivement raison pour toutes tes remarques. Voici ma nouvelle requête qui ne marche que lorsque j'enlève
D.numpatient AS NumPatient
(j'ai l'erreur comme quoi le champ est inconnu pour il existe bien sous ce nom dans la table tabledossier) :

INSERT INTO tableimpdossier
select D.numdossier AS NumDossier
, D.datedossier AS DateDossier
, D.resultat AS Resultat
, D.commentaire AS Commentaire 
, D.medecintraitant AS MedecinTraitant
, E.nomexamen AS NomExamen
, N.desnature AS DesNature
, PR.nompropriete AS NomPropriete
, D.numpatient AS NumPatient
, PA.nompatient AS NomPatient
, PA.prenompatient AS PrenomPatient
, PA.sexepatient AS Sexe
, PA.contactpatient AS ContactPatient
, V.valpatient AS ValPatient
, V.valnormale AS ValNormale
, V.interpretation AS Interpretation
From tabledossier D
, tableexamen E
, tablenature N
, tablepropriete PR
, tablepatient PA
, tablevaleur V
Where D.numexamen = E.numexamen 
AND E.numnature = N.numnature 
AND D.numpatient = PA.numpatient 
AND D.numdossier = V.numdossier 
AND V.numpropriete = PR.numpropriete 
AND V.numdossier = " & txtnumdossier & " "



Je crois les avoir toutes pris en compte sauf la suivante où je ne sais pas comment procéder :

- pourquoi insérer tout ça dans tableimpdossier ? Pour imprimer un dossier ? profite donc d'être sous Access et utilise donc les objets requête qui te permette la sélection que tu désires sans devoir passer par une table temporaire. Si plus tard, tu migres ton appli sous un sgbd/r tu feras la même chose avec les vues (enfin presque). 


Peux-tu m'aider s'il te plaît? Tu m'as vraiment donné espoir.

Merci d'avance.

Cordialement.
0
Bonjour,

La remarque a été faite d'après le nom de la table et son contenu : on a vraiment l'impression que cette table (tableimpdossier) n'existe que pour disposer des données à mettre en place dans une page à imprimer.

Access ne dispose pas de vue. Cette absence a été palliée par la notion de Requête qui te permet de définir et nommer autant de jointures que tu peux en avoir besoin et de t'en servir lorsque bon te semble.

Dans ton cas, tu pourrais définir une requête "ImpressionDossier" qui correspondrait à
select D.numdossier AS NumDossier
, D.datedossier AS DateDossier
, D.resultat AS Resultat
, D.commentaire AS Commentaire 
, D.medecintraitant AS MedecinTraitant
, E.nomexamen AS NomExamen
, N.desnature AS DesNature
, PR.nompropriete AS NomPropriete
, D.numpatient AS NumPatient
, PA.nompatient AS NomPatient
, PA.prenompatient AS PrenomPatient
, PA.sexepatient AS Sexe
, PA.contactpatient AS ContactPatient
, V.valpatient AS ValPatient
, V.valnormale AS ValNormale
, V.interpretation AS Interpretation
, V.NumDossier as NumeroDuDossierÀImprimer
From tabledossier D
, tableexamen E
, tablenature N
, tablepropriete PR
, tablepatient PA
, tablevaleur V
Where D.numexamen = E.numexamen 
AND E.numnature = N.numnature 
AND D.numpatient = PA.numpatient 
AND D.numdossier = V.numdossier 
AND V.numpropriete = PR.numpropriete
À partir de ce moment, tu disposerais d'un objet requête qui te liste *toutes* les lignes nécessaires pour n'importe quelle ImpressionDossier.
Il te suffirait alors de ne retenir de ce query que les lignes où NuméroDuDossierÀImprimer est égal à txtNumDossier.
Un autre intérêt de cet objet requête est que sa structure est validée lors de sa conception et n'a donc plus à être validé à chaque utilisation, ce qui n'est pas le cas de dont insert/select dont la validité sera vérifiée à chaque exécution (alors que tu sais très bien que le texte de cette requête ne changera pas).

N'étant pas utilisateur d'Acces, je ne sais pas comment tu peux dire à un instant t "select * from ImpressionDossier where NuméroDuDossierÀImprimer = " & txtNumDossier ... mais je suis sûr qu'en cherchant un peu tu trouveras comment faire
0
js8bleu Messages postés 576 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 27 janvier 2014 4
27 oct. 2009 à 02:14
Bonjour et Merci Séquelle pour tes conseils. Tes conseils me semblent très bon et efficace. Je vais tenter de régler ce problème :

N'étant pas utilisateur d'Acces, je ne sais pas comment tu peux dire à un instant t "select * from ImpressionDossier where NuméroDuDossierÀImprimer = " & txtNumDossier ...


en espérant que quelqu'un pourrait m'aider. Merci pour tout.

Cordialement.
0