Requete parametrée avec zone de liste

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

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

      Merci encore
      Cordialement
      vince
      1. 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
        1. 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
          1. 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
          2. 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
        2. 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
          1. 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.
            1. 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
          2. 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