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 11/02/2011, 01h12   #1
Candidat au titre de Membre du Club
 
Michael Jordan
Inscription : avril 2010
Messages : 25
Détails du profil
Informations personnelles :
Nom : Michael Jordan

Informations forums :
Inscription : avril 2010
Messages : 25
Points : 12
Points : 12
Par défaut Problème requête SQL

Bonsoir à tous,

Je rencontre à nouveau des problèmes sur une nouvelle base de données que je suis en train de développer.

Pour l'histoire, je travaille dans une entreprise de sécurité et j'ai décidé de refaire leur base de données clientes. Chaques clients de la société sont regroupées en différents rayons et chacun de ces clients possède une ou plusieurs médailles attaché à des clés. Ma table prestation me permet de créer toutes les prestations comme indiqué ci-dessus (table de jointure)

Voici les différentes tables ainsi que les champs de ma base:

Client: Code_client/Nom_client/Adresse_client/Ville_client
Clef: Code_clef/Type_clef/Marque_clef/Reference_clef/Medaille_clef
Medaille: Code_medaille/Nom_medaille
Prestation: Rayon_prestation/Client_Prestation/Medaille_Prestation
Rayon: Code_rayon/Nom_rayon

Je bloque actuellement sur un système de recherche multi-critère. Je me suis basé sur le tutoriel de caféine. J'ai crée trois zones de texte afin de rechercher par client, N° medaille ou rayon. Mon problème est que la recherche fonctionne si je cherche un seul de ces éléments mais pas sur plus d'un. (ex: je recherche sur le rayon X le client X).

Voici le code de mon boutton "Rechercher":

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Private Sub RefreshQuery()
Dim SQL As String
 
SQL = "SELECT Client.Code_client, Client.Nom_client, Client.Adresse_client, Client.Ville_client, Client.Radio_client, Client.Acces_client, Client.Alarme_client FROM Client Where Client!Code_client <> 0"
SQL2 = "SELECT DISTINCT Client.Code_client, Client.Nom_client, Client.Adresse_client, Client.Ville_client, Client.Radio_client, Client.Acces_client, Client.Alarme_client, Medaille.Numero_medaille FROM Client INNER JOIN (Medaille INNER JOIN Prestation ON Medaille.Code_medaille = Prestation.Medaille_prestation) ON Client.Code_client = Prestation.Client_prestation Where Client!Code_client <> 0"
SQL3 = "SELECT Client.Code_client, Client.Nom_client, Client.Adresse_client, Client.Ville_client, Client.Radio_client, Client.Acces_client, Client.Alarme_client, Rayon.Nom_rayon FROM Client INNER JOIN (Rayon INNER JOIN Prestation ON Rayon.Code_rayon = Prestation.Rayon_prestation) ON Client.Code_client = Prestation.Client_prestation Where Client!Code_client <> 0"
 
If Me.txtRechClient.Value <> "" Then
    SQL = SQL & "And Client!Nom_Client like '*" & Me.txtRechClient & "*' "
End If
If Me.txtRechMedaille.Value <> "" Then
    SQL = SQL2 & "And Medaille!Numero_medaille like '*" & Me.txtRechMedaille & "*' "
End If
If Me.txtRechRayon.Value <> "" Then
    SQL = SQL3 & "And Rayon!Nom_rayon like '*" & Me.txtRechRayon & "*' "
End If
 
SQL = SQL & ";"
 
Me.lstResults.RowSource = SQL
Me.lstResults.Requery
 
End Sub
Ce que je ne comprends pas, c'est que j'ai déjà utilisé et adapté le code de la base de caféine dans une autre base qui fonctionne à présent parfaitement. La seule différence qu'il y ait, c'est qu'il n'y a pas de système de case à cocher qui laisse apparaitre les zones de texte. Celles-ci sont toujours visible.

Dans l'attente d'une réponse de votre part, je vous souhaite, une très bonne soirée.

Jordan Michael
Theboobasparks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2011, 09h41   #2
Rédacteur/Modérateur

 
Avatar de loufab
 
Homme Fabrice CONSTANS
Ingénieur développement logiciels
Inscription : avril 2005
Messages : 7 085
Détails du profil
Informations personnelles :
Nom : Homme Fabrice CONSTANS
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : avril 2005
Messages : 7 085
Points : 11 622
Points : 11 622
Bonjour,

Si tu debugge la syntaxe générée tu verras immédiatement ce qui cloche. il y a un tuto sur ce sujet si tu n'y arrive pas (voir la rubrique cours)

Petite piste : tu ne peux pas faire des recherches multicritères avec ce code.

Code :
1
2
3
4
 
cas 1 : sql = sql & condition
cas 2 : sql = sq2 & condition
cas 3 : sql = sql3 & condition
Cordialement,
__________________
Classe MELA(CRUD) Opérateur IN et zone de liste
MsGraph et VBA - 1e Partie 2e partie
Entête d'états-Opérateur LIKE-Evénements formulaires-Cours 2010
Complément :Générateur de msgbox
Visitez mon Blog
Les questions techniques par MP ne sont pas lues et je ne pratique pas l'extispicine
loufab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2011, 10h08   #3
Candidat au titre de Membre du Club
 
Michael Jordan
Inscription : avril 2010
Messages : 25
Détails du profil
Informations personnelles :
Nom : Michael Jordan

Informations forums :
Inscription : avril 2010
Messages : 25
Points : 12
Points : 12
Bonjour Loufab,

Je te remercie de ta réponse.

Je vais suivre le cours dont tu parles afin de debugguer ma syntaxe.

Et si je comprends bien, je ne peux pas créer une requête sql pour chacunes de mes zones texte, je dois donc créer une requête unique qui m'affiche toutes les informations voulues avec ce genre de code:

Code :
1
2
3
4
 
cas 1 : sql = sql & condition
cas 2 : sql = sql & condition
cas 3 : sql = sql & condition

Je vous tiens informer dès que j'ai pu essayer tout ça.

Jordan Michael
Theboobasparks est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/02/2011, 21h31   #4
Candidat au titre de Membre du Club
 
Michael Jordan
Inscription : avril 2010
Messages : 25
Détails du profil
Informations personnelles :
Nom : Michael Jordan

Informations forums :
Inscription : avril 2010
Messages : 25
Points : 12
Points : 12
Bonsoir tout le monde.

J'ai donc modifié ma requête SQL ainsi et cela fonctionne parfaitement pour la recherche:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
Private Sub RefreshQuery()
 
SQL = "SELECT DISTINCT Client.Code_client, Client.Nom_client, Client.Adresse_client, Client.Ville_client, Client.Radio_client, Client.Acces_client, Client.Alarme_client, Medaille.Numero_medaille, Rayon.Nom_rayon FROM Rayon INNER JOIN (Medaille INNER JOIN (Client INNER JOIN Prestation ON Client.[Code_client] = Prestation.[Client_prestation]) ON Medaille.[Code_medaille] = Prestation.[Medaille_prestation]) ON Rayon.[Code_rayon] = Prestation.[Rayon_prestation] Where Client!Code_client <> 0"
 
If Me.txtRechClient.Value <> "" Then
    SQL = SQL & "And Client!Nom_Client like '*" & Me.txtRechClient & "*' "
End If
If Me.txtRechMedaille.Value <> "" Then
    SQL = SQL & "And Medaille!Numero_medaille like '*" & Me.txtRechMedaille & "*' "
End If
If Me.txtRechRayon.Value <> "" Then
    SQL = SQL & "And Rayon!Nom_rayon like '*" & Me.txtRechRayon & "*' "
End If
 
SQL = SQL & ";"
 
Me.lstResults.RowSource = SQL
Me.lstResults.Requery
 
End Sub
Je rencontre malheursement un nouveau problème suite à cette modification et je sèche dessus. Les résultats affichés sont à présent souvent affichés en doublons. C'est tout à fait normal etant donné que ceci apparaissent un double dans ma table de jointure. Pour exemple, un numéro de médaille appartient a un un client unique mais peut appartenir à plusieurs rayons (donc du coup deux enregistrements dans ma table prestations), donc du coup, si je recherche par client, j'obtiendrai deux fois l'enregistrement du client concerné, et si je recherche par numéro de médaile, j'obtiendrai également deux fois l'enregisrement concerné. Je souhaite que cette information ne s'affiche qu'une seule fois. J'ai essayé avec une fonctione select distinct, puis select distinct... group by mais sans succès. Apparement, après recherche sur internet, il n'existe que ces deux façon de procéder. Y aurait-il quand même une autre solution pour empecher l'apparition des doublons lors de l'affichage des résultats.

En espérant avoir était clair et en vous remerciant déjà pour vos réponses, je vous souhaite une très bonne soirée.

Jordan Michael
Theboobasparks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 19h05   #5
Rédacteur/Modérateur

 
Avatar de loufab
 
Homme Fabrice CONSTANS
Ingénieur développement logiciels
Inscription : avril 2005
Messages : 7 085
Détails du profil
Informations personnelles :
Nom : Homme Fabrice CONSTANS
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : avril 2005
Messages : 7 085
Points : 11 622
Points : 11 622
Bonjour,

Dans le cas de requetes multitable il vaut mieux démarrer comme ceci :
  • Crée ta requete dans le générateur avec les tables et les regroupements necessaire pour que les doublons n'apparaissent plus.
  • Une fois que c'est bon rajoute tes critères, toujours dans le générateur.
  • Quand c'est bon, passe en mode SQL et copie la syntaxe dans le code et adapte tes where.
Note que les WHERE peuvent devenir des HAVING mais cela ne change rien à la syntaxe.

Cordialement,
__________________
Classe MELA(CRUD) Opérateur IN et zone de liste
MsGraph et VBA - 1e Partie 2e partie
Entête d'états-Opérateur LIKE-Evénements formulaires-Cours 2010
Complément :Générateur de msgbox
Visitez mon Blog
Les questions techniques par MP ne sont pas lues et je ne pratique pas l'extispicine
loufab est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/02/2011, 19h22   #6
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
Bonsoir à tous,

Je me permets de m'immiscer et de compléter l'excelente suggestion de Loufab : dans l'assistant, quand tu passes en regroupement, effectivement, toute la ligne "Opération" devient "Regroupement", ce qui se traduit, dans le SQL, par des HAVING pour les champs concernés par un "Critère".

Pour des raisons de performance, pour les champs concernés par un "Critère", il vaut mieux remplacer "Regroupement" par "Où" (WHERE, donc), sauf s'il s'agit d'un test sur des fonctions de regroupement (Count(*), Min(), Max(), etc...).

En effet, dans ce cas, les enregistrements seront testés AVANT leur sélection dans le groupe (GROUP BY). Sinon, ils seront testés APRES le GROUP BY, ce qui fait travailler la machine sans aucun intérêt.

Je ne sais pas si j'ai été clair, sur ce coup là...
__________________
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
Vieux 20/02/2011, 13h34   #7
Candidat au titre de Membre du Club
 
Michael Jordan
Inscription : avril 2010
Messages : 25
Détails du profil
Informations personnelles :
Nom : Michael Jordan

Informations forums :
Inscription : avril 2010
Messages : 25
Points : 12
Points : 12
Bonjour à tous,

Merci infiniment pour vos réponse. J'ai réussi a créer ma requete SQL sans doublon. J'ai tout simplement pas sélectionné les champs ou les doublons apparaissent et cela fonctionne parfaitement. Etant novice en la matière, je ne comprend pas du tout le fonctionnement. Je vais parcourir le forum à la recherche de mes réponses.

Code :
1
2
 
SQL = "SELECT DISTINCT Client.Code_client, Client.Nom_client, Client.Adresse_client, Client.Ville_client, Client.Radio_client, Client.Acces_client, Client.Alarme_client FROM Rayon INNER JOIN (Medaille INNER JOIN (Client INNER JOIN Prestation ON Client.Code_client = Prestation.Client_prestation) ON Medaille.Code_medaille = Prestation.Medaille_prestation) ON Rayon.Code_rayon = Prestation.Rayon_prestation Where Client!Code_client <> 0"
Très bonne journée à tous.
Theboobasparks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2011, 18h04   #8
Rédacteur/Modérateur

 
Avatar de loufab
 
Homme Fabrice CONSTANS
Ingénieur développement logiciels
Inscription : avril 2005
Messages : 7 085
Détails du profil
Informations personnelles :
Nom : Homme Fabrice CONSTANS
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : avril 2005
Messages : 7 085
Points : 11 622
Points : 11 622
Les doublons :

Par exemple pour :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
liste clients
A
B
 
liste facture
N° facture    Client
1                A
2                A
3                B
 
Liste des clients et facture
A                1
A                2
B                3
Compris ?

Cordialement,
__________________
Classe MELA(CRUD) Opérateur IN et zone de liste
MsGraph et VBA - 1e Partie 2e partie
Entête d'états-Opérateur LIKE-Evénements formulaires-Cours 2010
Complément :Générateur de msgbox
Visitez mon Blog
Les questions techniques par MP ne sont pas lues et je ne pratique pas l'extispicine
loufab 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 09h36.


 
 
 
 
Partenaires

Hébergement Web