1. #1
    Membre du Club
    Homme Profil pro
    Administrateur (improvisé) de base de données
    Inscrit en
    décembre 2014
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur (improvisé) de base de données
    Secteur : Arts - Culture

    Informations forums :
    Inscription : décembre 2014
    Messages : 77
    Points : 63
    Points
    63

    Par défaut Recherche de plusieurs valeurs dans un seul champ d'une table de jonction

    Bonjour à tous.

    Au départ, ça me semblait hyper simple. Mais j'avais pas trop réfléchi...

    Alors voilà : j'ai une bdd ultra simple : les dessins animés de la Warner Bros.
    - une table T_film avec deux champs : "ID_film" et "titre" (800 enregistrements)
    - une table T_personnage avec deux champs : "ID_personnage" et "nom" (30 enregistrements)
    - une table de jonction TJ_personnage_dans_film avec trois champs : "ID_personnage_dans_film", "film_ID" et "personnage_ID" (1300 enregistrements)

    Vous l'aurez compris, un film peut avoir 0, 1 ou plusieurs personnages (ex un dessin animé avec Daffy Duck seul, un autre avec Daffy et Bugs Bunny, ou encore un film sans personnage connu) et, bien sûr, les personnages peuvent apparaître dans plusieurs films.

    Je veux faire un formulaire de recherche par personnages qui se présente ainsi : les personnages sont présentés avec une case à cocher chacun. Quand on coche un personnage, il affiche dans un sous formulaire tous les films où apparaît ce personnage (ça c'est facile, je sais faire). Mais, si on coche deux personnages, il affiche les films où apparaissent les deux personnages ensemble (ex, Daffy + Bugs Bunny), si on en coche un troisième, il restreint encore en affichant les films où joue le trio (ex : Daffy + Bugs + Elmer), etc. Si on ne coche rien, il affiche les films où n'apparaît aucun personnage connu.
    J'ai imaginé qu'il fallait passer par la table de jonction et faire une sélection du style "SELECT * FROM TJ_personnage_dans_film WHERE personnage_ID = x Or y Or z" (exemple avec trois personnages), puis chercher dans les résultats les films qui apparaissent 3 fois, en faire une nouvelle requête de type SELECT DISTINCT pour avoir la liste des films... mais ça ressemble un peu à une usine à gaz et en plus je me sens incapable de mettre ça en place... en bref je me demande s'il n'y aurait pas plus simple.

    Quelqu'un aurait-il une solution ?

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Developpeur VBA migrant tranquillement vers C# et VB.Net =]
    Inscrit en
    juillet 2007
    Messages
    12 139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Developpeur VBA migrant tranquillement vers C# et VB.Net =]
    Secteur : Finance

    Informations forums :
    Inscription : juillet 2007
    Messages : 12 139
    Points : 26 838
    Points
    26 838

    Par défaut

    Salut,

    il te suffit de rediger le contenu du critere a la volee, avec IN

    ce code reste a adapter exactement a ton cas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim strSQL  As String
    strSQL = "SELECT DISTINCT FILM FROM (TaTableFilm INNER JOIN TaTablePersonnageDansFilm) WHERE IDPersonnage IN ("
    For i=1 TO 800 'selon le nombre de checkbox perso
    if Me.Controls("TaCheckBox" & i).Value Then
    strSQL = strsql & i ","
    Next i
    strSQL = Left(strSQL,Len(strSQL)-1) & ")"
    TonSousFormulaire.RowSource= strSQL
    Pas de question technique par MP, je ne réponds pas

    Apprendre à programmer avec Access 2016

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre du Club
    Homme Profil pro
    Administrateur (improvisé) de base de données
    Inscrit en
    décembre 2014
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur (improvisé) de base de données
    Secteur : Arts - Culture

    Informations forums :
    Inscription : décembre 2014
    Messages : 77
    Points : 63
    Points
    63

    Par défaut

    Ah oui, merci beaucoup, ça s'approche de près de ce que je veux. Si j'ai bien saisi, ce paramètre IN équivaut peu ou prou à OR, non ?

    Mais...

    lorsque je mets deux personnages, il me renvoie les films avec les deux personnages, certes, mais aussi les film avec seulement un des deux personnages. Or je voudrais qu'il ne me renvoie QUE les films où ces deux personnages sont ensemble (avec éventuellement d'autres larrons, ça je m'en fiche).

    Est-ce possible ?

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Developpeur VBA migrant tranquillement vers C# et VB.Net =]
    Inscrit en
    juillet 2007
    Messages
    12 139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Developpeur VBA migrant tranquillement vers C# et VB.Net =]
    Secteur : Finance

    Informations forums :
    Inscription : juillet 2007
    Messages : 12 139
    Points : 26 838
    Points
    26 838

    Par défaut

    Ce n'est pas ce que j'avais compris, d'ou ma requete.

    Si tu veux avoir le bon nombre de films, il te faut passer en plus de ce que je t'ai donne par un


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim strSQL  As String
    Dim compteur as Integer
    strSQL = "SELECT DISTINCT FILM FROM (TaTableFilm INNER JOIN TaTablePersonnageDansFilm) WHERE IDPersonnage IN ("
    For i=1 TO 800 'selon le nombre de checkbox perso
    if Me.Controls("TaCheckBox" & i).Value Then
    compteur = compteur +1
    strSQL = strSQL & i ","
    Next i
    strSQL = Left(strSQL,Len(strSQL)-1) & ")"
    strSQL = strSQL & " GROUP BY Film"
    strSQL & strSQL & " HAVING Count(Personnage)=" & compteur
    TonSousFormulaire.RowSource= strSQL
    Pas de question technique par MP, je ne réponds pas

    Apprendre à programmer avec Access 2016

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Membre du Club
    Homme Profil pro
    Administrateur (improvisé) de base de données
    Inscrit en
    décembre 2014
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur (improvisé) de base de données
    Secteur : Arts - Culture

    Informations forums :
    Inscription : décembre 2014
    Messages : 77
    Points : 63
    Points
    63

    Par défaut

    Génial ! C'est ça !
    Je suis décidément loin de maîtriser toutes les possibilités. Je ne connaissais pas les GROUP BY et HAVING...

    Juste un petit plus, maintenant : je voudrais que, si aucun personnage n'est coché, il n'affiche que les films qui n'ont pas de personnage connu... donc, j'imagine, les film qui n'apparaissent pas dans la table TJ_personnage_dans_film.

    Un grand merci.

  6. #6
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Developpeur VBA migrant tranquillement vers C# et VB.Net =]
    Inscrit en
    juillet 2007
    Messages
    12 139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Developpeur VBA migrant tranquillement vers C# et VB.Net =]
    Secteur : Finance

    Informations forums :
    Inscription : juillet 2007
    Messages : 12 139
    Points : 26 838
    Points
    26 838

    Par défaut

    Oui, mais a ce moment la il te faut faire une jointure externe + is null = requete de non correspondance.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM FILM LEFT JOIN PersonnageDansFilm ON FILM.IDFilm = PersonnageDansFilm.IDFilm
    WHERE PersonnageDansFilm.IDFilm IS NULL
    Pas de question technique par MP, je ne réponds pas

    Apprendre à programmer avec Access 2016

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/06/2017, 13h55
  2. [AC-2007] Création d'etat avec plusieurs valeurs dans un seul champ
    Par k.p-j dans le forum IHM
    Réponses: 3
    Dernier message: 02/05/2012, 16h07
  3. Mettre plusieurs valeurs dans un seul champ hidden asp
    Par gabdeschenes dans le forum ASP.NET
    Réponses: 3
    Dernier message: 28/10/2009, 18h52
  4. Mettre plusieurs fichiers dans un seul fichier ou une table…
    Par wahab2052 dans le forum Développement de jobs
    Réponses: 7
    Dernier message: 21/09/2009, 20h41
  5. sélection multiple de valeurs dans un seul champ
    Par antoine0207 dans le forum Access
    Réponses: 4
    Dernier message: 04/07/2006, 17h01

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