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 :

Relation un à n : mettre les résultats sur une seule ligne


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 34
    Points : 17
    Points
    17
    Par défaut Relation un à n : mettre les résultats sur une seule ligne
    Bonjour,

    Après avoir parcouru de nombreux sujets, je n'ai pas trouvé une réponse à mon problème, ou du moins une qui soit assez parlante pour mon piètre niveau.

    Voici l'architecture de ma base : elle est entièrement basée sur une relation de 1 à plusieurs (un terrain peut avoir plusieurs propriétaires, plusieurs natures...)

    tblTerrains
    ID_Terrain
    nomTerrain

    tblPropriétaires
    ID_Proprio
    ID_Terrain (lien vers tblTerrains car un terrain peut avoir plusieurs proprio )
    nomProprio

    tblNature
    ID_Nature
    ID_Terrain (lien vers tblTerrains car un terrain peut avoir plusieurs natures)
    libelléNature

    Mon objectif est d'exporter une requête me présentant tous les terrains et leurs caractéristiques vers un fichier Excel.

    Or, évidemment, ma requête me donne de 1 à x lignes par terrain, selon qu'il y ait un ou plusieurs propriétaire, une ou plusieures natures. En l'état inexploitable sur Excel !

    Je voudrais donc la manip qui me permette de traduire à Access ma volonté, exprimée de cette façon :
    Je compte créer plusieurs champs propriétaire (proprio1, prioprio2, etc...) et nature (nature 1, nature 2...) dans ma requête, qui me récupèrent ces résultats multiples, quand la relation et bel et bien de 1 à n. J'aurai ainsi un fichier exploitable sur Excel

    Mais je ne sais pas du tout comment m'y prendre...

    Un grand merci pour votre aide !

  2. #2
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 34
    Points : 17
    Points
    17
    Par défaut
    ALors, personne pour me sortir de l'impasse ? je suis vraiment bloqué...

  3. #3
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    Hello,

    la création de champs est à éviter selon moi, ton cas me paraît ressembler à cet article des sources :
    http://access.developpez.com/sources...QLLigneColonne
    Ne mettez pas "Problème" dans vos titres, par définition derrière toute question se cache un problème
    12 tutoriels Access



  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 34
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par cafeine
    Hello,

    la création de champs est à éviter selon moi, ton cas me paraît ressembler à cet article des sources :
    http://access.developpez.com/sources...QLLigneColonne
    Je rentre de vacances, et me retrouve face à mon pb lol

    Merci Caféine pour le tuyau. Selon toi, avec cette méthode, il va m'être possible d'obtenir un résultat de requête qui peut ressembler à ça ? : (toujours d'après mon exemple)

    IDTerrains ! Natures ! Propriétaires
    1 ! construit ; bois ! Monsieur x ; Monsieur y ; monsieur z
    2 ! agricole ; construit ! mairie ; Conseil général

    Au-delà de la nature et des propritaires, j'ai encore de nombreux autres paramètres à solutions multiples pour chaque terrain, cela sera-t-il lourd à mettre en place ?

    Merci pour votre aide !

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 34
    Points : 17
    Points
    17
    Par défaut
    Je me pose une question de conception, qui pourrait me faciliter la tâche, tant la solution proposée par Caféine me paraît complexe pour mon petit niveau.

    Je sais que c'est moins propre, mais j'aurais eu moins d'ennuis en construisant ma base sur une table tblTerrains, avec, pour les solutions multiples, des champs nature 1, nature 2, nature 3 (ça dépasse jamais 3). Idem pour propriétaires, etc...

    C'est pas joli joli mais ma difficulté à exporter mes données sous la forme finale d'un tableau Excel (car j'ai cette demande, qui ne remet pas en cause l'intérêt d'Access sur Excel pour mon projet) me fait me poser cette question.

    Dois-je donc revoir complètement ma base et tout intégrer dans ma table tblTerrain, les autres tables n'étant que des listes de choix ?

    Merci pour vos conseils.

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 34
    Points : 17
    Points
    17
    Par défaut
    Alors, je refais ma base où je tente la solution compliquée proposée par Caféine ? et que je ne pense pas maîtriser...

    Merci encore pour votre aide !

  7. #7
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    Hello,

    ton problème c'est qu'il ne faut qu'une ligne dans ton export excel par terrain ?

    1- Es-tu certain que c'est un problème ?
    2- Si oui, tu devrais peut être écrire une fonction en VBA qui concatène tes caractéristiques pour chaque terrain et les stocke dans une table
    3- si tu as la possibilité d'avoir Access 2007, regarde du côté des champs multivalués (tuto de l'excellent Tofalu)
    Ne mettez pas "Problème" dans vos titres, par définition derrière toute question se cache un problème
    12 tutoriels Access



  8. #8
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 34
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par cafeine
    Hello,

    ton problème c'est qu'il ne faut qu'une ligne dans ton export excel par terrain ?

    1- Es-tu certain que c'est un problème ?
    2- Si oui, tu devrais peut être écrire une fonction en VBA qui concatène tes caractéristiques pour chaque terrain et les stocke dans une table
    3- si tu as la possibilité d'avoir Access 2007, regarde du côté des champs multivalués (tuto de l'excellent Tofalu)
    Merci Caféine pour ta réponse !

    Au passage, un grand merci à toi, car grâce à ton tuto sur la recherche multicritère, je viens de monter une base de données documentaire avec un efficace module de recherche. Jamais je n'y serais arrivé sans ton tuto.

    1 - Pour moi ça n'est pas un pb. Mais les personnes qui au départ ont sollicité cette base et demandé un multiple choix de possibles (ce qui me donne du 1n partout) veulent, entre autre, pouvoir exporter un tableau de synthèse avec tous les terrains et toutes les caractéristiques (pour certaines multiples) par terrain.
    Brut de décoffrage, je me retrouve donc avec un export depuis une requête dans laquelle j'ai parfois jusqu'à 20 lignes par terrain...

    Si tu as une idée ?

    2 - Concaténer les infos dans une table ? oui ça doit être bien ça. Une piste ou une explication ? je ne parle pas VBA couramment... Dans les grandes lignes penses-tu que ça me permettrait d'arriver à mes fins ?

    3 - J'ai Access 2002, et je fonctionne avec un environnement multiutilisateurs que j'ai mis en place grâce au runtime access. Je dois donc rester en Access 2002.


    Je suis preneur si tu as toute autre idée qui me permettrait de fournir à mes utilisateurs un moyen d'exporter un tableau de synthèse sur excel assez compréhensible (difficile avec du 1n)

    Merci encore.


  9. #9
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 34
    Points : 17
    Points
    17
    Par défaut
    Toujours dans la panade...

    Un petit coup de main pour écrire la fonction VBA qui concatène les caractéristiques pour chaque terrain et les stocke dans une table ?

    Merci !

  10. #10
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2006
    Messages
    1 350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 350
    Points : 1 701
    Points
    1 701
    Par défaut
    Bonsoir,

    Un terrain peut avoir plusieurs propriétaires
    Un propriétaire peut avoir plusieurs terrains

    La table nature devrait juste servir de source à une liste déroulante dans la table terrain.
    Plusieurs propriétaires pour un terrain, d'accord. Mais exactement comme pour une succession il n'y a qu'un propriétaire. (Généralement Monsieur) Et on crée une table pour les "ayants-droits"(Madame,La fille, Le fils, La tante, etc.)
    Ce qui fait : Une table terrains -->Une table propriétaire.

    Cordialement.
    Questions techniques par MP
    Le peu que je sais, c'est à mon ignorance que je le dois.
    ...............................................................................Sacha Guitry

  11. #11
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    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
    SELECT u.idterrain, u.nomterrain, (select first( idproprio)  from
    (SELECT a.idproprio, a.idterrain, a.nompropio, (select count(idproprio) from proprio where idproprio<=a.idproprio and idterrain=a.idterrain) AS cprop
    FROM proprio AS a) where idterrain=u.idterrain and cprop=1) AS idproprio1, (select first(nompropio)  from
    (SELECT a.idproprio, a.idterrain, a.nompropio, (select count(idproprio) from proprio where idproprio<=a.idproprio and idterrain=a.idterrain) AS cprop
    FROM proprio AS a) where idterrain=u.idterrain and cprop=1) AS nomproprio1, (select first( idproprio)  from
    (SELECT a.idproprio, a.idterrain, a.nompropio, (select count(idproprio) from proprio where idproprio<=a.idproprio and idterrain=a.idterrain) AS cprop
    FROM proprio AS a) where idterrain=u.idterrain and cprop=2) AS idproprio2, (select first(nompropio)  from
    (SELECT a.idproprio, a.idterrain, a.nompropio, (select count(idproprio) from proprio where idproprio<=a.idproprio and idterrain=a.idterrain) AS cprop
    FROM proprio AS a) where idterrain=u.idterrain and cprop=2) AS nomproprio2, (select first( idproprio)  from
    (SELECT a.idproprio, a.idterrain, a.nompropio, (select count(idproprio) from proprio where idproprio<=a.idproprio and idterrain=a.idterrain) AS cprop
    FROM proprio AS a) where idterrain=u.idterrain and cprop=3) AS idproprio3, (select first(nompropio)  from
    (SELECT a.idproprio, a.idterrain, a.nompropio, (select count(idproprio) from proprio where idproprio<=a.idproprio and idterrain=a.idterrain) AS cprop
    FROM proprio AS a) where idterrain=u.idterrain and cprop=3) AS nomproprio3,
    (select first(idnature) from
    (SELECT (select count(idnature)  from natur  where idnature<=b.idnature and idterrain=b.idterrain) AS ordnat, b.idterrain, b.idnature
    FROM natur AS b) where idterrain=u.idterrain and ordnat=1) as nature1,
    (select first(idnature) from
    (SELECT (select count(idnature)  from natur  where idnature<=b.idnature and idterrain=b.idterrain) AS ordnat, b.idterrain, b.idnature
    FROM natur AS b) where idterrain=u.idterrain and ordnat=2) as nature2,
    (select first(idnature) from
    (SELECT (select count(idnature)  from natur  where idnature<=b.idnature and idterrain=b.idterrain) AS ordnat, b.idterrain, b.idnature
    FROM natur AS b) where idterrain=u.idterrain and ordnat=3) as nature3
     
     
    FROM terrains AS u;
    Elle est pas belle la vie ?

  12. #12
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 34
    Points : 17
    Points
    17
    Par défaut
    Merci à vous deux ! je vais tester ça....

  13. #13
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 34
    Points : 17
    Points
    17
    Par défaut
    Bon ça me prenait trop de temps, ça dépassait mes limites, et j'ai lu que c'était surtout de la "cosmétique"... j'ai donc opté pour un export de plusieurs requêtes et une mise en forme manuelle sous Excel. C'est lâche, mais parfois il faut savoir peser le bilan "coûts-avantages"...

    Merci en tous cas pour votre aide, je pense que je retenterai la manip quand je serai plus aguerri.

Discussions similaires

  1. Réponses: 7
    Dernier message: 17/10/2014, 17h43
  2. Afficher les résultats sur une seule ligne
    Par arnovodao dans le forum Langage SQL
    Réponses: 1
    Dernier message: 18/07/2013, 14h49
  3. [Batch] comment mettre mon code sur une seule ligne
    Par fk04 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 17/03/2010, 13h01
  4. [AC-2007] Requête UNION : récuperer les valeurs sur une seule ligne
    Par tibofo dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 08/12/2009, 12h02
  5. Plusieurs résultats sur une seule ligne
    Par Morphorpse dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/08/2007, 19h36

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