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énation de plusieurs enregistrement en une seule colonne [AC-2003]


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2010
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 61
    Points : 29
    Points
    29
    Par défaut Concaténation de plusieurs enregistrement en une seule colonne
    Bonjour à tous,

    Voila alors j'ai un formulaire de recherche multi-critères et j'en suis au stade où je veux qu'un même candidat n'apparaisse qu'une seule et unique fois dans mon tableau de résultat (appelé lstResults).

    Je me base sur ce tutoriel là : http://access.developpez.com/sources...QLLigneColonne
    mais je n'arrive pas à l'adapter à mon code à moi.

    Vous trouverez en pièce jointe les relations entre mes tables, qui est une information capitale pour comprendre le problème.

    voici mon code me permettant de concaténer les différentes langues parlées par une personne en une seule colonne (normalement...) :

    Code SQL : 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 Recuplangue(candidat_id As Long) As String
    Dim res As DAO.Recordset
    Dim SQL As String
     
    SQL = "SELECT T_Langue.langue FROM T_Langue LEFT JOIN T_Candidat_Langue WHERE T_Candidat_Langue.candidat_id=" & _
              Chr(34) & candidat_id & Chr(34)
     
    Set res = CurrentDb.OpenRecordset(SQL)
     
    While Not res.EOF
    Recuplangue = Recuplangue & res.Fields(0).Value & ";"
    res.MoveNext
    Wend
     
    Recuplangue = Left(Recuplangue, Len(Recuplangue) - 1)
     
    Set res = Nothing
     
    End Function


    et voici mon code qui calcule mon SQL et qui appelle le module précédent (appelé Recuplangue) :

    Code SQL : 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    Private Sub RefreshQuery()
    Dim SQL As String
    
    SQL = "SELECT T_Candidat.candidat_id, T_Candidat.nom, T_Candidat.prenom, T_Candidat.age, T_Candidat.date_de_naissance, T_Position.position, T_Discipline.discipline, T_Phase.phase, T_Venant_de.venant_de, T_Année_expérience.experience, Recuplangue(canditat_id) as Langue, T_Détails_Discipline.details_discipline " & _
                                "FROM ((((((((T_Candidat " & _
                                    "LEFT JOIN T_Position ON T_Candidat.position_id = T_Position.position_id) " & _
                                    "LEFT JOIN T_Discipline ON T_Candidat.discipline_id = T_Discipline.discipline_id) " & _
                                    "LEFT JOIN T_Phase ON T_Candidat.phase_id = T_Phase.phase_id) " & _
                                    "LEFT JOIN T_Venant_de ON T_Candidat.venant_de_id = T_Venant_de.venant_de_id) " & _
                                    "LEFT JOIN T_Année_expérience ON T_Candidat.annee_experience_id = T_Année_expérience.annee_experience_id) " & _
                                    "LEFT JOIN T_Candidat_Langue ON T_Candidat.candidat_id = T_Candidat_Langue.candidat_id) " & _
                                    "LEFT JOIN T_Langue ON T_Candidat_Langue.langue_id = T_Langue.langue_id) " & _
                                    "LEFT JOIN T_Candidat_Détails_Discipline ON T_Candidat.candidat_id = T_Candidat_Détails_Discipline.candidat_id) " & _
                                    "LEFT JOIN T_Détails_Discipline ON T_Candidat_Détails_Discipline.details_discipline_id = T_Détails_Discipline.details_discipline_id " & _
            "WHERE T_Candidat.candidat_id <> 0 "
    
    
    
    If Me.chknom Then
        SQL = SQL & "And T_Candidat.nom = '" & Me.cmbrechnom & "' "
    End If
    If Me.chkage Then
        SQL = SQL & "And T_Candidat.age like '" & Me.txtrechage & "*' "
    End If
    If Me.chkposition Then
        SQL = SQL & "And T_Position.position = '" & Me.cmbrechposition & "' "
    End If
    If Me.chkdiscipline Then
        SQL = SQL & "And T_Discipline.discipline = '" & Me.cmbrechdiscipline & "' "
    End If
    If Me.chkphase Then
        SQL = SQL & "And T_Phase.phase = '" & Me.cmbrechphase & "' "
    End If
    If Me.chkvenantde Then
        SQL = SQL & "And T_Venant_de.venant_de = '" & Me.cmbrechvenantde & "' "
    End If
    If Me.chkexperience Then
        SQL = SQL & "And T_Année_expérience.experience = '" & Me.cmbrechexperience & "' "
    End If
    If Me.chklangue Then
        SQL = SQL & "And T_Langue.langue = '" & Me.cmbrechlangue & "' "
    End If
    If Me.chkdetailsdiscipline Then
        SQL = SQL & "And T_Détails_Discipline.details_discipline = '" & Me.cmbrechdetailsdiscipline & "' "
    End If
    
    SQL = SQL & ";"
    
    Me.lstResults.RowSource = SQL
    Me.lstResults.Requery
    
    End Sub

    Et mon problème est que mon tableau ne me renvoi aucun enregistrement ...
    Quelqu'un saurait-il me dire d'où ça peut venir ???

    Merci à ceux qui me consacreront un peu de leur temps.
    @+ Vapo
    Fichiers attachés Fichiers attachés

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 352
    Points : 415
    Points
    415
    Par défaut
    est-ce une erreur de frappe ou ya-t-il bien marqué
    Recuplangue(canditat_id) as Langue (avec un t au lieu d'un d ?)

    précise également le nom de la table :
    Recuplangue(T_Candidat.candidat_id) as Langue

    est-ce que déjà dans la fenêtre d'exécution, ta fonction recupLangue(1) pas exemple renvoie bien ce que tu souhaite ?

    Avant de supprimer le dernier ";" de ta chaine recupLangue, vérifies qu'elle est bien de longueur > 1 car sinon l'expression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Recuplangue = LEFT(Recuplangue, Len(Recuplangue) - 1)
    va planter plusqu'il fera left(recupLangue,-1)

  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2010
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 61
    Points : 29
    Points
    29
    Par défaut
    Bonsoir,

    alors déjà oui il y avait bien une erreur de frappe.

    Que faut-il que je tape exactement dans la fenêtre d'exécution car j'ai mis :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    Recuplangue(T_Candidat.candidat_id) as Langue

    et il me met le message d'erreur suivant :

    "Erreur de compilation : Incorrect dans le volet d'exécution."

    Si je tente avec
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    Recuplangue(T_Candidat.candidat_id)
    il me dit "erreur de compilation : Variable ou procédure attendue, et non un module."

    Et comment je vérifie la longueur de ma chaine "Recuplangue" ?

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 700
    Points : 57 266
    Points
    57 266
    Billets dans le blog
    41
    Par défaut
    re,

    Plutôt avec la syntaxe INNER JOIN…ON…
    Et candidat_id est de type numérique, donc pas de chr(34)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    "SELECT T_Langue.Langue
    FROM T_Langue INNER JOIN T_Candidat_Langue 
    ON T_Langue.Langue_Id = T_Candidat_Langue.Langue_Id
    WHERE T_Candidat_Langue.Candidat_Id=" &  candidat_id

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 352
    Points : 415
    Points
    415
    Par défaut
    Pour tester ta fonction recupLangue, il te un id d'un candidat qui a des enregistrements correspondants dans langue par exemple l'id candidat 1

    dans la fenêtre d'exécution tu tapes donc
    il doit normalement t'afficher toutes les langues du candidat n°1

  6. #6
    Nouveau membre du Club
    Inscrit en
    Février 2010
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 61
    Points : 29
    Points
    29
    Par défaut
    Désolé de répondre que maintenant mais j'ai du travailler sur quelque chose d'autre...

    Alors voila où j'en suis :

    Code SQL : 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
    Public Function Recuplangue(candidat_id As Long) As String
    Dim res As DAO.Recordset
    Dim SQL As String
     
    SQL = "SELECT T_Langue.langue FROM T_Langue " & _
            "INNER JOIN T_Candidat_Langue " & _
                "ON T_Langue.langue_id = T_Candidat_Langue.langue_id " & _
                    "WHERE T_Candidat_Langue.candidat_id=" & candidat_id
     
    Set res = CurrentDb.OpenRecordset(SQL)
     
    While Not res.EOF
    Recuplangue = Recuplangue & res.Fields(0).Value & ";"
    res.MoveNext
    Wend
     
    Recuplangue = Left(Recuplangue, Len(Recuplangue) - 1)
     
    Set res = Nothing
     
    End Function


    Et j'ai testé ma fonction RecupLangue,
    il me répond : "erreur de compilation : Sub ou Fonction non définie."

    J'ai aussi essayé en commentant cette ligne :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    Recuplangue = Left(Recuplangue, Len(Recuplangue) - 1)
    mais ça n'a rien donné non plus.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Février 2010
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 61
    Points : 29
    Points
    29
    Par défaut
    En fait j'avais une mauvaise syntaxe ce n'était pas :

    mais


    Le message d'erreur que j'ai maintenant quand je test ma fonction Recuplangue est :
    "erreur de compilation : variable ou procédure attendue, et non un module".

  8. #8
    Nouveau membre du Club
    Inscrit en
    Février 2010
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 61
    Points : 29
    Points
    29
    Par défaut
    ça y est je viens de me déboggé. Mon module s'appelait "Recuplangue", il y avait donc un conflit avec le nom de la fonction publique qui était aussi "Recuplangue".
    J'ai simplement modifier le nom de ce module pour que ça fonctionne.

    Cependant dans ma requête, mon tableau de résultats m'affiche toujours plusieurs lignes par candidat, et cette fois les lignes sont exactement les mêmes... Ce cas se présente uniquement si je ne fais pas de recherche sur le champ "langue"!
    Comment cela se fait-il ???

    S'il faut que j'ouvre un nouveau topic, dites le moi.

    En tout cas, merci pour votre aide ça fait plaisir car quand on n'y connait rien, c'est pas gagné d'avance.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Février 2010
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 61
    Points : 29
    Points
    29
    Par défaut
    Cette fois-ci le problème est vraiment résolu, il fallait tout simplement que j'utilise la clause DISTINCT...

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

Discussions similaires

  1. [AC-2007] Concaténer des enregistrements dans une seule colonne
    Par germchou dans le forum Requêtes et SQL.
    Réponses: 16
    Dernier message: 03/07/2018, 16h00
  2. [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
  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