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

Access Discussion :

Requête "Contient" exclusif


Sujet :

Access

  1. #1
    Membre à l'essai
    Homme Profil pro
    Commerçant
    Inscrit en
    Mai 2014
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Commerçant

    Informations forums :
    Inscription : Mai 2014
    Messages : 60
    Points : 21
    Points
    21
    Par défaut Requête "Contient" exclusif
    Bonjour,
    Merci d’avance à qui s’intéressera à ma question. Je travaille avec Access 2013.

    La base contient :
    • une table T_Produits avec des produits de différents types (Ex : Boite de tomate ; bouteille de vin ; Filet de pomme ; Lot bouteille de vin et filet de pomme…)
    • Une table T_Types avec les différents types de produits existant (Boite, bouteille, filet…) et une case à cocher:

    Nom : T_Types.JPG
Affichages : 413
Taille : 22,0 Ko

    Une requête R_Select1 sélectionne les types dont la case est cochée:

    Nom : R_Select1.JPG
Affichages : 422
Taille : 38,2 Ko

    Une requête R_Select2 sélectionne les produits répondant aux critères de R_Select1. Si « Bouteille » est coché, apparaîtront les enregistrements « Bouteille de vin » et « Lot bouteille de vin et filet de pomme ».

    Nom : R_Select2.JPG
Affichages : 411
Taille : 50,2 Ko

    Si plusieurs types sont cochés, la requête R_Select2 sélectionnera tous les produits dont le nom contient l’un ou l’autre des types cochés (ci-dessous avec coche de "Bouteille" et "Boite"):

    Nom : Résultat R_Select2.JPG
Affichages : 417
Taille : 32,7 Ko

    Je voudrais une requête qui sélectionne uniquement les produits qui contiennent tous les types cochés. Si « Bouteille » et « Boite » sont cochés, je ne veux retenir que « Lot bouteille de vin et boite de tomate ». Pas « Bouteille de vin ».

    Quelqu’un peut-il m’apprendre à faire ça ?
    Bien à vous.

    Pascal

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 846
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 846
    Points : 7 983
    Points
    7 983
    Par défaut
    Bonjour,

    N'étant pas un grand spécialiste du SQL, je ne peux te dire si c'est possible avec du SQL pure.
    En VBA et les outils d'Access, c'est possible en parcourant les enregistrements de la table produit et en comparant avec les types sélectionnés dans une zone de liste du formulaire.
    Les résultats sont enregistrés dans une table T_Produits_Filtre et cette table devient la source du sous-formulaire résultat lors de l'application du filtre.

    En pièce jointe, la base exemple.

    Cordialement,
    Fichiers attachés Fichiers attachés

  3. #3
    Membre à l'essai
    Homme Profil pro
    Commerçant
    Inscrit en
    Mai 2014
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Commerçant

    Informations forums :
    Inscription : Mai 2014
    Messages : 60
    Points : 21
    Points
    21
    Par défaut
    Bonjour Mdfmre,

    et merci pour ta proposition.

    Je n'obtiens pas le résultat escompté avec la base que tu as faite.

    Il n'y a qu'un seul produit qui contient les mots "Bouteille" et "Boîte". C'est donc le seul qui devrait s'afficher si je sélectionne ces deux critères dans le contrôle "Type" du formulaire F_Filtre. Pourtant, si je clique successivement sur "Boîte" puis sur "Bouteille", Bouteille de sirop et bouteille de vin restent affichés.

    Afin que tu aies bien tout le problème sous les yeux, je voudrais te joindre un extrait de la base, mais la fenêtre des pièces jointes la refuse. Comment as-tu fait pour envoyer la tienne??

    Merci.

    Pascal

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 846
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 846
    Points : 7 983
    Points
    7 983
    Par défaut
    Bonjour,

    Effectivement il y eut une erreur de compréhension de ma part, mais tu connais ce que tu veux.
    Modifie le code par celui-ci :
    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
    Private Sub btnfiltrer_Click()
    Dim varLst As Variant
    Dim rstProduit As DAO.Recordset, rstResult As DAO.Recordset
    Dim ChkTrouve As Boolean 'Flag de recherche positif de l'élément dans le champ produit
    Dim strsql As String, Sortir_Boucle As String
    'Supprimer les données de la table filtre
    strsql = "DELETE * FROM T_Produits_Filtre"
    CurrentDb.Execute strsql, dbFailOnError
     
    ChkTrouve = False
    Set rstProduit = CurrentDb.OpenRecordset("T_Produits", dbOpenSnapshot)
    Set rstResult = CurrentDb.OpenRecordset("T_Produits_Filtre", dbOpenDynaset)
     
    With rstProduit
    'Parcourir les enregistrements de la table produit
        While Not .EOF
            'Parcourir les éléments sélectionnés de la zone de liste
            For Each varLst In Me.zdlType.ItemsSelected
                'définir le flag à Oui si l'élément est trouvé dans la liste
                ChkTrouve = IIf(InStr(1, rstProduit![Produit], Me.zdlType.Column(0, varLst)) > 0, True, False)
                'Si un élément sélectionné n'est pas trouvé, sortir
                If Not ChkTrouve Then GoTo Sortir_Boucle
            Next
            'Si le Flag est Oui, ajouter le produit dans la table résultat
            If ChkTrouve Then
                rstResult.AddNew
                rstResult![Produit] = rstProduit![Produit]
                rstResult.Update
            End If
    Sortir_Boucle:
        .MoveNext
        Wend
    End With
    'Définir la source du sous-formulaire.
    Me.SF_Produits.Form.RecordSource = "T_Produits_Filtre"
    Me.SF_Produits.Requery
     
    rstResult.Close: Set rstResult = Nothing
    rstProduit.Close: Set rstProduit = Nothing
    End Sub
    Cordialement,

  5. #5
    Membre à l'essai
    Homme Profil pro
    Commerçant
    Inscrit en
    Mai 2014
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Commerçant

    Informations forums :
    Inscription : Mai 2014
    Messages : 60
    Points : 21
    Points
    21
    Par défaut
    Ton nouveau code fonctionne parfaitement Merci.

    Je dois certainement l'adapter pour qu'il s'intègre dans la base. j'espère y arriver seul, ou bien je te solliciterai à nouveau si tu veux bien.

    Je reviens sur ma question accessoire: comment arrives-tu à joindre une base de données à ton message? Lorsque j'ai essayé la fenêtre l'a refoulée au motif "Fichier non valide" (c'est un accdb)

    Cordialement,

    Pascal

  6. #6
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 846
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 846
    Points : 7 983
    Points
    7 983
    Par défaut
    Bonsoir,

    C'est bien si cela te convient. Normalement j'ai commenté le code donc ce la ne devrait pas être très difficile.

    Pour joindre un fichier dans un message sur le site, il faut le zipper. Les fichiers sous format mdb ou accdb pouvant contenir des codes malveillants.
    Vérifies de toutes les façons la liste des fichiers acceptés

    Cordialement,

  7. #7
    Membre à l'essai
    Homme Profil pro
    Commerçant
    Inscrit en
    Mai 2014
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Commerçant

    Informations forums :
    Inscription : Mai 2014
    Messages : 60
    Points : 21
    Points
    21
    Par défaut
    Bonjour Mdfmre,

    la modification du code pour s'intégrer dans mon modèle s'avère très ardu pour moi. Je pars de zéro en terme de codification.

    Une de mes contraintes et de faire apparaître le résultat du filtre en tant que liste déroulante dans une table affichée en sous-formulaire.
    Je dois pouvoir effectuer plusieurs enregistrements dans cette table, en effectuant au besoin un nouveau filtre pour chaque nouvel enregistrement.
    Quand j'ai fini, les enregistrements seront ajoutés dans une table-mère, et la table de saisie sera remise à zéro.

    Je joins le modèle:
    F_Filtre_Et_Exclusif_2.zip

    Pourrais-tu s'il te plait adapter ton code à cette méthode?

    Je suis désolé, j'aurais dû commencer par t'envoyer la bdd mais j'ai cru que ce n'était pas possible.

    Cordialement.

  8. #8
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 846
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 846
    Points : 7 983
    Points
    7 983
    Par défaut
    Bonsoir,

    En pièce jointe la base de données modifiée selon ton modèle.

    Cordialement,
    Fichiers attachés Fichiers attachés

  9. #9
    Membre à l'essai
    Homme Profil pro
    Commerçant
    Inscrit en
    Mai 2014
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Commerçant

    Informations forums :
    Inscription : Mai 2014
    Messages : 60
    Points : 21
    Points
    21
    Par défaut
    Bonsoir!

    c'est EXACTEMENT ça! La base n°3 répond complètement à ma demande. Epatant. Un grand merci, c'est une belle avancée dans mon projet.
    Je note que tu n'as pas besoin de requête pour arriver à ce résultat (!?) et que tu as placé le code sur l'évènement After Updte de la coche plutôt que sur le bouton de commande.

    Dans ma base, J'ai collé les lignes de code comme tu l'as fait. Pour l'instant, j'obtiens ça:
    Nom : Erreur.JPG
Affichages : 400
Taille : 39,0 Ko

    Je crois comprendre qu'il faut changer le nom "FiltreAfterUpdate". Une question de syntaxe peut-être, ou bien le nom est déjà attribué. Je vais chercher ce que je peux modifier dans ce sens. Je te dirai ce que je trouve comme solution. Je pense que je ne suis plus très loin maintenant.

    Très cordialement.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Commerçant
    Inscrit en
    Mai 2014
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Commerçant

    Informations forums :
    Inscription : Mai 2014
    Messages : 60
    Points : 21
    Points
    21
    Par défaut
    Bonjour,

    Ton code fonctionne maintenant parfaitement dans la base de données « grandeur nature ». C'est une fonction précieuse dans une longue liste de produits à filtrer.

    Je ne connais pas exactement la raison du message d’erreur qui apparaissait initialement.

    En revanche, Access a demandé la modification de certains détails de syntaxe qui étaient acceptés dans ton modèle mais ne l’étaient pas dans ma base(!), exemple :
    Forms!F_Ventes.SF_Detail_Vente.Form.Désignation.Requery

    A dû être transformé en :
    Forms![F_Ventes]![Fille12].Form!Désignation.Requery

    Une différence entre les versions d’Access ?

    Ceci étant réglé avec succès, puis-je demander une nouvelle fonctionnalité ?

    Je voudrais :
    • Rajouter le champ « Prix » dans la table T_Produits
    • que la liste déroulante affichée dans SF_Détail_Vente après Filtre comporte également ce champ « Prix » à côté du champ »Produit »

    Je te joins l’exemple ci-dessous pour plus de clarté (c’est l’ancienne version du filtre):

    F_Filtre_Et_Exclusif_4.zip

    Merci d’avance.
    Cordialement

  11. #11
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 846
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 846
    Points : 7 983
    Points
    7 983
    Par défaut
    Bonjour,

    1- Pour le message d'erreur initial, c'est un message-bateau que donne Access quand il y a des erreurs dans un code VBA. Est-ce que ça revient toujours ?

    2- Pour :
    En revanche, Access a demandé la modification de certains détails de syntaxe qui étaient acceptés dans ton modèle mais ne l’étaient pas dans ma base(!), exemple :
    Forms!F_Ventes.SF_Detail_Vente.Form.Désignation.Requery

    A dû être transformé en :
    Forms![F_Ventes]![Fille12].Form!Désignation.Requery
    En fait, le nom de mon sous-formulaire est SF_Detail_Vente (Propriété Nom dans l'onglet Autre quand tu sélectionnes le sous-formulaire), or toi tu l'as laissé au nom par défaut donné par Access lors de sa création. Je te conseille de donner des noms signifiants pour les objets que tu utilises pour que cela soit facile à comprendre après. Surtout que tu codes. Et respecter une certaine logique dans tes nominations (sans espaces, ne pas utiliser les caractères spéciaux, ...)

    3- Sur le fond, le nouveau code n'est pas différent du précédent sauf
    . qu'en lieu et place d'une vérification des noms de produits dans la table T_Produits par rapport à la zone de liste, on parcourt les données sélectionnées dans un sous-formulaire.
    . qu'en lieu et place d'intégrer le résultat filtré T_Produit_Filtre dans un sous-formulaire, la zone de liste a comme source directement la table résultante.

    4- Donc, pour ta modification, il faut
    . rajouter le champ Prix dans la table T_Produits.
    . Faire la même chose pour la table T_Produits_Filtre.
    . Modifier les propriétés de la zone de liste :
    Nbre colonnes : 2
    Largeurs colonnes : 4 cm ; 1 cm (à toi d’ajuster).
    . dans la partie du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            'Si le Flag est Oui, ajouter le produit dans la table résultat
            If ChkTrouve Then
                rstResult.AddNew
                rstResult![Produit] = rstProduit![Produit]
                rstResult.Update
            End If
    ajouter l'ajout de la valeur du prix :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            'Si le Flag est Oui, ajouter le produit dans la table résultat
            If ChkTrouve Then
                rstResult.AddNew
                rstResult![Produit] = rstProduit![Produit]
                rstResult![Prix] = rstProduit![Prix]
                rstResult.Update
            End If
    et ça devrait aller.

    Cordialement,

  12. #12
    Membre à l'essai
    Homme Profil pro
    Commerçant
    Inscrit en
    Mai 2014
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Commerçant

    Informations forums :
    Inscription : Mai 2014
    Messages : 60
    Points : 21
    Points
    21
    Par défaut
    Merci pour ces explications et ce nouveau code.

    1. Le message d'erreur initial ne revient plus. Aucun bug d'aucune sorte maintenant. mais je ne sais pas ce que j'ai modifié pour qu'il disparaisse.

    2. Syntaxe: OK, compris. Effectivement je me rends bien compte à présent que certains noms ou caractères sont maladroits. J'hésite à renommer pour faire propre, j'ai peur de provoquer des bugs en cascade non contrôlée , il y a beaucoup de tables, requêtes et formulaires, dont beaucoup sont mal baptisés.

    3. OK. je vais alors supprimer la requête R_prod_Comp1

    4. Waoo! J'ai du boulot pour comprendre et intégrer ces nouveaux codes. Je m'y mets. (pour corser le tout, certaines tables n'ont pas les mêmes noms dans nos bdd respectives, ou bien les noms de champs n'ont pas la même orthographe : avec ou sans "s" final)

    Merci.

  13. #13
    Membre à l'essai
    Homme Profil pro
    Commerçant
    Inscrit en
    Mai 2014
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Commerçant

    Informations forums :
    Inscription : Mai 2014
    Messages : 60
    Points : 21
    Points
    21
    Par défaut
    Je reviens sur le point 4.

    j'avais mal lu. Le code est plus court que ce que j'avais cru voir.

    La modification est faite avec succès. Cela fonctionne parfaitement. Toutes mes demandes sont 100% résolues.

    merci infiniment, et bonne continuation.

    Bien cordialement.

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

Discussions similaires

  1. [MySQL] Insérer résultat d'une requête : problème de quote
    Par maxime17s dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 05/12/2008, 03h42

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