Requete parametrée avec zone de liste

Vince -  
 aloux18 -
Bonjour,
Je suis en train de créer une base de données sous ACCESS 2000 dans le cadre d'un stage et j'aimerai creer une requete paramétrée par l'utilisateur dans un formulaire.
J'ai lu dans le forum plusieurs fois ce meme style de question mais il n'y avais pas reelement la reponse. :-)

Au lieu que la fenetre [Entrer votre paramétre], j'aimerai que l'utilisateur est le choix parmi une liste déroulante ou une zone liste.
Je n'arrive pas à trouver comment faire.
Pourriez vous m'aider ou m'indiquer ou je peux trouver ce genre d'information.

Merci d'avance
Cordialement
Vince
A voir également:

8 réponses

Utilisateur anonyme
 
Bonjour Vince,

Voilà, je savais que c'était possible puisque j'ai fait la manoeuvre
sous VB6, alors il ne me manquait que quelques petites instructions.

Donc :

Une table T_Pays et une T_Demande
Une requête R_Pays

Selon mes méthodes, je créerais un requête sur la table T_Demande
de façon a avoir tous les enregistrements de la table.
Une requête sur la table T_Pays pour avoir tous les pays
Une requête dur la table T_Demande avec critere sur le pays

D'ou :

Table : T_Pays , T_Demande

Requête : R_Pays , R_Pays_Specifique

Maintenant, tu accroche une liste déroulante du formulaire
sur la requête R_Pays

Dans le formulaire, sur l'évènement AfterUpdate de la liste déroulante,
tu place le code :

//**************************************************
Private Sub Liste_Pays_AfterUpdate() 'Liste déroulante

Dim Chaine As String
Dim Critere As String
Dim var_Pays As String

On Error GoTo Liste_Pays_Err

var_Pays = Forms![Formulaire Pays].[Liste_Pays]
Chaine = "Select * from [T_Pays] where [Pays] = "
Critere = Chaine & """" & var_Pays & """"

If (ChangeRequeteDef("R_Pays_Specifique", Critere)) Then
Set Ensemble = CurrentDb.OpenRecordset("R_Pays_Specifique")
Ensemble.MoveLast
Ensemble.MoveFirst
ZoneDeTexte.Value = Ensemble.RecordCount
Ensemble.Close
End If

Liste_Pays_Exit:
Exit Sub

Liste_Pays_Err:
MsgBox Error$
Resume Liste_Pays_Exit

End Sub


-----------------------------------
'Ici la fonction qui modifie la requète.
'Il serait souhaitable de placer cette fonction
' dans un module de façon à ce qu'elle soit accessible
' de partout.

Public Function ChangeRequeteDef(ChaineRequete As String, ChaineSQL As String) As Boolean

Dim Definition As Variant

If ((ChaineRequete = "") Or (ChaineSQL = "")) Then
ChangeRequeteDef = False
Else
Set Definition = CurrentDb.QueryDefs(ChaineRequete)
Definition.SQL = ChaineSQL
Definition.Close
RefreshDatabaseWindow
ChangeRequeteDef = True
End If

End Function


Est-ce clair pour toi ?

Lupin
1
vince
 
Re:

Oui c'est tres clair, je vais tester ca.
Je pense que je vais y arriver cet fois ci

Encore merci
Je tiendrai au courant pour te dire

++
vince
0
best78 Messages postés 10 Statut Membre 1
 
Bonjour , Arsen Lupin.

je viens juste de m'inscrire sur ce forum, et en prenant connaissance de ton message celui-ci m'a QQ peu intéressé.
En effet, j'ai remarqué que tes connaissances d'ACCESS sont trés fiables , moi qui ne suis qu'un amateur, je rencontre un problème pour moi modifier des données sur ma base.

pour mieux me présenter avant de poser ma question.

je suis gardien d'immeuble et pendant mes heures de libre, je m'initie à l'informatique. Mais,je rencontre des problèmes.

J'essais a partir d'une requête de touver la position d'un caractère dans un mot, dans le but de supprimer un certain nombre de caractères a partir de la position recherchée.
J'ai essayé avec :
CHERCHE(texte_cherché;texte;no_départ)
ici
CHERCHE(Caract$("*(*");[Concours]![ENTRAINEURS];1)
en retour: "fonction 'recherche' non définie dans l'expression"
Alors que si j'utilise la fonction Left$("expression recherchée",4) cela s'exécuter normalement.
Je n'y comprends rien :-))

aurais-tu, une solution.
Merci, et au plaisir de te lire
0
Utilisateur anonyme
 
Bonjour best78,

Bon je t'accorde que j'ai quelques notions, mais je ne suis pas
expert, de plus je me débrouille mieux sous VBA que sous
Access lui-même. En considérant que j'ai commencé à programmer
sous QuickBasic (cousin du VBA) vers 1986, il est un peu normal
que je sois à l'aise sous VBA.

Donc en VBA, je procèderais comme suit :

Sub Recherche()

Dim Valeur, Chaine As String
Dim Position As Integer

Valeur = "Lettre clé recherché dans ce texte"
Position = InStr(1, Valeur, "é", vbTextCompare)
If (Position > 0) Then
'Pour capturer les caractère qui précèdent
Chaine = Mid(Valeur, 1, Position)
'Pour capturer les caractères qui succèdent
Chaine = Mid(Valeur, (Position + 1))
Else
MsgBox "Caractère non trouvé!"
End If

End Sub

'InStr - 1er argument - A partir de cette position cherche
' 2e argument - Cherche dans cette chaine
' 3e argument - Le(s) caractère(s) recherché(s)
' 4e argument - Type de comparaison

'Mid - 1er argument - La chaine a traité
' 2e argument - A partir de ce caractère
' 3e argument - Le nombre de caractères, si non-spécifié = tout le reste


Bon, est-ce que ceci te conviendra ?

Lupin
0
Lupin
 
Salut,

Je ne sais si tu sauras adapter, mais voici un exemple tiré de ma
BD de ma vidéothèque. En fait je modifie la requête par
programmation suite à un chaix dans un liste déroulante.

Il te faut d'abord avoir une requète existante.
//**************************************************
Private Sub Liste_Cassette_AfterUpdate()

Dim Chaine As String
Dim Critere As String
Dim CassetteVidéo As String

On Error GoTo Liste_Cassette_Err

'Ici je capture la valeur de la liste déroulante.

CassetteVidéo = Forms![Formulaire Table Vidéo].[Liste Cassette]
'Ici je crée une nouvelle requète SQL
Chaine = "Select * from [Table Vidéo] where [Cassette] = "
'Ici j'inclus le critère dans la requète
Critere = Chaine & """" & CassetteVidéo & """"

'Ici, j'appelle une fonction qui va modifier la requète originale.
If (ChangeRequeteDef("Requête Liste Spécifique Cassette", Critere)) Then
'Ici je fais ouvrir le formulaire qui prend sa source de la requète.
DoCmd.OpenForm "Formulaire Liste Spécifique Cassette", acNormal, "", "[Cassette]", , acNormal
End If

Liste_Cassette_Exit:
Exit Sub

Liste_Cassette_Err:
MsgBox Error$
Resume Liste_Cassette_Exit

End Sub


-----------------------------------
'Ici la fonction qui modifie la requète.

Public Function ChangeRequeteDef(ChaineRequete As String, ChaineSQL As String) As Boolean

Dim Definition As Variant

If ((ChaineRequete = "") Or (ChaineSQL = "")) Then
ChangeRequeteDef = False
Else
Set Definition = CurrentDb.QueryDefs(ChaineRequete)
Definition.SQL = ChaineSQL
Definition.Close
RefreshDatabaseWindow
ChangeRequeteDef = True
End If

End Function

En espérant que tu y trouve ton bonheur !

Lupin
0
vince
 
Je te remercie beaucoup , je vais essayer de comprendre et d'adapter tout ca ce matin

Merci encore
Cordialement
vince
0
vince
 
rebonjour,

es ce que tu pourrai me donner plus d'indication car j'y arrive pa
Disons que j'ai un formulaire (F_Pays), avec une table T_pays et a l'interieur Pays et codepays
Dans mon formulaire j'ai ma liste deroulante (Liste_Pays) et la zon text (Resultat)

Comment je m'en sors? Je remplace :
-Formulaire Table Vidéo = Nom du formulaire
-Liste Cassette =? Liste_Pays ?? ou nom de la zone text
-Cassette= Pays ?
-Table Vidéo= T_pays

merci d'avance
Vince
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
 
Salut Vince,

Bon si je comprends bien, ton formulaire est accroché sur une
table. Personnellement je te recommande de toujours accrocher
un formulaire sur une requête et la requête sur la table.

Ceci dit, tu crée une requête qui va sélectionner un enregistrement
en placant un critère coresspondant au champs de la liste déroulante.

Tu ouvre la requète et tu passes en mode SQL, tu auras donc
ainsi une chaine SQL.

Ça devrait donner quelque chose comme :

SELECT *
FROM [T_Pays]
WHERE ((([T_Pays].Pays)="CANADA"));

Maintenant, il faut reconstruire le chaine SQL en incorporant
la variable qui provient de la liste déroulante.

Var_Pays = Forms![F_Pays].[Liste_Pays]
Chaine = "Select * from [T_Pays] where [Pays] = "
Critere = Chaine & """" & Var_Pays & """"

d'où : Critere = "Select * from [T_Pays] where [Pays] = " & """" & Var_Pays & """"

Maintenant, que faire avec le résultat ? A quoi sert cette requête?

If (ChangeRequeteDef("Requete_Liste_Pays", Critere)) Then

???

End If

Bon, y comprend tu quelque choses ???


Lupin
0
vince
 
salut LUpin

Bon j'ai essayé mais pas reellement compris comment ca marchai car en faite le code que tu me donne fo que je mette dans le code du formulaire?

Bon j'essaye de t'expliquer ce que j'essaie d'avoir
J'ai une table pays (T_Pays) avec des pays et leur code
J'ai une table demade (T_demande). Une demande est faite dans un pays
A la base ce que je voulai faire ce sont des statistiques. C'est a dire que l'utilisateur selectionne le pays dans un formulaire et dans un fichier text il m'affiche le nombre de demande faite dans ce pays. (apres je verai pour les graph)

Donc j'avais fais une requete avec le pays et un autre champ qui comptai le nombre de demande.
Nom de la requete: R_Pays
Apres j'ai crée un formulaire avec l'assistant avec la requete.
J'ai transformé ma boite text en liste deroulante en indiquant le contenu (de T_Pays) et je suis aller dans evenement Apres MAJ et j'ai essayé d'inserer ton code a cet endroit.

Seulement comment je fais pour afficher le nombre de demande dans ma boite texte?
Bon si je suis a coté de la plaque tampis dis le moi si j'ai rien compris. ;-)

Voila
je pensai en fait qu'access pouvai faire ce genre de truc sans avoir besoin de coder.

Merci
0
Utilisateur anonyme
 
Bonjour Vince,

Ça va, tu tiens la rampe je crois :)

Il faut comprendre que pour visualiser le résultat de la requête
modifier, j'ai créé un formulaire tabulaire. Or pour l'instant je
n'ai pas réussi à capturer le nombre d'enregistrement à partir
de la requête. Alors je t'explique un peu ce que je fais et je te
reviens la dessus!

En fait, tel que démontré dans mon exemple, si le changement
de requête s'effectue, j'ouvre un second formulaire basé sur
la requête que je viens de modifier, j'arrive très bien à faire
afficher le nombre d'enregistrements de ce second formulaire
dans le premier, mais je dois quand même l'ouvrir.

ex. :

If (ChangeRequeteDef("Requête Liste Spécifique Cassette", Critere)) Then
DoCmd.OpenForm "Formulaire Liste Spécifique Cassette", acNormal, "", "[Cassette]", , acNormal
Forms![Formulaire Liste Spécifique Cassette].Visible = False
Set Ensemble = Forms![Formulaire Liste Spécifique Cassette].RecordsetClone
'-->>> Ici j'inscrit le nbr d'enregistrements
Forms![Formulaire Table Vidéo].[NombreRecherche].Value = Ensemble.RecordCount
DoCmd.Close acForm, "Formulaire Liste Spécifique Cassette", acSaveNo
Set Ensemble = Nothing
End If

Bon, si je trouve comment l'extraire de la requête, je te fais signe.

Lupin
0
vince > Utilisateur anonyme
 
Oki pas de probleme
je te remercie

++
Vince
0
best78
 
bonjour, arsen lupin

je te remercie d'avoir répondu à mon problème.

ALors j'ai essayer la fonction " inStr(x;text, car_rech; compare) sur ma requête sans résultat.
mais qu'a cela ne tienne, je vais essayer de le faire en VBA aprés avoir prit connaissance du bouquin.
Si je n'y parviens pas, je me permettrai de reprendre contact avec toi.

Encore merci
Best78
0
best78
 
Yes!

Merci, de ton aide.
j'y suis arrivé, dans" ACCESS" difficile, mais c'est fait.
En réalité, le terme COMPARE est à mettre dans la ligne, critères de la requête et non dans l'expression en elle même.

ouff, j'ai eu du mal.
merci, si j'ai d'autres problèmes, je viendrait te revoir.
+ +
°
~

Cordialement, best78
PS: je vais essayer de me mettre au VBA. Comme tu es de la partie, je viendrai te voir sur le forum. Bein entendu si cela ne t'ennui pas.
0
Utilisateur anonyme
 
Bonjour best78,

Une bonne nouvelle, il serait souhaitable d'ouvrir un nouveau
fil pour poser une question différente! Autant pour la personne
qui pose la question, que pour la personne qui donne une
réponse.

Merci de bien lire la charte du forum.

Lupin
0
aloux18
 
bjr,
g commencer aujourd'hui en vb et je ne c pas a quoi sert la public function
la réponse fonction publique ne m'intéresse pas bien entendu!
je voudrais une veritabl explication!
merci d'avance
0