Problème de requete avec restriction

frelon444 Messages postés 2 Date d'inscription samedi 9 juillet 2005 Statut Membre Dernière intervention 9 juillet 2005 - 9 juil. 2005 à 16:36
frelon444 Messages postés 2 Date d'inscription samedi 9 juillet 2005 Statut Membre Dernière intervention 9 juillet 2005 - 9 juil. 2005 à 18:46
Bonjour,
Je suis en train de réaliser un formulaire en VBA dans Access. J'ai généré ma base de données avec SQL.
Mon problème est le suivant:
je veux afficher dans mon formulaire chaque enregistrement de ma table CLIENTS, les contrôles du formulaires reprenant pour chaque client son nom, prenom,codeclient, etc..., ce qui ne me pose pas de problèmes.
Je veux également récupérer pour chaque client dans une zone de liste "LstAnimaux" (il s'agit d'une base pour une clinique vétérinaire) l'ensemble des animaux qui lui appartiennent (clé primaire de la table client : CodeClient , clé étrangère dans la table animaux : CodeClient).
Ma question est la suivante: comment formuler ma requête sql dans mon code pour n'afficher que les animaux liés au client affiché?

Les éléments du code qui semblent poser un problème ont été soulignés:
(ne pas tenir compte des quotes de commentaires pour le code)
Private Sub Form_Load()
Set RsClients = New ADODB.Recordset
RsClients.ActiveConnection = connexion
RsClients.CursorLocation = adUseClient
RsClients.CursorType = adOpenStatic
RsClients.LockType = adLockOptimistic
On Error GoTo gestion_erreur
RsClients.Open "CLIENTS"
Call liste_animaux
'tester si le recordset contient au moins un enregistrement a afficher
If RsClients.RecordCount > 0 Then
'dans ce cas, l'afficher et activer tous les boutons
affichage
Boutons_tous
Else
'sinon, passer en mode ajout
Boutons_ajouter
End If
Champs_invalides
Exit Sub
gestion_erreur:
MsgBox "problème lors de l'ouverture de la table client"
End Sub

Private Sub liste_animaux()
' 'activer le recordset
' Set RsAnimaux = New ADODB.Recordset
' 'définir ses caractéristiques
' RsAnimaux.ActiveConnection = connexion
' RsAnimaux.CursorLocation = adUseClient
' RsAnimaux.CursorType = adOpenStatic
' RsAnimaux.LockType = adLockReadOnly
' 'ouvrir le recordset
RsAnimaux.Open "select CodeAnimal,NomAnimal,Sexe,Couleur,Race,ANIMAUX.CodeClient from ANIMAUX,CLIENT? where ?????"
' 'si le recordset n'est pas vide, on alimente la combox
' If RsAnimaux.RecordCount > 0 Then
' 'trier le recordset sur le nom du representant
' RsAnimaux.Sort = "NomAnimal ASC"
' RsAnimaux.MoveFirst
' LstAnimaux.RowSourceType = "Liste valeurs"
' LstAnimaux.RowSource = RsAnimaux![NomAnimal] & ";" & RsAnimaux![CodeAnimal] & ";" & RsAnimaux![Sexe] & _
' ";" & RsAnimaux![Couleur] & ";" & RsAnimaux![Race]
' Do
' RsAnimaux.MoveNext
' If Not RsAnimaux.EOF Then
' LstAnimaux.RowSource = LstAnimaux.RowSource & ";" & RsAnimaux![NomAnimal] & ";" & RsAnimaux![CodeAnimal] & ";" & RsAnimaux![Sexe] & _
";" & RsAnimaux![Couleur] & ";" & RsAnimaux![Race]
End If
Loop While Not RsAnimaux.EOF
End If

'les données sont transférées dans la zone de liste,
'on a donc plus besoin du recordset
'destruction du recordset
If RsAnimaux.State = adStateOpen Then
RsAnimaux.Close
End If
'Désactiver (liberer) l'objet Recordset
Set RsAnimaux = Nothing
End Sub

Private Sub affichage()
If Not IsNull(RsClients.Fields!CodeClient) Then
TxtCodeClient.Value = RsClients.Fields!CodeClient
Else
TxtCodeClient.Value = ""
End If
If Not IsNull(RsClients.Fields!nom) Then
TxtNomClient.Value = RsClients.Fields!nom
Else
TxtNomClient.Value = ""
End If
If Not IsNull(RsClients.Fields!Prenom) Then
TxtPrenomClient.Value = RsClients.Fields!Prenom
Else
TxtPrenomClient.Value = ""
End If
If Not IsNull(RsClients.Fields!CodePostal) Then
TxtCodePostal.Value = RsClients.Fields!CodePostal
Else
TxtCodePostal.Value = ""
End If
If Not IsNull(RsClients.Fields!Adresse1) Then
TxtAdresse1.Value = RsClients.Fields!Adresse1
Else
TxtAdresse1.Value = ""
End If
If Not IsNull(RsClients.Fields!Adresse2) Then
TxtAdresse2.Value = RsClients.Fields!Adresse2
Else
TxtAdresse2.Value = ""
End If
If Not IsNull(RsClients.Fields!Ville) Then
TxtVille.Value = RsClients.Fields!Ville
Else
TxtVille.Value = ""
End If
If Not IsNull(RsClients.Fields!NumTel) Then
TxtNumTel.Value = RsClients.Fields!NumTel
Else
TxtNumTel.Value = ""
End If
If Not IsNull(RsClients.Fields!Assurance) Then
TxtAssurance.Value = RsClients.Fields!Assurance
Else
TxtAssurance.Value = ""
End If
' LstAnimaux.Value = RsClients.Fields!CodeClient
End Sub

2 réponses

cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
9 juil. 2005 à 17:35
Salut
Merci, pour une fois qu'une question est correctement posée, ça fait plaisir de répondre :-)
... Tout simplement comme ceci :

RsAnimaux.Open "Select ANIMAUX.CodeAnimal, " & _
ANIMAUX.NomAnimal, " & _
ANIMAUX.Sexe, " & _
ANIMAUX.Couleur, " & _
ANIMAUX.Race, " & _
ANIMAUX.CodeClient, " & _
CLIENT.Nom " & _
From ANIMAUX, CLIENT " & _
Where ANIMAUX.CodeClient = CLIENT.CodeClient"
ou Where ANIMAUX.CodeClient = " & LaVariableVbQuiContientLeCodeClient
(ne choisir qu'un seul des Where proposés, bien sûr)

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
(je
0
frelon444 Messages postés 2 Date d'inscription samedi 9 juillet 2005 Statut Membre Dernière intervention 9 juillet 2005
9 juil. 2005 à 18:46
Le problème avec Where ANIMAUX.CodeClient = CLIENT.CodeClient, c'est qu'il m'affiche tous les animaux de tous les clients. Il me semble qu'il doit y avoir un moyen de récupérer la valeur du contrôle qui contient le CodeClient du client en cours (TxtCodeClient) mais je ne parviens pas à l'associer au codeclient de la requête (ANIMAUX.CodeClient). ?
0