IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Filter un formulaire à partir d'une requête [AC-2003]


Sujet :

VBA Access

  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 801
    Points : 1 107
    Points
    1 107
    Par défaut Filter un formulaire à partir d'une requête
    Bonjour,
    La réponse à mon problème est probablement simple pour des spécialistes du VBA mais là je sèche. Je me tourne donc vers vous.

    J'ai un formulaire (en mode formulaire unique) qui m'afiche un à un les films de la base de données (avec jaquette, réalisateur, date de sortie, durée du film etc.). Ce formulaire est basé directement sur la table T_Films.

    J'ai mis en place un système de recherche multicritère assez complexe basé sur le tutoriel trouvé ici même. Cette recherche me crée une requête que j'ai nommée R_Choix qui me fait la liste des ID des films répondant à la recherche. Pour l'instant, je change le recordsource du formulaire par une requête qui joint la table T_Films avec la requête R_Choix. Le formulaire ne m'affiche donc plus que les films répondant à la recherche. Nickel !

    Par contre je ne peux pas modifier les champs du formulaire Existe-t-il un moyen de filtrer mon formulaire avec ma requête R_Choix (avec Me.Filter par exemple) tout en pouvant continuer à modifier mes enregistrements directement ?

    Merci d'avance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    Private Sub RefreshQuery()
    Dim Sel As String
    Dim Wh As String
    Dim GrpBy As String
    Dim Hav As String
    Dim SQL As String
    Dim NewQuery As QueryDef
    CurrentDb.QueryDefs.Delete "R_Choix"
    Sel = "SELECT T_Films.ID_Film FROM R_Acteurs INNER JOIN T_Films ON R_Acteurs.ID_Film = T_Films.ID_Film "
    Wh = "WHERE (T_Films.ID_Film <>0)"
    GrpBy = " GROUP BY T_Films.ID_Film"
    Hav = " Having ((T_Films.ID_Film <>0) "
    If Me.Chk_Titre Then
        GrpBy = GrpBy & ", Titre"
        Hav = Hav & " And (Titre like '*" & Me.Txt_Titre & "*')"
    End If
    If Me.Chk_Genre Then
        GrpBy = GrpBy & ", IDGenre1, IDGenre2, IDGenre3"
        Hav = Hav & " And  (IDGenre1 = " & Me.Md_Genre.Value & " OR IDGenre2 = " & Me.Md_Genre & " OR IDGenre3 = " & Me.Md_Genre & ")"
    End If
    If Me.Chk_Realisateur Then
        Wh = Wh & " And (Realisateur like '*" & Me.Txt_Realisateur & "*')"
    End If
    If Me.Chk_Acteur Then
        Wh = Wh & " And (Acteur like '*" & Me.Txt_Acteur & "*')"
    End If
    If Me.Chk_Annee Then
        Wh = Wh & " And (Annee = '" & Me.Lst_Annee & "')"
    End If
    If Me.Chk_Age Then
        GrpBy = GrpBy & ", IDAgeLegal"
        Hav = Hav & " And (IDAgeLegal = " & Me.Md_Age & ")"
    End If
    If Me.Chk_Pays Then
        GrpBy = GrpBy & ", IDPays_film"
        Hav = Hav & " And (IDPays_film = " & Me.Md_Pays & ")"
    End If
    SQL = Sel & Wh & GrpBy & Hav & ");"
    Set NewQuery = CurrentDb.CreateQueryDef("R_Choix", SQL)
    Me.Lbl_Stats.Caption = DCount("*", "R_Choix") & " films sur " & DCount("*", "T_Films") & " correspondent à votre recherche."
    Me.F_Films2.Form.RecordSource = "SELECT T_Films.* FROM T_Films INNER JOIN R_Choix ON T_Films.ID_Film = R_Choix.ID_Film ORDER BY T_Films.Titre;"
    Me.F_Films2.Form.Requery
    Me.lbl_Stats2.Caption = Me.F_Films2.Form.CurrentRecord & " / " & DCount("*", "R_Choix")
    Me.Md_Recherche.RowSource = "SELECT T_Films.ID_Film, Titre FROM T_Films INNER JOIN R_Choix ON T_Films.ID_Film = R_Choix.ID_Film ORDER BY Titre;"
    Verif
    End Sub
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

  2. #2
    Membre habitué Avatar de cluster26
    Profil pro
    Inscrit en
    Février 2010
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 263
    Points : 182
    Points
    182
    Par défaut
    Bonjour,

    Citation Envoyé par paidge Voir le message
    . Cette recherche me crée une requête que j'ai nommée R_Choix qui me fait la liste des ID des films répondant à la recherche.
    Si j'ai bien compris, nous ne sommes plus dans un formulaire unique, mais dans un formulaire continu ?

    Tu peux me confirmer ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 103
    Points : 91
    Points
    91
    Par défaut
    Bonjour,

    Je ne suis pas spécialiste, toutefois, si je devais filtrer un formulaire, plutôt que de changer la source du formulaire, instinctivement, parce que c'est que je sais faire, je filtrerai mes données.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    'Filtre et trie le formulaire
    DIM MonFiltre as String
     
    MonFiltre = "[Champs1]='Mon texte'"
     
        With Me
           .Filter = MonFiltre
           .FilterOn = True
        End With
    ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Filtre et trie le formulaire
    DIM MonFiltre as String
     
    MonFiltre = "[Champs1]='Mon texte'"
     
    DoCmd.ApplyFilter , MonFiltre

    Lisez ce POST sur le Forum, peut être contient il une réponse.

  4. #4
    Membre habitué Avatar de cluster26
    Profil pro
    Inscrit en
    Février 2010
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 263
    Points : 182
    Points
    182
    Par défaut
    Bonjour,

    Ce n'était pas ma question !..

    La notion de filtre, je l'ai très bien assimilée !...Par contre, là ou j'ai un problème de compréhension c'est au niveau de la modification des enregistrements directement comme tu l'évoques ci-dessous :

    Citation Envoyé par paidge Voir le message
    tout en pouvant continuer à modifier mes enregistrements directement ?

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 801
    Points : 1 107
    Points
    1 107
    Par défaut
    Bonjour et merci à vous deux de vous pencher sur mon problème,
    ci-joint un screenshot de mon formulaire.

    Comme je l'ai dit, à l'ouverture, il est basé sur la table T_Films. On peut donc faire défiler les films un par un et modifier les champs (titre, date, durée, réalisateur, etc.)
    Comme un film peut avoir plusieurs acteurs et un acteur peut jouer dans plusieurs films, j'ai une table T_Roles entre T_Films et T_Acteurs. Cette table contient donc plusieurs fois le même film (un enregistrement pour chaque acteur jouant dans ce film). J'ai créé une requête objet (R_Acteurs) sur cette table qui concatène le nom et le prénom des acteurs afin de pouvoir effectuer une recherche sur le nom des acteurs avec la clause LIKE.

    Comme indiqué dans le code cité sur le premier post, en cochant les cases du formulaire, cela crée une autre requête objet (R_Choix) basée sur R_Acteurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set NewQuery = CurrentDb.CreateQueryDef("R_Choix", SQL)
    En gros, R_choix sélectionne et regroupe les enregistrements de R_Acteurs répondant aux critères de recherche et me retourne uniquement les IDs des films sélectionnés.

    Je voudrais que mon formulaire ne m'affiche plus que ces enregistrements tout en pouvant continuer à modifier les champs.

    Or, quand je change le recordsource du formulaire (au lieu d'être basé sur T_Films uniquement, il est basé sur T_Films et R_Choix), ça marche très bien mais je ne peux plus modifier les champs.

    Voilà mon problème énoncé autrement qui, je l'espère, vous permettra de mieux comprendre.
    Images attachées Images attachées  
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

  6. #6
    Membre habitué Avatar de cluster26
    Profil pro
    Inscrit en
    Février 2010
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 263
    Points : 182
    Points
    182
    Par défaut
    Bonjour,

    A priori, (je dis bien à priori car je ne suis pas un très très grand spécialiste), le fait "d'attaquer" la requête avec une fonction de regroupement, te bloque obligatoirement au niveau de la modification !..

    Il faudrait peut-être chercher un peu dans ce sens.

    Toutefois, je ne confirme pas que cela soit une piste véritablement fiable !.

    Bon courage

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 801
    Points : 1 107
    Points
    1 107
    Par défaut
    Citation Envoyé par cluster26 Voir le message
    A priori, ..., le fait "d'attaquer" la requête avec une fonction de regroupement, te bloque obligatoirement au niveau de la modification !..
    Oui c'est ce que j'ai cru comprendre à force de chercher. Du coup, mon "beau" formulaire joint est basé sur T_Films et R_Choix (donc aucune modification possible). Et lorsqu'on clique sur le bouton d'édition, ça m'ouvre une copie du formulaire (au niveau de l'enregistrement courant), basé sur T_Films. Là je peux faire les modifs et valider....Mais j'aurais voulu éviter cela.

    J'ai peut-être une idée (avec la méthode ADO ou ADO, un truc comme ça :p) :
    Ouvrir la requête R_Choix, lire les enregistrements 1 à 1 (dans une boucle) et appliquer un Filtre de ce genre-là:
    "IDfilm = " & ID1 & " OR " & ID2 & " OR " & ID3 .....

    Quelqu'un peut-il me dire si il s'agit d'une bonne idée ?
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

  8. #8
    Membre habitué Avatar de cluster26
    Profil pro
    Inscrit en
    Février 2010
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 263
    Points : 182
    Points
    182
    Par défaut
    Peut-être une piste en créant et en adaptant une requête de ce type :

    SELECT * FROM tfilms WHERE id = (SELECT FROM t_acteurs where champ1="jdsfkqlm")

  9. #9
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 801
    Points : 1 107
    Points
    1 107
    Par défaut
    J'ai pas encore eu le temps d'essayer mon idée mais j'ai essayé la tienne.
    ça marche quand la requête me donne un seul enregistrement, sinon j'ai ce message :
    Cette sous-requête peut retourner au plus un enregistrement. (Erreur 3354)
    Une sous-requête de ce type ne peut renvoyer plus d'un seul enregistrement. Corrigez l'instruction SELECT de la sous-requête pour demander un seul enregistrement.
    EDIT
    ça y est j'ai testé mon idée ça a l'air de fonctionner très bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Dim ListFilms As Recordset
    Set ListFilms = CurrentDb.OpenRecordset("R_Choix")
    If ListFilms.EOF = True Then
         MsgBox ("Aucun film ne correspond à la recherche")
    Else
         ListFilms.MoveFirst
         Filtre = "ID_Film = 0"
         While Not ListFilms.EOF
           Filtre = Filtre & " OR ID_Film=" & ListFilms("ID_Film")
           ListFilms.MoveNext
         Wend
         ListFilms.Close
         Set ListFilms = Nothing
    End If
    Me.F_Films2.Form.Filter = Filtre
    Me.F_Films2.Form.FilterOn = True
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

  10. #10
    Membre habitué Avatar de cluster26
    Profil pro
    Inscrit en
    Février 2010
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 263
    Points : 182
    Points
    182
    Par défaut
    Satisfait pour toi !..

    Il est vrai que la solution ne pouvait se trouver sur une base de requête regroupement.

    Bon courage pour la suite.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Ouvrir un formulaire à partir d'une requête
    Par Aromat22 dans le forum Modélisation
    Réponses: 3
    Dernier message: 18/04/2012, 17h54
  2. Mise à jour formulaire à partir d'une requête
    Par Pwouaro dans le forum VBA Access
    Réponses: 9
    Dernier message: 15/02/2008, 13h53
  3. Ouvrir un formulaire à partir d'une requête
    Par curt dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 19/11/2007, 13h15
  4. ouverture de formulaire à partir d'une requéte
    Par gaetanef dans le forum Access
    Réponses: 5
    Dernier message: 21/11/2005, 15h51
  5. Réponses: 4
    Dernier message: 16/09/2005, 14h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo