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

Requêtes et SQL. Discussion :

Problème de création de requêtes [AC-2007]


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Homme Profil pro
    Dessinateur industriel
    Inscrit en
    Décembre 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dessinateur industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2010
    Messages : 61
    Points : 46
    Points
    46
    Par défaut Problème de création de requêtes
    Bonjour,

    Je possède une table [Famille] composée de 4 champs:
    une clé primaire [ID], [Nom], [code], [IDparent]

    Je n'arrive pas à gérer une requête qui puisse remplir une combobox d'un formulaire en filtrant un champs d'une table:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT Famille.Nom FROM Famille WHERE (((Famille.IDparent)="Manifold") ORDER BY Famille.Nom;
    Je souhaiterais qu'elle filtre sur le champs [IDparent] et qu'elle m'affiche le [Nom] correspondant. Or, une fois créée, la requête filtre uniquement sur la clé primaire. Par exemple, si je cherche la valeur "Manifold" il ne me trouve rien. Par contre si je cherche la valeur "1" (correspondant à la clé primaire d'une ligne ou j'ai IDparent qui contient "Manifold" ça fonctionne. Mais ce n'est pas ce que je veux. Je n'arrive pas à comprendre pourquoi. Je viens de perdre ma soirée à buter sur ce problème.

    Pourtant j'ai déjà réussi à le faire sur une autre combobox et ça fonctionne parfaitement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Famille.Nom FROM Famille WHERE (((Famille.Code) Like "E-*")) ORDER BY Famille.Nom;
    Ici je voulais remplir ma combobox avec le contenu du champs [Nom] lorsque [Code] comme par "E-". Ce que j'obtiens sans problème.

    Je suppose qu'il y a des bases que je ne connais pas qui sont la source de mon problème. Mais j'ai eu beau chercher et tester des tas de solutions diverses, mais toujours en vain.

    Merci d'avance

  2. #2
    Membre régulier
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Juillet 2006
    Messages : 133
    Points : 90
    Points
    90
    Par défaut
    Bonjour,

    Ta requete semble bonne, simplement qu'il manque une parenthese, ou d'un autre point de vue, des parentheses en trop:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT DISTINCT Famille.Nom FROM Famille WHERE Famille.IDparent="Manifold" ORDER BY Famille.Nom;

  3. #3
    Membre du Club
    Homme Profil pro
    Dessinateur industriel
    Inscrit en
    Décembre 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dessinateur industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2010
    Messages : 61
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    Effectivement, à force de faire des essais, je m'étais mélanger dans les parenthèses. Merci

    J'ai donc corrigé la requête et j'obtiens le message d'erreur suivant:
    Type de données incompatible dans l'expression du critère.

    Pour essayer de comprendre, j'ai modifié ma requête en transformant l'égalité en Like:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT Famille.Nom FROM Famille WHERE Famille.IDparent Like "Manifold*" ORDER BY Famille.Nom;
    Il me renvoie le même message d'erreur que ci-dessus. Donc je teste en cherchant sur un entier (le même formatage que la clé primaire)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT Famille.Nom FROM Famille WHERE Famille.IDparent="1" ORDER BY Famille.Nom;
    J'obtiens encore une fois la même erreur. Et dans ce cas je ne comprends vraiment pas pourquoi. Car si je remplate le = par le Like:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT Famille.Nom FROM Famille WHERE Famille.IDparent Like "1" ORDER BY Famille.Nom;
    Il m'affiche bien le résultat que je souhaite. Mais uniquement en lui renseignant la valeur de la clé primaire. Or j'ai besoin de le rechercher par [IDparent]

    Ca me parait basique comme problème, mais je ne trouve aucune réponse.

  4. #4
    Membre régulier
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Juillet 2006
    Messages : 133
    Points : 90
    Points
    90
    Par défaut
    C'est peut etre moi qui comprend mal, mais ton champ IDparent contient un chiffre ou un nom ?
    D'apres ce que j'ai compris IDparent contient un chiffre et dans il y a une autre table qui associe cet IDparent a un nom :

    parent
    ID | nom
    1 | Manifold

    Si c'est bien ca la requete serait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT Famille.Nom FROM Famille WHERE Famille.IDparent=1 ORDER BY Famille.Nom;
    Et si tu souhaite plutot rentré le nom il faut passer par un join
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT Famille.Nom FROM Famille RIGHT JOIN Parent WHERE Famille.IDparent = Parent.ID WHERE Parent.nom="Manifold" ORDER BY Famille.Nom
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT Famille.Nom FROM Famille RIGHT JOIN Parent WHERE Famille.IDparent = Parent.ID WHERE Parent.nom LIKE "Manifold*" ORDER BY Famille.Nom

  5. #5
    Membre du Club
    Homme Profil pro
    Dessinateur industriel
    Inscrit en
    Décembre 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dessinateur industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2010
    Messages : 61
    Points : 46
    Points
    46
    Par défaut
    Excuse moi, à force de mettre trop d'information je crois qu'on s'y perds plus qu'autre chose.
    Mon champs IDparent contient bien un nom (ex: manifold)

    Exemple d'une ligne:

    [ID] = 1
    [Nom] = Instrumentation
    [Code] = 4
    [IDparent] = Manifold

    Par contre, pour te répondre, j'ai effectivement une liaison de [Famille].[IDparent] vers [Famille_1].[ID]. Mais pour être franc cette partie n'a pas été faite par moi, et je ne comprends pas son but. J'avais essayé de supprimer cette liaison, mais cela n'avait pas corrigé mon problème. Donc je l'ai remise. Est ce que mes soucis peuvent provenir de ça?

    Le champs [Famille].[ID] est lui aussi relié à d'autres tables mais je crois que ça n'a pas d'importance ici.

  6. #6
    Membre régulier
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Juillet 2006
    Messages : 133
    Points : 90
    Points
    90
    Par défaut
    Il n'y a jamais "trop" d'informations !

    Non je ne pense pas que cette liaison pose probleme, de plus elle n'apparait pas dans notre requete donc pas de soucis.

    Donc si le champ IDparent contient bien du texte la bonne requete serait donc ma premiere, essai de changer les " par des ' comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT Famille.Nom FROM Famille WHERE Famille.IDparent='Manifold' ORDER BY Famille.Nom;

  7. #7
    Membre du Club
    Homme Profil pro
    Dessinateur industriel
    Inscrit en
    Décembre 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dessinateur industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2010
    Messages : 61
    Points : 46
    Points
    46
    Par défaut
    Je viens d'essayer, et j'ai toujours la même erreur.
    Cependant, ce qui m'étonne, c'est qu'après le message d'erreur, ma combobox contient une entrée qui est vide.

    Donc je me pose la question de savoir si le fait que je puisse, dans certain cas, ne pas avoir de valeur dans le champs [IDparent] puisse être une source de problème?

    Cela dit, je ne pense pas que ce soit ça. Mais sait on jamais.

  8. #8
    Membre régulier
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Juillet 2006
    Messages : 133
    Points : 90
    Points
    90
    Par défaut
    Pour faire les tests de ta requete je te conseille de mettre ta requete dans une requete a part et pas dans la source de ton combobox, ca sera plus simple pour differencier les vrai/faux enregistrement "null"

    Normalement si IDparent est vide, non ce n'est pas censé poser probleme

    Essai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT Famille.Nom FROM Famille WHERE Famille.IDparent=1 ORDER BY Famille.Nom

  9. #9
    Membre du Club
    Homme Profil pro
    Dessinateur industriel
    Inscrit en
    Décembre 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dessinateur industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2010
    Messages : 61
    Points : 46
    Points
    46
    Par défaut
    La requête fonctionne bien avec ce critère. Du coup tu as mis en évidence une erreur que je ne comprenais pas plus haut.

    Pour moi il est clair que l'on filtre sur [ID] et non pas [IDparent]. Qu'en penses tu?

  10. #10
    Membre régulier
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Juillet 2006
    Messages : 133
    Points : 90
    Points
    90
    Par défaut
    Cela met en evidence que IDparent est un champ numéro et pas texte!

    Je vois pas pourquoi access confondrait le champ ID et IDparent :S
    Mais seul toi peux le voir, en regardant le resultat de ta requete si elle correspond bien a un filtre sur IDparent et pas ID ....

    si tu cree une requete vierge avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT IDparent FROM Famille
    Tu as du texte ?!

    Si c'est possible pourrais tu m'envoyer ton fichier ?!

  11. #11
    Membre du Club
    Homme Profil pro
    Dessinateur industriel
    Inscrit en
    Décembre 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dessinateur industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2010
    Messages : 61
    Points : 46
    Points
    46
    Par défaut
    Oui je peux te passer le fichier sans problème.

    Mais j'ai eu le fin mot de l'histoire.. J'ai contacté la personne qui avait créer la partie que je ne comprenais pas. Et j'ai bien fait!! Je vais tenter d'expliquer ce que j'ai appris:

    En fait la table Famille_1 qui est liée à IDparent n'est pas réelement une table mais une instance de Famille. Donc je voyais bien que IDparent affichait des noms tels que Manifold, mais en réalité il s'agit d'entiers (voir mon post ou je décris cette liaison.

    De ce fait, je crois que tu t'approchais pas mal de la solution lorsque tu parlais de jointures.

    Voici la requête qui résout mon problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT B.Nom FROM Famille AS A, Famille AS B WHERE A.ID=B.IDparent AND A.Nom=[Formulaires]![GPE]![cbFamille];
    Bon j'ai juste modifié mon critère pour qu'il soit fonction de la sélection d'une combobox.

    Je ne suis pas sur d'être clair car je n'ai pas encore tout bien saisi. (mais je vais y réfléchir )

    En tous cas, merci beaucoup pour ton aide.

  12. #12
    Membre régulier
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Juillet 2006
    Messages : 133
    Points : 90
    Points
    90
    Par défaut
    Okey en fait parentID fais reférence a ID de la meme table.
    Donc effecteivement ta requete doit fonctionner mais je te conseille d'utiliser la requete de jointure que j'avais faite:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT tblMain.Nom FROM Famille AS tblMain LEFT JOIN Famille AS tblLinked ON tblMain.parentID=tblLinked.ID WHERE tblLinked.nom=[Formulaires]![GPE]![cbFamille]
    Si elle ne fonctionne pas essai de remplacer LEFT JOIN par RIGHT JOIN

    Cependant je ne sais pas comment tu forme ta liste box, mais si tu peux recuperer le IDparent et non son nom ca serait bcp plus simple.Si la source de ta liste box est basé sur la table Famille, aucun probleme.

  13. #13
    Membre du Club
    Homme Profil pro
    Dessinateur industriel
    Inscrit en
    Décembre 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dessinateur industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2010
    Messages : 61
    Points : 46
    Points
    46
    Par défaut
    Y a t-il un avantage à utiliser une solution plutôt que l'autre?

    Citation Envoyé par gabvoir Voir le message
    Cependant je ne sais pas comment tu forme ta liste box, mais si tu peux recuperer le IDparent et non son nom ca serait bcp plus simple.Si la source de ta liste box est basé sur la table Famille, aucun probleme.
    Je vais tâcher de t'expliquer pourquoi la personne qui s'est occupée de cette partie en est venu à cette solution.

    Imagine que je doive classer un grand nombre de pièces dont leur numéros d'identification provient d'un système existant. Pour retomber sur la logique existante, il me faut classer ces pièces sur un principe de hierarchie.

    Exemples:

    Famille (1er niveau): Quincallerie
    Catégorie (2eme niveau): Vis
    Sous catégorie (3eme niveau): H

    H appartient à Vis. Et Vis appartient à Quincallerie.
    IDparent permet de définir à qui appartient une entité. (donc niveau 2 ou 3 suivant si c'est rattaché à une entité de 1 ou 2 niveau)
    Si IDparent est vide, c'est que l'entité est de 1er niveau.

    Or on est pas sur qu'une entité du 2eme ou 3eme niveau soit réélement unique car certain termes peuvent être génériques et utilisés pour des hierarchies différentes.

    Exemple:

    une sous catégorie (3eme niveau) nommée "Horizontal" peut convenir pour differents supports ou matériel.

    Et si j'ai bien compris l'explication que l'on m'a fourni, c'est suite à cette problématique que l'on en vient à cette solution. Par contre je ne comprends pas forcément bien pourquoi.

    Est-ce que ça te parait cohérent?

  14. #14
    Membre régulier
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Juillet 2006
    Messages : 133
    Points : 90
    Points
    90
    Par défaut
    ben en soit je ne sais pas vraiement, mais ma solution de jointure est "plus dans les regles de l'art" si je ne me trompe.

    Oui je vois effectivement la structure de la base.
    Imaginons le cas suivant :
    Quincallerie - Vis -H - M6
    Quincallerie - Vis -H - M7
    Outillage - H -Bosch
    (exemple absurde mais exemple quand meme ^^)

    Les 2 premier H sont egaux, d'ou le troisieme H est obligatoirement un autre avec un autre ID et un autre IDparent.
    Si on rentre H dans la requete que l'on a fait precedemment, on aura
    M6 - M7 - Bosch

    C'etait bien ton souhait ? Ou simplement M6 et M7 (ou bosch) ?!

  15. #15
    Membre du Club
    Homme Profil pro
    Dessinateur industriel
    Inscrit en
    Décembre 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dessinateur industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2010
    Messages : 61
    Points : 46
    Points
    46
    Par défaut
    Merci pour l'info. Dans ce cas, je vais tâcher de modifier ma requête.

    Pour situer un peu à quoi ressemble le formulaire (pour le moment), j'ai 3 combobox (correspondant aux 3 différents niveaux) qui filtreront une liste box qui affichera la liste des pièces correspondantes.

    Tu vas me dire si je me trompe, mais si tout fonctionne comme je l'espère, après avoir fait mes 3 sélections (si j'ai 3 niveaux car ils sont facultatifs), je devrais bien avoir ce que je désire:

    Pour reprendre ton exemple:

    Cbox Famille = Quincallerie
    Cbox Catégorie = H

    Alors j'aurai Cbox Sous Catégorie = M6 - M7

    De même, si

    Cbox Famille = Outillage
    Cbox Catégorie = H

    Alors j'aurai Cbox Sous Catégorie = Bosch
    Si ce n'est pas le cas, alors je me suis planté quelque part.

    Pour le moment, je suis en train d'avancer sur la finition des combobox. J'ai encore quelque soucis pour masquer la cbox descendante dans la hierarchie si celle-ci est vide. Sinon je crois que tout est ok pour cette partie au combien éprouvante

    ps: du fait d'être "absurde", l'exemple est d'autant plus clair

  16. #16
    Membre régulier
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Juillet 2006
    Messages : 133
    Points : 90
    Points
    90
    Par défaut
    Ben en fait ce n'est pas ce qui se passera.
    En effet le fait de faire la recherche sur le champ name, te confondra la categorie H outillage et H quincallerie.
    Dans l'exemple fournit, la Cbox sous categorie sera dans les deux cas rempli avec les memes chose, les 3, M6 - M7 - Bosch.

    C'est pourquoi il faut modifier la requete afin de faire une recherche sur un identificateur unique. Ici c'est parfait ca correspond a parentID.
    Elle devient tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Famille.Nom FROM Famille WHERE parentID=[Formulaires]![GPE]![cbFamille]
    Cependant, il faut egalement changer la Cbox Famille afin quelle renvoi l'ID selectionné et pas son nom. Sa source sera donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ID,Nom FROM Famille WHERE Nz(parentID,0)=0
    Ensuite verifier que la propriete BoundColumn est a 1;
    ce qui permet de lier [Formulaires]![GPE]![cbFamille] a ID
    et ensuite au niveau affichage pour cacher l'ID, mettre "0cm" dans la prorpiete width

    De meme pour le Cbox sous categorie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Famille.Nom FROM Famille WHERE parentID=[Formulaires]![GPE]![cbCategorie]

  17. #17
    Membre du Club
    Homme Profil pro
    Dessinateur industriel
    Inscrit en
    Décembre 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dessinateur industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2010
    Messages : 61
    Points : 46
    Points
    46
    Par défaut
    Bonsoir,

    Désolé pour le temps de réponse.

    J'en ai profité pour parler de tout ça avec un collègue qui est familier avec les bases de données, et il préfère lui aussi ta requête qu'il juge plus propre. Et m'a donc conseillé de virer la liaison (Famille_1).

    J'ai donc suivi vos conseils et mis en place cette solution.
    Pour le moment cela fonctionne pour les niveaux 1 et 2. Mais pas encore pour le 3ème. Je réfléchis donc à une manière de faire marcher cette dernière combobox

    Par contre, j'aimerais, si possible, avoir plus d'explication sur ce que tu m'as donné. Je l'ai appliqué, mais je ne comprends pas tout.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ID,Nom FROM Famille WHERE Nz(parentID,0)=0
    Que signifie "Nz"? est-ce un nom donné pour une table fictive?
    Que sont les arguments entre parenthèses, du moins le "0")?

    Est ce que le "=0" signifie qu'on veut que les entrées dont IDparent est vide?

    (je me suis permi d'enlever le tag "Résolu" le temps que j'arrive à utiliser cette méthode)

  18. #18
    Membre régulier
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Juillet 2006
    Messages : 133
    Points : 90
    Points
    90
    Par défaut
    Bonjour,

    Pas de soucis pour le retard ^^

    Ben la troisieme combobox fonctionne exactement comme la deuxieme.
    Et c'est moi qui me suis trompé ...
    Dans la deuxieme Cbox la source doit etre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ID,Nom FROM Famille WHERE parentID=[Formulaires]![GPE]![cbFamille]
    Et comme pour la premiere:
    Verifier que la propriete BoundColumn est a 1;
    ce qui permet de lier [Formulaires]![GPE]![cbCategorie] a ID
    et ensuite au niveau affichage pour cacher l'ID, mettre "0cm" dans la prorpiete width

    Et de meme pour la source de a troisieme Cbox rajouter le ID:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ID,Nom FROM Famille WHERE parentID=[Formulaires]![GPE]![cbCategorie]
    Pour ce qui est de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ID,Nom FROM Famille WHERE Nz(parentID,0)=0
    Le Nz, c'est "non-zero", si parentID = null, alors parentID=0 (le parametre)
    Cela permet d'etre sur de bien prendre en compte les champs vide, et ceux egal a 0.

    J'espere avoir ete clair.

  19. #19
    Membre du Club
    Homme Profil pro
    Dessinateur industriel
    Inscrit en
    Décembre 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dessinateur industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2010
    Messages : 61
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    Merci beaucoup Gabvoir !

    D'une part, ça fonctionne très bien, et en plus je comprends la solution que tu m'as proposé.

    C'est plus clair pour moi maintenant ce système de requête avec les combobox. Je suis juste déçu de ne pas avoir réussi à me débrouiller tout seul hier soir en fonction de ce que tu m'avais donné.

    Par contre, il y aurait pour moi, une clause AND à rajouter dans la requête pour remplir la 3ème combobox.

    En effet, on va aller piocher dans notre table, admettons, toutes les entrées dont le nom correspond à "H" et qui ne sont pas de premier niveau.

    Cependant, il se peut qu'on ai une entité "H" dont le parent est "Vis", et une 2ème (ou n) entité dont le parent serait "Outillage". Or je souhaite, puisque j'ai sélectionné "Vis" dans la première combobox, ne pas voir les "H" lié à "Outillage".

    Il me semblerait donc logique, lors de cette dernière requête, de filtrer sur le nom qui nous intéresse bien sur (ici "H"), mais de vérifier que son parent est égal à ce que nous avons sélectionné dans la combobox de 1er niveau.

    En l'écrivant, je me dit qu'il faudrait surement en faire de même pour le 2ème niveau.

    Est-ce que ma logique te semble correcte? Si oui, je crois que nos requêtes actuelles permettraient l'affichages d'entrées non voulues.

  20. #20
    Membre régulier
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Juillet 2006
    Messages : 133
    Points : 90
    Points
    90
    Par défaut
    Quand on a la capacité d'aider alors pourquoi pas.
    Il n'y a pas de malm a ne pas y arriver tout seul, c'est d'ailleur pour ca que ce genre de fofo existe !

    Donc le probleme que tu cite ici etait celui que j'avais mis en avant avec ta premiere solution. Dans cette derniere on recherché dans la table en fonctione du nom de la famille.
    Ici avec les requetes que l'on a denrierement mise en place, on ne recherche pas en fonction du nom de son parent, mais directement a partir d'un identifiant unique parentID.
    Reprenons notre exemple absurde mais concret :
    ID | parentID | nom
    1 | 0 | Quincaillerie
    2 | 0 | Outillage
    3 | 1 | H
    4 | 3 | M6
    5 | 2 | H
    6 | 5 | Bosch

    Ici on a deux H mais ils n'ont ni le meme ID ni meme le meme parentID.
    Le fait de recherche sur les parentID et non pas sur le nom de ce meme parentID, nous permet de s'affranchir de ce probleme.
    En choisisant 1 dans le premier Cbox, cela va nous afficher dans la Cbox2 tous les ID qui ont comme parentID 1, soit le 3. Par la meme reflexion, avec 3 dans la Cbox2, on va afficher dans la Cbox3 tous les ID qui ont comme parentID 3, soit 4.
    Il faut reflechir par ID et non par nom. C'est d'ailleurs le grand avantage des bases de donnés avoir un identifiant unique pour chaque enregistrement.

    J'espere avoir ete clair

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/08/2008, 15h35
  2. Réponses: 1
    Dernier message: 01/08/2008, 17h25
  3. problème de création d'une requête SQL
    Par crushilefou dans le forum Requêtes
    Réponses: 9
    Dernier message: 07/12/2007, 11h59
  4. problème de création de requète sous VBA
    Par Golork dans le forum Access
    Réponses: 4
    Dernier message: 02/06/2006, 14h35

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