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

Access Discussion :

Concaténation "chaîne de caractères" d'un même champ [AC-2010]


Sujet :

Access

  1. #1
    Membre régulier

    Homme Profil pro
    Ingénieur développement produits
    Inscrit en
    Février 2016
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement produits
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2016
    Messages : 126
    Points : 71
    Points
    71
    Billets dans le blog
    1
    Par défaut Concaténation "chaîne de caractères" d'un même champ
    Hello à tous les férus,

    Voila j'ai une table du type:
    no_dossier / code_protocole / libellé_commercial
    1000280 / 1 / x / a
    1000280 / 1 / y / b
    1000280 / 1 / x / c
    1000280 / 2 / z / b
    1000256 / 1 / x / a
    1000256 / 2 / w / d
    .
    .
    .

    et je voudrais une seule ligne par protocole et par dossier (une ligne pour 1000280 / x , 1000280 / y ...., 1000256 / w....) avec tout les libellé_commercial dans une seule case (voyer le truc, un concaténation quoi).

    Bien sur je voudrais le faire en SQL car le VBA et moi bah... c'est pas ça ^^'
    voici le code que j'ai et dont je pensais qu'il serais bon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT no_dossier, code_protocole, libellé_commercial
    FROM Fichier_anonyme_chimio_drevon_talant_2014
    WHERE no_dossier=[num dossier]
    GROUP BY no_dossier, code_protocole;
    et bien sur l'erreur qui va avec :Nom : erreur.PNG
Affichages : 404
Taille : 4,8 Ko

    après coup je comprend pourquoi l'erreur apparais car il faut lui dire de concaténer les libellé_commercial mais je ne sais pas comment!

    Avez-vous des idées qui peuvent aider (ou pas)?

    Merci,
    ICE

  2. #2
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2016
    Messages : 15
    Points : 19
    Points
    19
    Par défaut
    Dans l'exemple que tu donnes tu indiques 4 données. Le protocole est-ce le code numérique ou le code alphabétique qui suit ?

    Quand tu demandes une seule ligne par protocole et par dossier et d'après ton exemple, est-ce 5 lignes ci-dessous que tu veux
    1. w,1000256,d
    2. x,1000256,a
    3. x,1000280,a/x,1000280,c
    4. y,1000280,b
    5. z,1000280,b


    sinon quels sont les critères pour la concaténation ?

  3. #3
    Membre régulier

    Homme Profil pro
    Ingénieur développement produits
    Inscrit en
    Février 2016
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement produits
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2016
    Messages : 126
    Points : 71
    Points
    71
    Billets dans le blog
    1
    Par défaut
    OUPS!!! il me manque un champs dans ma table!!!! désolé erreur de ma part. voici le correctif

    no_dossier / no_cure / code_protocole / libellé_commercial
    1000280 / 1 / x / a
    1000280 / 1 / y / b
    1000280 / 1 / x / c
    1000280 / 2 / z / b
    1000256 / 1 / x / a
    1000256 / 2 / w / d
    .
    .
    .

    c'est vrai que se sera mieux comme ça

    ce que je cherche a faire est de concaténer les libellé_commercial (dernier champs) par code_protocole sans toucher au autre. je veux a la fin une ligne qui contient:

    no_dossier / code_protocole / libellé_commercial AS Molecules
    1000280 / x / a-c
    1000280 / y / b
    1000280 / z / b
    1000256 / x / a
    1000256 / w / d


    le code en lui même est simple a faire mais la concaténation des libellé_protocole me pause des probleme....

    Voila, voila en espérant que ce soit plus claire

    ICE

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 840
    Points : 7 974
    Points
    7 974
    Par défaut
    Bonjour,

    Ce principe trouvé dans les sources ICI devrait te donner un début de solution.

    Cordialement,
    Mandresy
    "Je ne sais qu'une chose, c'est que je ne sais rien" Socrate

    N'oublions pas de mettre quand on a trouvé notre bonheur. Soyons sympa pour les futurs heureux.

    Merci, c'est toujours sympa de recevoir des de votre part

  5. #5
    Membre régulier

    Homme Profil pro
    Ingénieur développement produits
    Inscrit en
    Février 2016
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement produits
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2016
    Messages : 126
    Points : 71
    Points
    71
    Billets dans le blog
    1
    Par défaut
    bonjour Madefemere,

    ne t'inquete pas, ce sujet je llai tester et il marche.
    le seul probleme est que ce code marche que si tu a deux champs different. en effet moi avec un champs de plus (et qui ce repete) ca part en co*****.

    ce que je cherche comme resultat c'est:

    no_dossier / code_protocole / libellé_commercial AS Molecules
    1000280 / x / a-c
    1000280 / y / b
    1000280 / z / b
    1000256 / x / a
    1000256 / w / d

    et le code me donne

    no_dossier / code_protocole / libellé_commercial AS Molecules
    1000280 / x / a-b-c-d
    1000280 / y / a-b-c-d
    1000280 / z / a-b-c-d
    1000256 / x / a-d
    1000256 / w / a-d

    j'ai beau avoir essayer de mettre un paramètre de plus mais ça ne marche pas. aussi je suis une brelle en VBA. je préfère le SQL
    si vous avez une idée a partir de ce code...?!

    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
    Public Function RecupMolecule(no_dossier As Long) As String
    Dim res As DAO.Recordset
    Dim Db As DAO.Database
    'Selectionne les participant du projet
    Set res = CurrentDb.OpenRecordset("SELECT DISTINCT [libellé_commercial] FROM Fichier_anonyme_chimio_drevon_talant_2014 WHERE (no_dossier=" & no_dossier & ");")
    'Concatene les différents enregistrement
    While Not res.EOF
    RecupMolecule = RecupMolecule & res.Fields(0).Value & " / "
    res.MoveNext
    Wend
    'Enleve le dernier espace
    RecupMolecule = Left(RecupMolecule, Len(RecupMolecule) - 1)
    'libere la mémoire
    Set res = Nothing
    End Function
    ce code me donne la réponse:

    no_dossier / code_protocole / libellé_commercial AS Molecules
    1000280 / x / a-b-c-d
    1000280 / y / a-b-c-d
    1000280 / z / a-b-c-d
    1000256 / x / a-d
    1000256 / w / a-d

    qui est un début mais pas ce que je cherche.

    Merci,
    ICE

  6. #6
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 869
    Points : 3 448
    Points
    3 448
    Par défaut
    Bonjour IceCrime752, madefemere,

    IceCrime752 il faut que tu complètes la fonction pour passer le code_protocole en argument. Ça pourrait avoir l'air de ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Function RecupMolecule(no_dossier As Long, strProtocole as String) As String
    Et le Where clause de la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE no_dossier=" & no_dossier & " AND code_protocole= & Chr(34) & strProtocole & Chr(34) & ";"
    À ajuster selon tes champs.

    Bonne journée
    Ce qui se conçoit bien s’énonce clairement et les mots pour le dire arrivent aisément. Nicolas Boileau
    Si tout est OK, n'oubliez pas de cliquer sur

  7. #7
    Membre régulier

    Homme Profil pro
    Ingénieur développement produits
    Inscrit en
    Février 2016
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement produits
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2016
    Messages : 126
    Points : 71
    Points
    71
    Billets dans le blog
    1
    Par défaut
    Hello Robert1957,

    ton code a ete accepter par Access mais il me donne une erreur syntaxe dans la partie WHERE.

    Nom : Capture.PNG
Affichages : 510
Taille : 3,6 Ko

    de plus a quoi servent les Chr(34)?

    Merci,
    ICE

  8. #8
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    IceCrime752 bonjour,
    Robert1957, madefemere, JBL1952


    petite erreur ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE no_dossier=" & no_dossier & " AND code_protocole= & Chr(34) & strProtocole & Chr(34) & ";"
    à transformer par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE no_dossier=" & no_dossier & " AND code_protocole=" & Chr(34) & strProtocole & Chr(34) & ";"
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE no_dossier=" & no_dossier & " AND code_protocole='"  & strProtocole  & "';"
    jimbolion
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  9. #9
    Membre régulier

    Homme Profil pro
    Ingénieur développement produits
    Inscrit en
    Février 2016
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement produits
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2016
    Messages : 126
    Points : 71
    Points
    71
    Billets dans le blog
    1
    Par défaut on y est presque
    Hello,
    oui en effet, j'avais vu l'erreur après coup (j'ai écrit trop vite). cependant a quoi servent les Chr(34)?

    de plus une autre erreur est arriver:
    Nom : Capture2.PNG
Affichages : 384
Taille : 1,5 Ko
    Nom : Capture3.PNG
Affichages : 545
Taille : 16,1 Ko

    c'est la première fois que je l'ai. étant donné que la ligne n'ai semblerait il pas de grande utilité, j'ai essayer de l'enlever... quand j'ai fait ça le code marche et un résultat s'ouvre sans rien dans ma case Molecules (qui est l'endroit ou je devrais avoir ma concatenation)

    une dernière petite idée?

    ICE

  10. #10
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    IceCrime752 bonjour,

    A mon avis dans la première partie du code une erreur qui fait que RecupMolecul est une chaîne vide donc len(RecupMolecul) renvoie 0 (0-1)=-1 provoque donc une erreur.

    Peux tu poster grâce à la balise code (le # sur la partie supérieure) le code complet à savoir la fonction appelante et la fonction appelée.

    Code_protocle dans l'appel de ta fonction me choque également mais comme je n'ai pas l'appel ni la syntaxe complète du where dans la requête je ne peux pas savoir si ton souci vient de là.

    Cordialement

    Jimbolion
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  11. #11
    Membre régulier

    Homme Profil pro
    Ingénieur développement produits
    Inscrit en
    Février 2016
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement produits
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2016
    Messages : 126
    Points : 71
    Points
    71
    Billets dans le blog
    1
    Par défaut
    voici ce que voulais, et code_protocole est le nom de mon deuxieme champs principal sur ma table. no_dossier etant le premier.

    voici le code appeler:
    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 RecupMolecules(no_dossier As Long, code_protocole As String) As String
    Dim res As DAO.Recordset
    Dim sql As String
    'Selectionne toute les molecules
    sql = "Select DISTINCT(libellé_commercial) FROM Fichier_anonyme_chimio_drevon_talant_2014 WHERE no_dossier=" & no_dossier & " AND code_protocole= & Chr(34) & code_protocole & Chr(34) & "
    Set res = CurrentDb.OpenRecordset(sql)
    'Concatene les différents enregistrement
    While Not res.EOF
    RecupMolecules = RecupMolecules & res.Fields(0).Value & " / "
    res.MoveNext
    Wend
    'Enleve le dernier espace
    RecupMolecules = Left(RecupMolecules, Len(RecupMolecules) - 1)
    'libere la mémoire
    Set res = Nothing
    End Function
    et voici le code appellant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT type, no_dossier, code_protocole, RecupMolecules(no_dossier,code_protocole) AS Molecules
    FROM Fichier_anonyme_chimio_drevon_talant_2014
    WHERE no_dossier=[num de dossier]
    ORDER BY code_protocole;


    ICE

  12. #12
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    IceCrime752 hello

    la portion de code que tu m'as renvoyé ne tenait pas compte de mes dernières remarques. Pour l'utilisation des chr(34) il s'agit du double-quotes (") nécessaire pour les chaînes de type texte. L'utilisation de simple quote peut également fonctionner.

    Une explication sur un billet blog à cette adresse : http://www.developpez.net/forums/blo...s-ecrites-vba/

    Donc la partie VBA à modifier :

    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 RecupMolecules(no_dossier As Long, code_protocole As String) As String
        Dim res As DAO.Recordset
        Dim sql As String
        'Selectionne toute les molecules
        sql = "Select DISTINCT(libellé_commercial) FROM Fichier_anonyme_chimio_drevon_talant_2014 WHERE no_dossier=" & no_dossier & " AND code_protocole= " & Chr(34) & code_protocole & Chr(34) & ";"
        Set res = CurrentDb.OpenRecordset(sql)
        'Concatene les différents enregistrement
        While Not res.EOF
        RecupMolecules = RecupMolecules & res.Fields(0).Value & " / "
        res.MoveNext
        Wend
        'Enleve le dernier espace
        If Len(RecupMolecules) > 3 Then
            RecupMolecules = Left(RecupMolecules, Len(RecupMolecules) - 3)
        End If
        'libere la mémoire
        Set res = Nothing
    End Function

    Ensuite la requête avec type (mot réservé) me laisse perplexe, j'aurai plutôt vu çà :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT Fichier_anonyme_chimio_drevon_talant_2014.no_dossier, Fichier_anonyme_chimio_drevon_talant_2014.code_protocole, RecupMolecules(no_dossier,code_protocole) AS Molecules
    FROM Fichier_anonyme_chimio_drevon_talant_2014
    WHERE (((Fichier_anonyme_chimio_drevon_talant_2014.no_dossier)=[num de dossier]))
    ORDER BY Fichier_anonyme_chimio_drevon_talant_2014.code_protocole;

    Cordialement

    Jimbolion
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  13. #13
    Membre régulier

    Homme Profil pro
    Ingénieur développement produits
    Inscrit en
    Février 2016
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement produits
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2016
    Messages : 126
    Points : 71
    Points
    71
    Billets dans le blog
    1
    Par défaut
    OK, je ne savais pas que type était un mot réservé. en fait je l'ai aussi dans ma table comme un champs.
    bon je test et je te dis après.


    ICE

  14. #14
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    IceCrime752,

    Dans l'ensemble de tes échanges, je n'ai nullement vu aucune référence à ce champ de ta table

    Mais à mon humble avis, pour la restitution de ta valeur tu ne devrais pas en avoir besoin


    Jimbolion
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  15. #15
    Membre régulier

    Homme Profil pro
    Ingénieur développement produits
    Inscrit en
    Février 2016
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement produits
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2016
    Messages : 126
    Points : 71
    Points
    71
    Billets dans le blog
    1
    Par défaut Mon AMI jimbolion
    Oh mon ami!!! tu me sauve d'une profonde depression de 3 jour.

    un truc tout con a changer dans le code et j'y était presque sans aide!!! Mais bon...

    pour ceux qui veulent une conclusion a ce post (pour des aides ultérieurs) voici mon résultat avec mon code de départ
    Nom : Capture2.PNG
Affichages : 451
Taille : 12,4 Ko

    et mon résultat avec le code modifier
    Nom : Capture.PNG
Affichages : 351
Taille : 10,2 Ko

    comme dit plus haut juste des erreur de syntaxe....

    Un grand MERCI à toi jimbolion et à tous ceux qui ont collaborés sur la discutions.
    Mes connaissance VBA se sont ameliorer et je pourrai maintenant le refaire.

    A + pour de nouvelles aventures avec les question de IceCrime752 (bah oui j'en aurai d'autre c'est sur !!)


    ICE

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

Discussions similaires

  1. [MySQL] concaténation chaîne de caractères : exclusion de certains caractères
    Par johnlito dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 04/01/2012, 15h41
  2. [iTEXT] concaténation chaîne de caractére et variable
    Par jeremlerugbyman dans le forum Documents
    Réponses: 1
    Dernier message: 06/05/2010, 08h53
  3. [WD10] Erreur concaténation chaîne de caractères
    Par COLOMBAT dans le forum WinDev
    Réponses: 6
    Dernier message: 20/04/2010, 10h28
  4. Concaténation chaîne de caractères
    Par vince29 dans le forum Cobol
    Réponses: 19
    Dernier message: 21/12/2007, 14h46
  5. concaténation, chaîne de caractères
    Par bul dans le forum C++
    Réponses: 8
    Dernier message: 28/02/2005, 07h03

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