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 lignes en une seule à partir d'un même identifiant


Sujet :

VBA Access

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Février 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Concaténer plusieurs lignes en une seule à partir d'un même identifiant
    Bonjour,
    Je vous explique mon problème, je travaille sur Access et je veux concaténer plusieurs lignes en une seule.
    J'ai une table de concert qui contient deux champs (num et lib)
    Num        lib
    01           concert des bébés
    01           concert des enfants
    02           concert des adultes
    01           concert des seniors
    Je veux avoir
    Num          lib
    01             concert des bébés concert des enfants concert des seniors
    02             concert des adultes
    J'ai trouvé sur le net la programmation que j'ai essayé d'adapter mais cela ne marche pas.


    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
    20
    21
    22
    23
    24
    25
    26
    Public Function ConcertFaire(Num As Long) As String
     
    Dim DB As DAO.Database
    Set DB = CurrentDb
     
    Dim strConcert As String
    Dim rst As DAO.Recordset
    Dim rstN As DAO.Recordset
     
    Set rst = DB.OpenRecordset("SELECT num FROM concert ORDER BY num", dbOpenDynaset)
    Do While Not rst.EOF
            Set rstN = DB.OpenRecordset("SELECT lib FROM concert WHERE num = " & Chr(34) & CStr(rst(0) & Chr(34)), dbOpenDynaset)
     
            Do While Not rstN.EOF
                strConcert = strConcert & ", " & rstN(0)
                rstN.MoveNext
            Loop
            rstN.Close
     
            rst.MoveNext
    Loop
    rst.Close
     Set rst = Nothing
     Set rstN = Nothing
    DB.Close: Set DB = Nothing
    End Function
    Je l’exécuter via Access par cette requête: SELECT DISTINCT concert.num, ConcertFaire(num) AS LesConcerts FROM concert;.
    cela tourne longtemps dans le vide et m'affiche que les num.
    Pouvez-vous m'aider car je commence la programmation en VBA et ne comprend pas grand chose.
    Merci

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


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 764
    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 764
    Points : 58 075
    Points
    58 075
    Billets dans le blog
    42
    Par défaut
    Bonsoir,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Set rst = DB.OpenRecordset("SELECT num FROM concert ORDER BY num", dbOpenDynaset)
    Do While Not rst.EOF
     
    ...
            rst.MoveNext
    Loop
    Cette partie là peut être supprimée, tu parcours tous les num de ta table alors que la requête SELECT DISTINCT concert.num, ConcertFaire(num) AS LesConcerts FROM concert; le fait déjà.

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Février 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Salut f-leb
    Je viens de supprimer les lignes indiquées sauf que à l'exécution, un message d'erreur apparaît sur cette
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rstN = DB.OpenRecordset("SELECT lib FROM concert WHERE num = " & Chr(34) & CStr(rst(0) & Chr(34)), dbOpenDynaset)
    que je trouve normal par contre car j'ai supprimé rst. Je l'ai remplacé par num mais l'erreur persiste.
    C,est quoi la solution.
    Merci

  4. #4
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Février 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Coucou, c'est encore moi, je viens toujours avec mon problème. Je viens de réadapter le programme que j'ai posté plus haut qui est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Function ConcertFaire(num As Long) As String
    Dim res As DAO.Recordset
    Dim SQL As String
     
    SQL = "SELECT lib FROM concert WHERE num = " & Chr(34) & "num" & Chr(34)
    'SQL = "SELECT lib FROM concert WHERE num=" & Chr(34) & "2074" & Chr(34)
    Set res = CurrentDb.OpenRecordset(SQL)
    'Concatene les différents enregistrement
    Do While Not res.EOF
     ConcertFaire= ConcertFaire & res.Fields(0).Value & Chr(10)
     res.MoveNext
    Loop
     res.Close: Set res = Nothing
    End Function
    Il s’exécute sauf que:
    1) Quand je l’exécuter avec SQL = "SELECT lib FROM concert WHERE num = " & Chr(34) & "num" & Chr(34).
    Il y a que la colonne de num qui apparait et la colonne lib est vide
    2) Quand je l’exécuter avec SQL = "SELECT lib FROM concert WHERE num = " & Chr(34) & "2074" & Chr(34).
    En spécifiant un numéro exemple ici 2074. Quand le numéro n'a que 2 lignes, la concaténation se fait sans problème par contre quand le numéro spécifie à plus de 2 lignes, la concaténation se fait seulement sur les 2 1ere ligne et ne prend pas le reste.
    J’espère avoir bien expliqué mon problème
    Merci de m'aider

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


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 764
    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 764
    Points : 58 075
    Points
    58 075
    Billets dans le blog
    42
    Par défaut
    Apparemment, num est une chaîne de caractères, non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Function ConcertFaire(num As String) As String
    et dans ce cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL = "SELECT lib FROM concert WHERE num = " & Chr(34) & num & Chr(34)

  6. #6
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Février 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Salut,
    Merci f-leb, j'ai modifié ma fonction et elle s’exécute sans problème sauf que il ya un soucis, elle fais bien la concaténation seulement s'il y'a 2 lignes, au délai de 2 lignes il copie seulement la 1ere ligne des 3 lignes par exemple ou la 1ere des 4 lignes.
    Tu penses que c'est du à quoi? Dépasse t-elle la longueur maximale de la ligne? Ou? En tout cas je ne comprend pas pourquoi , la function marche pour 2 lignes et non pour plus de 2 lignes.
    Merci à vous

  7. #7
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Février 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Salut, f-leb, j'ai testé ma solution avec un autre fichier et cela se passe bien. Dans mon 1e fichier, il y avait beaucoup de retour à la ligne dans le champ lib. Maintenant comme la 1ere partie marche , j'ai une autre doléance. Je veux tester le nombre de caractère concaténé si il dépasse 500 mots par exemple, j'inserer la ligne avec 500 mots et le reste je crée ou insère une autre ligne. Pour être compréhensible
    exemple, le champ lib concaténé donne 1400 ligne, je veux mettre que des ligne qui ont moins de 500 lignes. Pour cette exemple je vais avoir 3 lignes dont 2 lignes de 500 mots et la 3e ligne de 400 mots.
    Comme je peux faire cela.
    Merci à vous

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


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 764
    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 764
    Points : 58 075
    Points
    58 075
    Billets dans le blog
    42
    Par défaut
    Bonsoir,

    pas tout compris mais tu peux essayer en rajoutant un booléen :
    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
     
    dim troplong as Boolean
    troplong=False
     
    ...
    Do While Not res.EOF and Not troplong
     ConcertFaire= ConcertFaire & res.Fields(0).Value & Chr(10)
     if len(ConcertFaire)>500 then ' si plus de 500 caractères
         troplong=True
         endif
     res.MoveNext
    Loop
     
    if troplong then
       ConcertFaire= ConcertFaire & "[...]" ' on rajoute des points de suspension pour indiquer que le texte est coupé
       endif

  9. #9
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Février 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Salut, merci, J'ai tester ta solution qui marche très bien. Par contre , j'aimerai quand c'est troplong, créer une nouvelle ligne avec les 500 1e caractères du champ et s'il y a un reste, creer une autre ligne avec ce qui reste. Dans me recherche, je vu qu'il y'a INSERT INTO et AddNew , ne sais quoi choisir et comment faire merci.

Discussions similaires

  1. Regrouper données plusieurs ligne en une seule
    Par willytito dans le forum Access
    Réponses: 2
    Dernier message: 03/09/2007, 10h35
  2. Plusieurs lignes dans une seule
    Par rlnd23 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/02/2007, 16h35
  3. [MySQL] Remplir plusieurs lignes d'une seule table avec le même formulaire
    Par zehni dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 07/09/2006, 12h12
  4. Réponses: 4
    Dernier message: 07/09/2006, 12h12
  5. Concatenation de plusieurs lignes en une seule
    Par stawen dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/03/2005, 13h55

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