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

VBA Access Discussion :

[Access 2007/10] Adapter Tuto "Concaténer plusieurs enregistrements dans une seule colonne"


Sujet :

VBA Access

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut [Access 2007/10] Adapter Tuto "Concaténer plusieurs enregistrements dans une seule colonne"
    Bonjour,

    Tout d'abord, merci pour toutes ressources !

    Je suis néophyte et je cherche à adapter le code / tuto Concaténer plusieurs enregistrements dans une seule colonne .

    Pour reprendre l'exemple, il y a une table intermédiaire "participer".


    Table Projet
    Nom : Table Projet.png
Affichages : 412
Taille : 5,7 Ko

    Table participant
    Nom : Table participant.png
Affichages : 412
Taille : 6,7 Ko

    Table participer
    Nom : Table participer.png
Affichages : 386
Taille : 4,5 Ko

    Cardinalités
    Nom : relation.png
Affichages : 404
Taille : 5,3 Ko


    Lorsque j'exécute la requête, contrairement au tuto, Access me demande une valeur en input et je ne comprends pas pourquoi.
    Nom : input.png
Affichages : 396
Taille : 11,9 Ko

    Si je renseigne 1

    Le résultat que j'obtiens est celui ci-dessous :
    Nom : result.png
Affichages : 390
Taille : 5,4 Ko

    Cela correspond aux enregistrements de l'ID 1 a priori mais je ne comprends pas la confusion avec le "DISTINCT".

    Cela fait un moment que je cherche et j'ai vraiment besoin d'adapter, à plusieurs endroits, cette concaténation (dont un endroit avec des retours chariots > mais ca fera peut-être l'objet d'un autre post après recheche préalab).

    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
     
    Public Function RecupParticipant(Projet As String) As String
    Dim res As DAO.Recordset
    Dim SQL As String
    'Selectionne les participant du projet
    SQL = "SELECT Participant.PrenomParticipant, Participant.NomParticipant FROM Projet INNER JOIN (Participant INNER JOIN participer ON Participant.id_Participant = participer.id_Participant) ON Projet.id_projet = participer.id_projet WHERE participer.id_projet =" & Projet
    Set res = CurrentDb.OpenRecordset(SQL)
    'Concatene les différents enregistrement
    While Not res.EOF
    RecupParticipant = RecupParticipant & res.Fields(0).Value & " " & res.Fields(1).Value & " ; "
    '& " " & res.Fields(2).Value
     
    res.MoveNext
    Wend
    'Enleve le dernier espace
    RecupParticipant = Left(RecupParticipant, Len(RecupParticipant) - 2)
    'libere la mémoire
    Set res = Nothing
    End Function
    Requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT DISTINCT participer.id_projet, Recupparticipant(Projet) AS LesParticipants
    FROM Projet INNER JOIN participer ON Projet.id_projet = participer.id_projet;



    Pourriez-vous m'apporter votre expertise SVP ?

    Je vous remercie

    André

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Bonjour.

    Dans le tuto, il y a un champ [Projet] dans les tables.
    Dans tes tables, tu sembles avoir utiliser [NomProjet], il faut donc adapter ton code en conséquence.

    A+

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par marot_r Voir le message
    Bonjour.

    Dans le tuto, il y a un champ [Projet] dans les tables.
    Dans tes tables, tu sembles avoir utiliser [NomProjet], il faut donc adapter ton code en conséquence.

    A+
    Bonjour,

    merci beaucoup pour la réponse.

    En fait je ne comprends pas. La requête SQL "encapsulée" dans le module (sans le WHERE) liste bien les auteurs des projets avec une ligne par projet, si on l'exécute en dehors et isolément : logique pour moi.

    Après, dans le module, si je change "Projet" par "projet2" , il me demande une valeur pour projet2. Si je remplace dans tous le module "NomProjet" pas mieux.
    la variable "Projet" dans "Public Function RecupParticipant(Projet As String) As String" , correspond bien à une variable que l'on choisi et il faut qu'elle matche avec un champ de la table "participer"?

    Je n'ai pas l'impression de commettre une faute d'étourdie mais après j'ai tellement la tête dans le guidon et suis néophyte.

    merci

    André

  4. #4
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 797
    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 797
    Points : 14 863
    Points
    14 863
    Par défaut
    Bonsoir,
    à première vue je vois 2 erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Recupparticipant(Projet)
    devrait être :Recupparticipant(id_Projet)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Function RecupParticipant(Projet As String) As String
    devrait être Projet As Long car Id_projet est numérique (à priori, mais on ne vois pas le descriptif détaillé des champs des tables)

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    Bonsoir,
    à première vue je vois 2 erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Recupparticipant(Projet)
    devrait être :Recupparticipant(id_Projet)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Function RecupParticipant(Projet As String) As String
    devrait être Projet As Long car Id_projet est numérique (à priori, mais on ne vois pas le descriptif détaillé des champs des tables)
    Merci pour cette réponse.

    Oui, pardon pour l'absence d'information concernant le type

    [Projet]
    id_projet --> NuméroAuto
    NomProjet --> texte

    [participer]
    id_projet --> Numérique
    id_Participant --> Numérique

    [Participant]
    id_Participant --> NuméroAuto
    PrenomParticipant --> texte
    NomParticipant --> texte


    Si je remplace par

    • (Projet As Long) As String (dans le module)
      --> même comportement : demande valeur pour "Projet" (fenetre s'ouvre "Projet") puis même résultat (problème de DISTINCT?)
      Nom : resultat.PNG
Affichages : 361
Taille : 6,9 Ko
    • (Projet As Long) As Long (dans le module)
      même comportement : demande valeur pour "Projet" (fenetre s'ouvre "Projet") puis"Erreur exécution '13' Incompatibilité de type


    Merci

  6. #6
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 797
    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 797
    Points : 14 863
    Points
    14 863
    Par défaut
    Bonjour,
    il faut mettre (Projet As Long) As String dans ton module mais il faut aussi mettre Recupparticipant(id_Projet) dans la requête appelante (comme je l'ai précédemment indiqué)

  7. #7
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 797
    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 797
    Points : 14 863
    Points
    14 863
    Par défaut
    Petite explication concernant les types de données de Public Function RecupParticipant(Projet As Long) As String :
    Projet As Long signifie que l'on passe en paramètre une donnée de type Numérique long ce qui est le cas de id_projet puisque qu'il est utilisé ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL = "SELECT Participant.PrenomParticipant, Participant.NomParticipant FROM Projet ... WHERE participer.id_projet =" & Projet
    RecupParticipant() As String signifie que la fonction va retourner une donnée de type texte (String) puisque le but est d'avoir une concaténation de plusieurs noms.
    Alors arrête de changer les types cela ne fait pas avancer la résolution de ton problème.

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Bonjour tee_grandbois,

    Un grand merci pour ces réponses et désolé pour le délai de cette réponse.


    Citation Envoyé par tee_grandbois Voir le message
    Bonjour,
    il faut mettre (Projet As Long) As String dans ton module mais il faut aussi mettre Recupparticipant(id_Projet) dans la requête appelante (comme je l'ai précédemment indiqué)

    Très bien, j'ai fait les modifications.


    Citation Envoyé par tee_grandbois Voir le message
    Petite explication concernant les types de données de Public Function RecupParticipant(Projet As Long) As String :
    Projet As Long signifie que l'on passe en paramètre une donnée de type Numérique long ce qui est le cas de id_projet puisque qu'il est utilisé ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL = "SELECT Participant.PrenomParticipant, Participant.NomParticipant FROM Projet ... WHERE participer.id_projet =" & Projet
    RecupParticipant() As String signifie que la fonction va retourner une donnée de type texte (String) puisque le but est d'avoir une concaténation de plusieurs noms.
    Alors arrête de changer les types cela ne fait pas avancer la résolution de ton problème.
    Merci, je comprend mieux du coup.
    Je cherchais à comprendre d'où venait le problème, l'isoler. Il y a eu un manque de rigueur effectivement, désolé.

    Lorsque j'exécute la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT participer.id_projet, Recupparticipant(id_projet) AS LesParticipants
    FROM Projet INNER JOIN participer ON Projet.id_projet = participer.id_projet;
    J'ai le message d'erreur :

    Nom : msg erreur id_projet.png
Affichages : 383
Taille : 21,6 Ko

    En fait, je ne comprend pas mais peut-être que j'essai de faire quelque de "trop compliqué" par rapport à mon pauvre niveau et qu'il faut commencer par les bases en vba? Dommage, le fait de pouvoir concaténer plusieurs valeurs dans un seul et même champ était très prometteur par rapport à ce que je voulais faire dans mon cas d'application (pas "plus compliqué" que cela) mais je n'arrive même pas à adapter le tuto . Je dois rater quelque chose d'élémentaire là, ce qui me rend

    Un conseil?

    André

  9. #9
    Invité
    Invité(e)
    Par défaut
    essayer avec : ...recupparticipant(participer.id_projet)...

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par galoir Voir le message
    essayer avec : ...recupparticipant(participer.id_projet)...


    Ca fonctionne désormais. J'ai un sentiment se situant entre "quelle busace, je suis !" et "un grand soulagement".

    Merci à chacun d'entre vous pour votre précieuse aide. Ca va me permettre d'attaquer ce que je voulais faire.


+ 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