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 :

Concaténer des enregistrements dans une seule colonne


Sujet :

Requêtes et SQL.

  1. #1
    Candidat au Club
    Homme Profil pro
    Éditeur
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éditeur
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Points : 3
    Points
    3
    Par défaut Concaténer des enregistrements dans une seule colonne
    Bonjour.

    Je suis inscrit au site Developpez.

    Il y a une procedure écrite par Tofalu sur «Comment concaténer plusieurs enregistrements dans une seule colonne». J’essaie d’utiliser, sans succès, cette procédure donnée sur le site Developpez.com aux liens suivants:

    Office – Access – Sources – Requêtes – Concaténer plusieurs enregistrements dans une seule colonne – Exemple R01.

    J’ai créé une base de données avec les sections suivantes :

    Table : Tbl_projet
    Requëte : R01
    Module : Recup

    Quand j’essaie d’exécuter la Requête R01, j’obtiens toujours cette réponse :

    Fonction « Recupparticpant » non définie dans l’expression.

    Je ne peux pas voir où est l’erreur. Quelqu'un peut-il m’aider avec ce problème?

    Merci.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    As-tu bien défini ta function comme "Public" ?

    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.

  3. #3
    Candidat au Club
    Homme Profil pro
    Éditeur
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éditeur
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Points : 3
    Points
    3
    Par défaut Concaténer des enregistrements dans une seule colonne
    Dans le module de la fonction il y a un «public». Voici le SQL:

    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(Projet 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 Projet=" & Projet
    Set res = CurrentDb.OpenRecordset(SQL)
     
    'Concatene les différents enregistrement
    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

  4. #4
    Membre éclairé
    Homme Profil pro
    Regisseur
    Inscrit en
    Octobre 2006
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Regisseur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2006
    Messages : 475
    Points : 850
    Points
    850
    Par défaut
    Bonjour germchou et marot_r .

    "Fonction « Recupparticpant » non définie dans l’expression"
    Il manque un "i" . Cela peut venir de là

  5. #5
    Candidat au Club
    Homme Profil pro
    Éditeur
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éditeur
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Merci d'avoir soulevé cette erreur, mais ce n'est pas la solution. C'est moi qui ai omis le i en recopiant le message. Désolé.

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    À priori la fonction est correcte, cela doit venir de la requête.

    Peux-tu poster le SQL de ta requête ?

    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.

  7. #7
    Candidat au Club
    Homme Profil pro
    Éditeur
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éditeur
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Voici la requête.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT Tbl_projet.Projet, Recupparticipant(Projet) AS LesParticipants
    FROM Tbl_projet;

    Le Module contenant la fonction Recupparticipant est appelé Recup puisque je ne peux pas l'appelé du même nom que la fonction

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Essaye cela

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT Tbl_projet.Projet, RecupParticipant(Tbl_projet.Projet) AS LesParticipants
    FROM Tbl_projet;

    À priori cela ne devrait rien changer mais parfois utiliser des noms pleinement qualifiés aide.

    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
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Si le test précédent donne le même résultat, crée une fonction bidon du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public function Bidon() as string
       Bidon="Test de fonction"
    end function
    et la requête suivante :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT Tbl_projet.Projet, Bidon() AS LesParticipants
    FROM Tbl_projet;

    Juste pour voir si l'appel de fonction depuis du SQL marche.

    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.

  10. #10
    Candidat au Club
    Homme Profil pro
    Éditeur
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éditeur
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    J'ai essayé la suggestion de mettre Tbl_Projet.Projet au lieu de Projet uniquement et cela ne change rien. J,ai encore la meme réponse. J'ai essayé également la function Bidon avec le même résultat. Il n'y a pas d'appel de fonction dans le SQL.

  11. #11
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Essaye en créant une nouvelle base avec juste une table toute simple, une requête qui appelle une fonction et une fonction et voit si tu peux appeler la fonction depuis le SQL.

    Aussi vérifie que les macros sont bien activées. C'est niaiseux mais il arrive parfois qu'on oublie de les activer.

    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.

  12. #12
    Candidat au Club
    Homme Profil pro
    Éditeur
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éditeur
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Merci René pour ton aide à trouver une solution à ce problème.

    En faisant des recherches sur Développez, j'ai vu que je n'étais pas le premier à rencontrer ce problème. Il y avait quelqu'un en 2008 qui avait eu exactement le même. Il n'avait pas réussi en SQL. Il a essayé en VBA et ça avait fonctionné avec une fonction modifiée. Mais, le VBA, je ne le connais pas sauf le nom...

    Je vais chercher une autre manière d'avoir l'information que je veux.

    Merci encore.

  13. #13
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    Bonjour,

    Dans le module de la fonction il y a un «public». Voici le SQL:
    Mais, le VBA, je ne le connais pas sauf le nom...
    Le script que tu as, C'EST du VBA, pas du SQL.
    Donc, un copier-coller dans un "module" (ATTENTION ! Pas dans un "module de classe" !!!!!!) est suffisant, et le code que tu montres est satisfaisant.
    Le SQL c'est uniquement ce que CONSTRUIT la partie suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT NomParticipant FROM Tbl_Projet WHERE Projet=" & Projet
    Est-ce que ton 'Projet' est numérique ou alphanumérique ?
    Dans le premier cas, ton code est correct
    Dans le second cas, il conviendrait de le modifier ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT NomParticipant FROM Tbl_Projet WHERE Projet=" & Chr(34) & Projet & Chr(34)
    SELECT DISTINCT Tbl_projet.Projet, RecupParticipant(Tbl_projet.Projet) AS LesParticipantsFROM Tbl_projet;SELECT DISTINCT Tbl_projet.Projet, Bidon() AS LesParticipantsFROM Tbl_projet;

    Si tu es dans le premier cas, OU SI tu es dans le deuxième cas, que tu as corrigé, comme indiqué ci-dessus, ET QUE ça ne fonctionne toujours pas...
    Regarde ans la configuration de ton Access si les macros sont autorisées, ou si ta base est approuvée, etc.
    Sinon, effectivement, ça risque fort de ne pas fonctionner.

    Cordialement,

  14. #14
    Candidat au Club
    Homme Profil pro
    Éditeur
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éditeur
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Merci Maxence pour ces informations.

    Le projet est alphanumérique. J'ai essayé toutes les options que tu as proposées, mais sans succès. Les macros sont autorisées et la base de données est approuvée.

    Le seul message d'erreur donné par l'aide Access est le suivant:

    Fonction <name> non définie dans l'expression. (Erreur 3085)

    Vous avez entré une expression SQL incluant un nom de procédure Function impossible à reconnaître. Vérifiez que la fonction existe et que vous pouvez l'utiliser dans des expressions SQL, ou vérifiez que le nom entré dans l'expression est correct.

    Ce n'est trop aidant...

  15. #15
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    Si si ...

    Fais ALT+F11 (tu arriveras dans le Visual Basic Editor)
    Vas dans Outils/Références

    Y a-t-il quelque chose de marqué "MANQUANT" dans la liste qui t'est proposée ?

  16. #16
    Candidat au Club
    Homme Profil pro
    Assistant logistique
    Inscrit en
    Mai 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Assistant logistique
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2015
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    J'ai besoin de cette fonctionnalité et visiblement, la solution n'est pas encore diffusée.
    Le but est, à l'aide d'une requête, obtneir le 2ème tableau en partant du 1er.
    Nom : Capture2.PNG
Affichages : 418
Taille : 13,4 Ko
    J'ai très peu de connaissance en SQL/VBA pour ne pas dire aucune, c'est comme du mandarin pour moi

    Je suis partie de ce tuto du forum : http://access.developpez.com/sources...QLLigneColonne

    Voici la base toute simple :

    T01
    Projet NomParticipant
    1 Dupont
    1 Durand
    1 Paul
    2 Dupont
    2 Luc

    R01
    SELECT DISTINCT T01, Recupparticipant(Projet) AS LesParticipants
    FROM T01;

    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
    Public Function RecupParticipant(Projet As Long) As String
    Dim res As DAO.Recordset
    Dim SQL As String
    'Selectionne les participant du projet
    SQL = "SELECT NomParticipant FROM T01 WHERE Projet=" & Projet
    Set res = CurrentDb.OpenRecordset(SQL)
    'Concatene les différents enregistrement
    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
    Une fenêtre s'ouvre et demande :
    --> Entrer une valeur de paramètre T01 :

    Merci pour aide,

    Vincent

  17. #17
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2018
    Messages : 26
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par germchou Voir le message
    Voici la requête.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT Tbl_projet.Projet, Recupparticipant(Projet) AS LesParticipants
    FROM Tbl_projet;

    Le Module contenant la fonction Recupparticipant est appelé Recup puisque je ne peux pas l'appelé du même nom que la fonction
    Le poste est très ancien, cependant si certain le regarde pour avoir des solutions, dans le code sql essaie plutôt sans le DISTINCT:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT Tbl_projet.Projet, Recupparticipant(Tbl_projet.Projet) AS LesParticipants
    FROM Tbl_projet;

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: 2
    Dernier message: 11/04/2014, 18h16
  3. [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
  4. Réponses: 4
    Dernier message: 29/10/2010, 17h05
  5. SQL : Regrouper des lignes dans une seule colonne
    Par manoir62 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/02/2009, 18h06

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