Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/04/2011, 16h07   #1
Nouveau Membre du Club
 
Homme Marc Bellêtre
Étudiant
Inscription : mars 2011
Messages : 59
Détails du profil
Informations personnelles :
Nom : Homme Marc Bellêtre
Âge : 20
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mars 2011
Messages : 59
Points : 26
Points : 26
Par défaut Afficher des champs inexistants

Bonjour,

Mon titre est sûrement un peu bizarre mais je ne savais pas expliquer autrement.

Je dois créer une application de gestion de formations d'opérateurs. Pour cela j'ai dans ma base de données deux tables (entre autres) : Modules et Opérateurs_Modules. La table Operateurs_Modules contient l'identifiant d'un opérateur, celui d'un module ainsi que sa date d'acquisition, le nom du formateur et des observations.

Je voudrai, pour un opérateur donné, afficher tous les modules qu'il doit accomplir (c'est fait) et afficher pour chaque module les informations concernant son acquisition par l'opérateur (càd Date, Formateur et Observations). Je voudrais en revanche, et c'est là que se situe le problème, que même si un opérateur n'a pas acquis le module et n'a donc pas d'entrée enregistrée dans la table Operateurs_Modules, le module soit affiché avec des cases vides pour les informations d'acquisition.

Je ne sais pas comment m'y prendre car en sélectionnant ces informations à l'aide de l'identifiant de l'opérateur, le module ne s'afficherait pas du tout si l'opérateur n'a pas d'entrée dans Opérateurs_Modules.

Le problème est un peu difficile à énoncer mais j'espère m'être bien fait comprendre quand même! Merci d'avance.

Cordialement,
Prettyletter
Prettyletter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 16h21   #2
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 462
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 462
Points : 7 539
Points : 7 539
Donc, ce que tu veux faire c'est afficher tous tes modules, qu'un oppérateur l'ai fait ou pas.

Il te suffit de faire une jointure à droite.
  1. Vas dans l'assistant de création de requête
  2. Crée ta requête qui relie ta table opérateur à ta table module.
  3. Puis clique sur la jointure avec le bouton droit et choisi : Propriétés de la jointure
  4. Là tu peux choisir type 2 ou 3. (Fait un essai pour voir laquelle est la bonne mais logiquement cela devrait être 3).
A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 08h47   #3
Nouveau Membre du Club
 
Homme Marc Bellêtre
Étudiant
Inscription : mars 2011
Messages : 59
Détails du profil
Informations personnelles :
Nom : Homme Marc Bellêtre
Âge : 20
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mars 2011
Messages : 59
Points : 26
Points : 26
Bonjour,

Je pense que c'est effectivement la solution à mon problème. En revanche j'ai besoin d'effectuer cette requête via VBA, donc je dois l'écrire en SQL.
Ma requête ne fonctionne pas à cause d'une "expression JOIN non supportée". Je dois m'être trompé dans la syntaxe mais je ne vois pas où. Voici ma requête :

Code :
1
2
3
SELECT [code.], [LIBELLE], MODULES.[IDX ID], OPERATEURS_MODULES.[FORMATEUR], OPERATEURS_MODULES.[DATE_ACQ], OPERATEURS_MODULES.[OBSERVATIONS] 
FROM MODULES RIGHT JOIN OPERATEURS_MODULES ON OPERATEURS_MODULES.[IDX ID_MOD] = MODULES.[IDX ID] AND OPERATEURS_MODULES.[IDX ID_OP] = 5 
WHERE [IDX ID] IN (SELECT DISTINCT [IDX ID_MOD] FROM MODULES_FP, OPERATEURS_FP WHERE OPERATEURS_FP.[IDX ID_OP] = 5 AND MODULES_FP.[IDX ID_FP] = 1);
J'ai ici pris des exemples d'identifiant pour faire les tests. Une idée?
Merci !


Edit :
C'est bon, ça marche. Il y avait donc deux problèmes dans ma requête : Le premier, qui faisait tout planter, était la position de la parenthèse. Ensuite, ce n'était pas une jointure à droite mais à gauche. Voici donc ce que m'a donné le code final :

Code :
1
2
3
4
5
6
7
8
str_Modules = "SELECT CODE, [LIBELLE], MODULES.[IDX ID], OPERATEURS_MODULES.[FORMATEUR]," _
            & " OPERATEURS_MODULES.[DATE_ACQ], OPERATEURS_MODULES.[OBSERVATIONS]" _
            & " FROM MODULES LEFT JOIN OPERATEURS_MODULES" _
            & " ON (OPERATEURS_MODULES.[IDX ID_MOD] = MODULES.[IDX ID]" _
            & " AND OPERATEURS_MODULES.[IDX ID_OP] = " & Me.cbo_Operateurs & ")" _
            & " WHERE [IDX ID] IN (SELECT DISTINCT [IDX ID_MOD]" _
            & " FROM MODULES_FP, OPERATEURS_FP WHERE OPERATEURS_FP.[IDX ID_OP] = " & Me.cbo_Operateurs & "" _
            & " AND MODULES_FP.[IDX ID_FP] = " & Me.lst_Fiches_poste & ");"
Merci encore ! =)
Prettyletter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 10h14   #4
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
Bonjour à tous,

Juste une précision qui montre, encore une fois, l'intérêt de passer par les assitants.
Citation:
Envoyé par Marot_r
Il te suffit de faire une jointure à droite.
==>
Citation:
Envoyé par Prettyletter
Ensuite, ce n'était pas une jointure à droite mais à gauche.
La liaison entre deux tables avec :
  • flèche à droite correspond à LEFT JOIN ;
  • flèche à gauche correspond à RIGHT JOIN.
==> cela peut sembler illogique, mais bon... cela dépend de quel côté nous nous plaçons.

Prettyletter, fait l'essai sur une petite requête de test via l'assisant et regarde le SQL généré.
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h26.


 
 
 
 
Partenaires

Hébergement Web