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 :

Transformer des lignes en colonnes


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier Avatar de ofinot
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 98
    Points : 100
    Points
    100
    Par défaut Transformer des lignes en colonnes
    Bonjour à tous

    Le titre n'étant pas très explicite, je vais tenter d'être clair.

    Alors voila, dans le cadre d'un stage j'ai construit une base pour l'enregistrement d'informations concernant les contrats signés par un institut de recherche.

    A un même contrat peuvent notamment être associés, divers partenaires.

    Je dois réaliser une extraction excel des informations contenues dans la base, fichier qui doit être organiser ainsi :

    chaque ligne représente un contrat, et les partenaires doivent apparaitre sur cette ligne. En gros les colonnes seraient :

    |Id contrat | Intitulé | ... | Partenaire 1 | Partenaire 2 | Partenaire 3 | etc

    Mon problème est que je ne sais pas vraiment comment obtenir cela.

    J'ai regardé du coté des requête d'analyse croisée et j'ai vu que cela n'était pas ce dont j'avais besoin.

    Je vois bien une solution, qui serait de définir au préalable une table dans laquelle je rentrai les informations requises au moment de l'export, de créer dans cette table les colonnes "Partenaire", en estimant le nombre maximum de partenaires qu'un contrat pourrait avoir (si maximum 10, alors 1à colonnes).

    Cette solution a, à mon sens plusieurs problèmes :
    - c'est relativement lourd à mettre en place (d'autant qu'il faudra que je fasse de même pour les échéances, les factures et d'autres éléments)
    - si jamais un contrat a plus de partenaires que le maximum estimé, alors l'information ne sera pas complète
    - je trouve cela assez sale.


    C'est la raison pour laquelle je fais appel à vos lumières, peut être y a t il une autre solution que je n'ai pas envisagée qui soit plus souple et plus propre.

    Déjà merci à ceux qui ont eu le courage de me lire jusqu'au bout.

    Et ensuite, merci d'avance pour vos réponses.

    PS: si je ne suis pas clair, n'hésitez pas à demander des précisions, je ferai de mon mieux pour y répondre. (ce n'est pas toujours facile d'exprimer les choses par écrit)

  2. #2
    Membre expérimenté
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Points : 1 598
    Points
    1 598
    Par défaut
    Hello
    à mon sens la réponse est dans l'utilisation de VBA, où en est tu à ce niveau?

    il s'agira d'écrire la fonction qui balaie la sous table et fabrique le texte composé de la concaténation des n premières occurences du champ voulu

    Des posts sur ce forum décrivent déja ce genre d'opérations

    Bon courage a+
    -------------------Simplifi----------comme si tout était simple--------

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 345
    Points : 23 805
    Points
    23 805
    Par défaut
    Il n'y a pas de solution simple en Access mais peut-être devrais-tu regarder la copie-transposition de Excel. (C'est une des option de la copie-spéciale).

    Sinon il va faloir faire du code qui va concaténer tes partenaires.

    Ici un exemple de code qui fait cela, à mettre dans un module.

    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
     
    public function ConcatenerPartenaire(prmClefPartenaire as long) as string
       dim result as string
       dim db as dao.database:set db=currentdb
       dim r as dao.recordset
       sert r=db.openrecordset("SELECT * from Partenaires where [clefPartenaire]=" & prmClefPartenaire & ";":'Tu peux remplacer cela par l'appel à une requète paramétrée mais c'étais plus simple pour le moment.
       dim premierEnr as boolean:premierEnr=true
     
       do while not r.eof
     
          if not premierEnr then
            result=result & chr(9):'Ajoute une tabulation de séparation, à remplacer si nécessaire
          end if
     
          result=result & r![NomPartenaire]
          premierEnr=false
     
          r.movenext
       loop
     
       r.close:set r=nothing
       db.close:set db=nothing
     
       ConcatenerPartenaire=result
    end function
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  4. #4
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Je rejoins entiérement simplifi et marot_r. Tu devrais passer par du VBA, sinon tu peux toujours lire ceci :
    http://sqlpro.developpez.com/cours/sqlaz/erreurs/#L9

    Bon courage !
    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  5. #5
    Membre régulier Avatar de ofinot
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 98
    Points : 100
    Points
    100
    Par défaut
    Bonjour, et merci de vos réponses

    J'ai effectivement pensé à concaténer les partenaires, comme vous le mentionnez, et il est vrai que cela est plutôt simple à faire en vba.

    Cependant cela ne correspond pas parfaitement à mes besoins, en effet l'idéal serait de pouvoir séparer proprement les choses dans des colonnes différentes, surtout que j'ai pour chacun des partenaires différentes informations, comme le montant investi dans le contrat, son adresse etc ...


    Sinon une solution un peu plus flexible que ma première idée serait de rechercher pour les contrats qui m'intéressent le nombre maximal de partenaires. Ensuite, il faudrait construire une table temporaire regroupant pour chaque contrat les informations concernant lesdits partenaires. Enfin au moment de l'export je fais une jointure avec les autres tables dont j'ai besoin.

    J'ai en tête, une vague idée de comment y parvenir. Mais qu'en pensez vous ?

    Je vais également regarder d'un peu plus près la cosmétique, cela peut être effectivement une solution.

  6. #6
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    La cosmétique est à éviter. Les requêtes n'étant pas faite pour cela en vérité...

    Ton idée des tables temporaires serait à approfondir... Mais je crois que le mieux reste le VBA, sachant qu'en plus ton nombre de partenaire est variable !
    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  7. #7
    Membre régulier Avatar de ofinot
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 98
    Points : 100
    Points
    100
    Par défaut
    Citation Envoyé par Chtulus Voir le message
    La cosmétique est à éviter. Les requêtes n'étant pas faite pour cela en vérité...
    C'est sûr, je voyais surtout cela comme une solution de repli dans le cas où je parviendrais pas à obtenir le résultat autrement. Mais en y réfléchissant, si cela doit se faire au détriment des performances et nuire au fonctionnement global de l'appli, cela n'est effectivement pas bon.

    Ton idée des tables temporaires serait à approfondir... Mais je crois que le mieux reste le VBA, sachant qu'en plus ton nombre de partenaire est variable !
    Qu'entends tu par VBA ?
    De toute façon pour l'idée que j'avance plus haut, j'aurai bien évidemment besoin du vba :

    J'obtiens à l'aide d'une requête le nombre de partenaires dont j'i besoin pour ne pas perdre d'informations.
    Ensuite en VBA je construis ma requête de création de table, en bouclant sur le partenaire autant de fois que nécessaire.

    Puis une fois la table créée, je construis les requêtes d'ajout des données sur le même principe. etc ...

  8. #8
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 345
    Points : 23 805
    Points
    23 805
    Par défaut
    Le VBA, c'est Visual Basic For Application, le langage de programmation de Access.

    Tu peux en effet faire une table temporaire mais pour retrouver tes informations je passerai par VBA, avec une fonction paramétrée par le numéro de partenaire. Sinon il va falloir faire des jointures assez complexes (une par colonne partenaire).

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  9. #9
    Membre régulier Avatar de ofinot
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 98
    Points : 100
    Points
    100
    Par défaut
    Ma question n'était peut être (probablement ) pas judicieusement posée. Je sais très bien ce qu'est VBA, je me demandais simplement ce qu'il voulait faire en VBA.

    Et effectivement, une fonction qui retourne à partir du n° de partenaire, toutes les informations dont j'ai besoin, serait je pense des plus utiles.

  10. #10
    Membre expérimenté
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Points : 1 598
    Points
    1 598
    Par défaut
    hello
    ne doutant pas de tes capacités en VBA, je pensais juste à créer le contenu d'une zone de texte type mémo pour être assez large.
    j'imaginais avoir une fonction du type concatène_moi(id_projet,nom_duchamp,nom_delalsoustable,nombremaxi)

    avec une utilisation aussi simple que zone_mémo = concatène_moi (100,"partenaire","soustable",10) & " " & ch(13) & concatène_moi (100, "contact","soustable",10)

    dans la fonction, je vous bien l'ouverture d'un recorset basé sur un SQL composé d'un Select sur nom_delasoustable Where id_projet = argument1

    une boucle jusqu'à nombremaxi avec éventuellement un message si il y en a plus

    Enfin, voila juste une piste
    -------------------Simplifi----------comme si tout était simple--------

  11. #11
    Membre régulier Avatar de ofinot
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 98
    Points : 100
    Points
    100
    Par défaut
    Me revoilà,

    j'ai donc tenté de mettre en application l'idée que j'expliquais plus haut.

    Je calcule donc dans un premier temps le nombre maximum de partenaires présents pour les contrats qui m'intéressent. Ensuite je crée une table avec une colonne correspondant à l'id du contrat, puis autant que nécessaire pour les partenaires. Enfin je la rempli pour pouvoir l'exploiter.


    Or cette démarche fonctionne parfaitement avec mon compte administrateur, mais pas en étant un simple utilisateur du fait d'un manque de droits. J'ai regardé le menu autorisations d'accès mais je n'ai trouvé nulle part celui de créer une table, j'ai bien essayé de donner à tous les utilisateurs tous les droits pour "<nouvelles tables / Requêtes>, mais cela ne change rien à mon problème.


    Si quelqu'un a une idée, merci d'avance.

  12. #12
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Pour moi le plus simple, c'est de balayer les tables dans des curseurs imbriqués et d'écrire directement dans un fichier excel depuis access et c'est plier en deux heures. Et si les tables sont simples, un seul curseur peut suffire en gérant le changement de contrat...Et là c'est encore plus simple
    Pour t'aider il faut que tu envoi les tables avec qq enreg bidons.

  13. #13
    Membre régulier Avatar de ofinot
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 98
    Points : 100
    Points
    100
    Par défaut
    Je pense que je vais effectivement regarder les solutions de pilotage excel depuis access plutôt que d'essayer de créer une table avec les données qui m'intéressent déjà organisées et de la transférer telle quelle.

  14. #14
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 345
    Points : 23 805
    Points
    23 805
    Par défaut
    La solution par le pilotage d'Excel est une bonne idée.

    Attention toute fois, elle présente le défaut d'être vulnérable aux changement de version d'Excel, un truc qui marche très bien avec Excel 97 peut soudainement ne plus fonctionner avec Excel 2000.

    Je suggérerai de passer par un fichier text intermédiaire.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  15. #15
    Membre expérimenté
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Points : 1 598
    Points
    1 598
    Par défaut
    hello
    je rappelle qu'avec une fonction, on obtient ce que tu veux sans créer de table supplémentaire et donc sans pb de droits (voir post plus haut)
    -------------------Simplifi----------comme si tout était simple--------

  16. #16
    Membre régulier Avatar de ofinot
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 98
    Points : 100
    Points
    100
    Par défaut
    J'ai finalement réussi à résoudre mon problème.
    Et plutôt que de passer par du pilotage excel, j'ai tout simplement créé un fichier CSV, ce qui m'a permis de faire quelque chose de simple.

    Encore à vous tous pour vos réponses et vos conseils.

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

Discussions similaires

  1. Transformer des lignes en colonnes
    Par mahis_ dans le forum kettle/PDI
    Réponses: 2
    Dernier message: 01/07/2013, 13h41
  2. Requête SQL, transformer des lignes en colonne
    Par gadget2 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 01/11/2010, 20h50
  3. [Datastage Server 7.5] Transformer des lignes en colonnes
    Par alpachico dans le forum DataStage
    Réponses: 1
    Dernier message: 10/07/2009, 16h25
  4. Transformer des lignes en colonnes
    Par Gomoz dans le forum Requêtes
    Réponses: 1
    Dernier message: 17/02/2009, 17h55
  5. Transformer des lignes en colonne DataStage
    Par bnet2 dans le forum DataStage
    Réponses: 4
    Dernier message: 09/12/2008, 10h07

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