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 :

Transposer /concatener plusieurs enregistrements dans une seule colonne


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier Avatar de totor92290
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 418
    Points : 102
    Points
    102
    Par défaut Transposer /concatener plusieurs enregistrements dans une seule colonne
    Bonsoir à tous,
    Je sais ce sujet déjà de multiples fois abordé.... mais j'ai un petit souci d'adaptation
    le modèle est celui-ci:
    https://access.developpez.com/source...QLLigneColonne
    dans ma table j'ai ajouté une nouvelle colonne date
    Tbl_Projet

    NomParticipant CodeProjet NomProjet DateProjet
    Olivier 1 Poterie 18/01/2022
    franck 2 Bois 18/01/2022
    Daniel 1 Poterie 22/01/2021
    Denis 1 Poterie 22/01/2021
    Thierry 2 Bois 18/01/2022
    Thierry 1 Poterie 22/01/2021

    ma requête R01:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT Tbl_projet.CodeProjet, RecupParticipant([CodeProjet]) AS LesParticipants, Tbl_projet.DateProjet
    FROM Tbl_projet
    GROUP BY Tbl_projet.CodeProjet, RecupParticipant([CodeProjet]), Tbl_projet.DateProjet;
    Affichage R01
    R01

    R01 CodeProjet LesParticipants DateProjet
    1 Olivier;Daniel;Denis;Thierry 22/01/2021
    1 Olivier;Daniel;Denis;Thierry 18/01/2022
    2 franck;Thierry 18/01/2022

    Module1
    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
    Public Function RecupParticipant(CodeProjet As Long) As String
    Dim res As DAO.Recordset
    Dim SQL As String
    'Selectionne les participant du projet
     
    SQL = "SELECT NomParticipant FROM Tbl_Projet WHERE CodeProjet=" & CodeProjet
    Set res = CurrentDb.OpenRecordset(SQL)
     
    'Concatene les différents enregistrements
    While Not res.EOF
        RecupParticipant = RecupParticipant & res.Fields(0).Value & ";"
        res.MoveNext
    Wend
    'Enleve le dernier espace
    RecupParticipant = Left(RecupParticipant, Len(RecupParticipant) - 1)
    'libere la mémoire
    Set res = Nothing
    End Function
    Le problème c'est le résultat de la requête, les participants sont en doublon lorsque des dates diffèrent!
    Est-ce normal, autrement dit, est-ce que ce module et cette requête sont la bonne approche ?

    MERCI !

  2. #2
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    bonsoir,
    il faut faire un DISTINCT puisque pour le codeProjet 1 il y a 2 lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL = "SELECT DISTINCT NomParticipant FROM Tbl_Projet WHERE CodeProjet=" & CodeProjet
    ou alors, il faut préciser la date
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  3. #3
    Membre régulier Avatar de totor92290
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 418
    Points : 102
    Points
    102
    Par défaut
    Merci Tee,
    J'ai ajouté DISTINCT dans la ligne du module.
    C'est idem ??
    Le seul changement porte sur l'ordre dans l'affichage de R01
    Affichage R01
    R01

    R01 CodeProjet LesParticipants DateProjet
    1 Daniel;Denis;Olivier;Thierry 22/01/2021
    1 Daniel;Denis;Olivier;Thierry 18/01/2022
    2 franck;Thierry 18/01/2022

    Qu'entends-tu par: "ou alors, il faut préciser la date " ?

  4. #4
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    si tu mets la date dans la requête R01, il y a forcément une distinction dans les enregistrements.
    Et donc cela répond à ta question:
    Le problème c'est le résultat de la requête, les participants sont en doublon lorsque des dates diffèrent!
    Est-ce normal, autrement dit, est-ce que ce module et cette requête sont la bonne approche ?
    oui, c'est normal: 2 dates = 2 enregistrements, il faut choisir une des 2 dates pour enlever le doublon en ajoutant ceci dans la clause WHERE par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    And dateProjet = DMax("DateProjet";"tbl_Projet";"CodeProjet=" & CodeProjet)
    si, évidemment, c'est ce que tu souhaites
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  5. #5
    Membre régulier Avatar de totor92290
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 418
    Points : 102
    Points
    102
    Par défaut
    Merci Tee,
    Pour clarifier mon besoin...
    Ma table

    NomParticipant CodeProjet NomProjet DateProjet
    Olivier 1 Poterie 18/01/2022
    franck 2 Bois 18/01/2022
    Daniel 1 Poterie 22/01/2021
    Denis 1 Poterie 22/01/2021
    Thierry 2 Bois 18/01/2022
    Thierry 1 Poterie 22/01/2021

    au lieu d'obtenir ça:
    R01

    R01 CodeProjet LesParticipants DateProjet
    1 Daniel;Denis;Olivier;Thierry 22/01/2021
    1 Daniel;Denis;Olivier;Thierry 18/01/2022
    2 franck;Thierry 18/01/2022

    Je voudrais obtenir ça:
    R01

    R01 CodeProjet LesParticipants DateProjet
    1 Daniel;Denis;Thierry 22/01/2021
    1 Olivier 18/01/2022
    2 franck;Thierry 18/01/2022

    En effet Olivier est le seul à la "poterie" le 18/01/2022 et il ne participe pas le 22/01/2022 pourtant il apparait.

    Concernant ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    And dateProjet = DMax("DateProjet";"tbl_Projet";"CodeProjet=" & CodeProjet)
    et la condition "WHERE", il faut le positionné dans le module ou dans la requête ?

    Merci encore !!

  6. #6
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    bonjour,
    En effet Olivier est le seul à la "poterie" le 18/01/2022 et il ne participe pas le 22/01/2022 pourtant il apparait.
    effectivement, cela m'avait échappé
    donc dans ta fonction RecupParticipant il faut ajouter la date en paramètre et dans ta clause where puisque c'est là qu'on va distinguer qui a participé à quoi et quand:
    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
    Public Function RecupParticipant(CodeProjet As Long, DateProjet as date) As String
    Dim res As DAO.Recordset
    Dim SQL As String
    'Selectionne les participant du projet
     
    SQL = "SELECT NomParticipant FROM Tbl_Projet WHERE CodeProjet=" & CodeProjet & " and DateProjet=#" & DateProjet & "#"
    Set res = CurrentDb.OpenRecordset(SQL)
     
    'Concatene les différents enregistrements
    While Not res.EOF
        RecupParticipant = RecupParticipant & res.Fields(0).Value & ";"
        res.MoveNext
    Wend
    'Enleve le dernier espace
    RecupParticipant = Left(RecupParticipant, Len(RecupParticipant) - 1)
    'libere la mémoire
    Set res = Nothing
    End Function
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  7. #7
    Membre régulier Avatar de totor92290
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 418
    Points : 102
    Points
    102
    Par défaut
    Tee,
    encore merci !
    J'ai copier/coller le code dans le module.
    Lorsque je lance la requête R01, j'ai un message d'erreur
    "Wrong number of arguments used with functionin query expression 'RecupParticipant([CodeProjet]'.
    Je note que dans ce message il n'y a pas la parenthèse fermée après le crochet, je ne sais pas si c'est important.
    J'ai retiré le "group by"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GROUP BY Tbl_projet.CodeProjet, RecupParticipant([CodeProjet]), Tbl_projet.DateProjet;
    , mais rien n'y fait

    qu'est ce qui coince ?

    Totor

  8. #8
    Membre régulier Avatar de totor92290
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 418
    Points : 102
    Points
    102
    Par défaut
    Trouvé !
    Mais vraiment en testant je n'ai pas l'expertise !
    J'ai ajouté la date dans la requête et ça fonctionne !!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT Tbl_projet.CodeProjet, RecupParticipant([CodeProjet],[DateProjet]) AS LesParticipants, Tbl_projet.DateProjet
    FROM Tbl_projet;

    UN GRAND MERCI TEE !!!

  9. #9
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    J'ai ajouté la date dans la requête et ça fonctionne !!
    oui, un petit oubli, mais cela me semblait d'une évidence: quand on ajoute un paramètre dans une fonction, il faut l'alimenter là où on l'utilise.
    Mais tu as trouvé tout seul: bravo.
    N'oublie pas le bouton
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  10. #10
    Membre régulier Avatar de totor92290
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 418
    Points : 102
    Points
    102
    Par défaut
    Tee,
    Encore un problème ...
    Il semblerait que le format date ne fonctionne pas.. je viens d'essayer un truc et c'est zinzin !!!...
    Dans ma table j'ai remplacé le 18/01/2022 par le 04/01/2022

    NomParticipant CodeProjet NomProjet DateProjet
    Olivier 1 Poterie 04/01/2022
    franck 2 Bois 04/01/2022
    Daniel 1 Poterie 22/01/2021
    Denis 1 Poterie 22/01/2021
    Thierry 2 Bois 04/01/2022
    Thierry 1 Poterie 22/01/2021

    Et là j'ai un message d'erreur:
    Run time error '5':
    Invalid procedure call of argument
    et lorsque je clique sur Debug
    j'ai la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RecupParticipant = Left(RecupParticipant, Len(RecupParticipant) - 1)
    qui passe en jaune !
    C'est à ni rien comprendre !
    Que s'est-il passé ce fameux 4 janvier 2022

  11. #11
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    encore un oubli de ma part: le 04/01/2022 pour VBA c'est le 1 avril 2022 si on ne précise pas le format US, comme la variable RecupParticipant doit être vide vu qu'il n'a rien trouvé pour cette date cela provoque l'erreur.
    Essaie comme çà:
    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
    Public Function RecupParticipant(CodeProjet As Long, DateProjet as date) As String
    Dim res As DAO.Recordset
    Dim SQL As String
    'Selectionne les participants du projet
     
    SQL = "SELECT NomParticipant FROM Tbl_Projet WHERE CodeProjet=" & CodeProjet & " and DateProjet=#" & format(DateProjet,"mm/dd/yyyy") & "#"
    Set res = CurrentDb.OpenRecordset(SQL)
     
    'Concatene les différents enregistrements
    While Not res.EOF
        RecupParticipant = RecupParticipant & res.Fields(0).Value & ";"
        res.MoveNext
    Wend
     
    'Enleve le dernier espace si la requête renvoie quelque chose
    if Len(RecupParticipant) > 0 then RecupParticipant = Left(RecupParticipant, Len(RecupParticipant) - 1)
    'libere la mémoire
    Set res = Nothing
    End Function
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  12. #12
    Membre régulier Avatar de totor92290
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 418
    Points : 102
    Points
    102
    Par défaut
    Petit test...
    J'ai ajouté une ligne avec une autre année et là pas de problème !!

    NomParticipant CodeProjet NomProjet DateProjet
    Olivier 1 Poterie 18/01/2022
    franck 2 Bois 18/01/2022
    Daniel 1 Poterie 22/01/2021
    Denis 1 Poterie 22/01/2021
    Thierry 2 Bois 18/01/2022
    Thierry 1 Poterie 22/01/2021
    Olivier 1 Poterie 18/01/2020

    Résultat de la requête

    R01 CodeProjet LesParticipants DateProjet
    1 Daniel;Denis;Thierry 22/01/2021
    1 Olivier 18/01/2020
    1 Olivier 18/01/2022
    2 franck;Thierry 18/01/2022

    Petite info je suis sur un PC et Access en anglais... ça impacte le schmilblick ?

  13. #13
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Petite info je suis sur un PC et access en anglais... ça impact le schmilblick ?
    non, c'est bien à cause du format de date dans VBA, regarde mon post précédent
    le problème se pose quand le jour est inférieur à 13 car VBA utilise TOUJOURS le format US, donc lorsqu'on passe une date en paramètre (qui vient donc d'un autre environnement, en l'occurrence les données d'une requête) il faut la formater de manière à ce que VBA la voit au format US
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  14. #14
    Membre régulier Avatar de totor92290
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 418
    Points : 102
    Points
    102
    Par défaut
    YES !!!
    Impeccable ça fonctionne à merveille !!

    Un grand grand merci Tee !

    Bon week-end.

    Totor

  15. #15
    Membre régulier Avatar de totor92290
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 418
    Points : 102
    Points
    102
    Par défaut
    Aie !! je ré-ouvre !!

    Dans mon projet le champ "NomParticipant" de ma table contient des noms, prénoms, tel et adresse.
    Du fait de la concaténation, le "DISTINCT" dans la requête vient amputer le résultat !

    Si j'enlève le "distinct", j'ai bien l'intégralité de ma concaténation mais les lignes sont dupliquées!
    Je ne sais pas si je suis clair ?

    Totor

  16. #16
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    bonjour,
    Dans mon projet le champ "NomParticipant" de ma table contient des noms, prénoms, tel et adresse.
    là, je n'y peux pas grand chose cela relève du défaut de conception de la base ... D'ordinaire on sépare toutes ces informations dans des champs distincts.
    Je suppose que tu reçois les données de "l'extérieur" et qu'ensuite tu les importes et les traites dans ta base ? Si c'est ce cas, je ne vois pas comment traiter cela automatiquement ...
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  17. #17
    Membre régulier Avatar de totor92290
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 418
    Points : 102
    Points
    102
    Par défaut
    Bon... finalement j'ai utiliser des requêtes ajout vers des tables où les champs sont en text long et je supprime les doublons
    c'est lourd mais ça passe !!

    Merci Tee pour ton support !

    Totor

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

Discussions similaires

  1. [AC-2007] Probleme pour Concaténer plusieurs enregistrements dans une seule colonne
    Par severik dans le forum Requêtes et SQL.
    Réponses: 23
    Dernier message: 08/11/2017, 15h15
  2. Réponses: 11
    Dernier message: 24/07/2015, 19h17
  3. Réponses: 2
    Dernier message: 11/04/2014, 18h16
  4. [AC-2003] Concaténer plusieurs enregistrements dans une seule colonne
    Par pgomis dans le forum Access
    Réponses: 2
    Dernier message: 29/07/2013, 10h39
  5. Réponses: 4
    Dernier message: 29/10/2010, 17h05

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