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

8 réponses

  1. 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
    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
    2. 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
    3. 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
  2. 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
  3. vince
     
    Je te remercie beaucoup , je vais essayer de comprendre et d'adapter tout ca ce matin

    Merci encore
    Cordialement
    vince
    0
  4. 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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. 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
    1. 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
    2. 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
      1. vince > Utilisateur anonyme
         
        Oki pas de probleme
        je te remercie

        ++
        Vince
        0
  7. 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
  8. 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
    1. 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
  9. 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