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 :

Concaténer plusieurs enregistrements avec clé primaire différent dans une seule colonne [AC-2013]


Sujet :

VBA Access

  1. #1
    Membre habitué Avatar de scully2501
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 184
    Points : 148
    Points
    148
    Par défaut Concaténer plusieurs enregistrements avec clé primaire différent dans une seule colonne
    Suite au code suivant que j'ai trouvé dans le FAQ "Concaténer plusieurs enregistrements dans une seule colonne":


    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 EMAIL_RECETTEUR FROM TABLE_RECETTEUR 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
    J'ai effectué l'action suivante avec Microsoft Access 2013 (je jongle sur deux ordinateurs donc un avec Access 2013 et l'autre avec Access 2007):

    Dans le fenetre VB (ALT+F11) -->Outils-->Référence. Et là tu coche la bonne référence "Microsoft DAO 3.6 Object Library"
    Mais j'ai le message d'erreur suivant:

    Name conflits with existing module, project, or object library
    En faisant une recherche sur le net, il est indiqué que Microsoft DAO est en conflit avec

    Microsoft Access 15.0 Object library
    Mais quand je veux le décocher, cela est impossible

    Can't remove control or reference ; in use
    Voici les references actuelles:
    Nom : Reference.jpg
Affichages : 334
Taille : 68,1 Ko

    J'ai regarder ici comme préconisé par le modérateur Loufab:
    http://warin.developpez.com/access/dao/
    http://warin.developpez.com/tutoriel...et-ulterieurs/

    Mais je n'ai pas trouvé ma réponse, ai je peut être mal lu?

    J'ai une table TABLE_RECETTEUR qui posséde un email par ligne. J'aimerais pouvoir concaténer ses emails dans un champs:
    exemple:

    Résultat attendu:

    d@free.fr;c@free.fr;e@free.fr;f@free.fr

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 017
    Points : 24 554
    Points
    24 554
    Par défaut
    Bonjour,

    Même réponse que dans ta demande précédente.

    http://warin.developpez.com/tutoriel...et-ulterieurs/

    1er chapitre je cite :
    Si vous travaillez sur une application Microsoft Access, aucune référence supplémentaire n'est à ajouter à votre projet. En revanche si vous développez depuis une autre application Office, n'oubliez pas d'activer la bibliothèque Microsoft Office 12(14).0 Access Database Engine Object via le menu Outils->Références de l'éditeur Visual Basic.
    Cordialement,

  3. #3
    Membre habitué Avatar de scully2501
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 184
    Points : 148
    Points
    148
    Par défaut
    Je ne sais pas si vous avez lu mon post mais si vous regardez bien mes références
    Microsoft Office 15.0 Access Database Engine Object
    est déja coché et le probléme subsiste toujours.
    Quand j'exécute ma requête, il me demande de rentrer une valeur pour
    T_RECETTEUR.Projet
    .

  4. #4
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 017
    Points : 24 554
    Points
    24 554
    Par défaut
    Bonjour,
    Plusieurs choses me trouble :

    Jongler avec 2 versions ce n'est pas bon. Les références changent de l'une à l'autre ça crée des problèmes. Il faut au minimum faire une décompilation sans exécution avant de passer de la 2013 à 2007. (cf http://blogaccess.free.fr/?p=75 )

    Est-ce que le problème de la référence DAO 3.6 impossible à décocher est toujours d'actualité ? C'est ce qu'il faut régler en priorité. Décompiler, ouvrir avec le shift et décocher. Si cela persiste créer nouveau fichier accdb et transférer tous les objets vers celui-ci.

    Tu indiques "T_RECETTEUR.Projet" cependant dans le code fourni la requête ni fait pas référence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL = "SELECT EMAIL_RECETTEUR FROM TABLE_RECETTEUR WHERE Projet=" & Projet
    Ce qui me fait penser que le code fourni a évolué.

    Cordialement,

  5. #5
    Membre habitué Avatar de scully2501
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 184
    Points : 148
    Points
    148
    Par défaut
    Bonjour,

    Merci de vos réponses car avec tous ses incoherences, il y a de quoi faire tourner la tête.
    Pour le moment je reste sur la version 2013 pour éviter tout probléme.

    Après lecture de votre post, j'ai enfin compris ma bêtise:
    Dans référence, j'ai décoché:
    Microsoft office 15.0 Access database engine object
    Ce qui m'a permis de cocher
    Microsoft DAO 3.6 Object Library
    Nom : Reference.jpg
Affichages : 350
Taille : 68,5 Ko

    J'ai mis à jour le code VBA:
    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
     
    Option Compare Database
    Public Function RecupParticipant(Projet As Long) As String
    Dim res As DAO.Recordset
    Dim SQL As String
    'Selectionne les participant du projet
    SQL = "SELECT EMAIL_RECETTEUR FROM T_RECETTEUR 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
    Voici ma requête SQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT T_RECETTEUR.Projet, Recupparticipant(Projet) AS LesParticipants
    FROM T_RECETTEUR;
    Concernant la table suivante:
    Nom : Reference.jpg
Affichages : 286
Taille : 29,8 Ko

    Quand j'exécute cette requête, j'ai la fenêtre suivante qui s'affiche:
    Nom : Reference.jpg
Affichages : 280
Taille : 11,4 Ko

    Maintenant que j'ai réussi à cocher la référence Microsoft DAO, je ne comprends pas pourquoi la requête SQL n'arrive pas à faire appel à la fonction RecupParticipant

  6. #6
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 017
    Points : 24 554
    Points
    24 554
    Par défaut
    "DAO 3.6" ne doit plus être utilisé, c'est une vieille bibliothèque qui est remplacée par la "Microsoft office xx.0 Access database engine object"

    Pour être vue par les requêtes une fonction doit être Publique et enregistrée dans un module standard, si vous l'avez mises dans un formulaire un état ou un module de classe elle ne sera pas visible.

  7. #7
    Membre habitué Avatar de scully2501
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 184
    Points : 148
    Points
    148
    Par défaut
    ok
    Donc j'ai décoché Microsoft DAO et recoché Microsoft office 15.0 Access database engine object.
    En gros j'étais OK depuis le début mais cela ne fonctionne pas.

    La fonction est bien public et est bien placé dans un module standard.

    Voici en piéce jointe la base de données:test.7z

  8. #8
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 017
    Points : 24 554
    Points
    24 554
    Par défaut
    On en revient à la remarque précédente :

    T_RECETTEUR.Projet ce champ n'existe pas dans la table.

    Donc ceci n'est pas valide non plus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RecupParticipant([Projet]) AS LesParticipants
    Cordialement,

  9. #9
    Membre habitué Avatar de scully2501
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 184
    Points : 148
    Points
    148
    Par défaut
    Merci loufab d'avoir éclairé ma lanterne bien eteinte , affaire enfin résolu. Bon après midi.

    Voici le bon code dans un module standard avec dans les références: décoché Microsoft DAO et coché Microsoft office 15.0 Access database engine object.:
    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
    Public Function RecupParticipant(ID_RECETTEUR As Long) As String
    Dim res As DAO.Recordset
    Dim SQL As String
    'Selectionne les participant du projet
    SQL = "SELECT EMAIL_RECETTEUR FROM T_RECETTEUR 
    ' Pour tout prendre d'un coup enlever le WHERE ID_RECETTEUR=" & ID_RECETTEUR
    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
    Avec la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT T_RECETTEUR.ID_RECETTEUR, Recupparticipant(ID_RECETTEUR) AS LesParticipants
    FROM T_RECETTEUR;

+ 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: 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: 2
    Dernier message: 23/11/2012, 14h14
  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