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éner plusieurs champs access


Sujet :

Access

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Concaténer plusieurs champs access
    Bonjour,

    Je suis nouveau sur ce forum et je ne suis pas un spécialiste de access ; cependant je suis amener à developper une petite base de données et j'aurai besoin de quelques conseils.

    En fait je souhaite standardiser les libellés de mes différents contacts, pour faire cela jai créer une table "contact". Afin que le format soit le même pour tous je dispose de 4 champs "titre", "prenom", "initiales", "nom" qui devront être concatenés en un seul champ d'une seconde table (voire dans la même et après j'appliquerai une requête ajout vers la seconde table)

    Cependant je n'arrive pas à concataner dans access et je ne sais pas comment procédé. Puis-je le faire par le biais d'une requête, d'une macro, d'un module vba,...? et comment?

    Si vous avez des solutions ou des suggestions pour moi, merci de me répondre là je bloque...

    Bonne journée et merci encore.

    Cyril

  2. #2
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    tu peux le faire avec une requête.
    L'opérateur de concaténation est le &

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT titre & " " & prenom & " " & nom As Expr1
    FROM contacts
    A+

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Merci,

    Ca marche sans problème, je voulais juste savoir à quoi sert "As Expr1"

    Moi je l'ai supprimé et aucun problème sans, par ailleurs j'ai ajouté une ligne INSERT INTO au début de la requête pour mettre à jour automatiquement le champ correspondant de la seconde table.

    Mais j'ai également un autre problème, j'avais mis en place des masques de saisie pour les différents champs (1ère lettre du prénom en majuscule, nom en majuscule, etc) mais après concaténation le champ correspondant ne tient plus en compte des masques car il concatène le texte brut...Y aurait-il une solution à ce problème?

    Merci encore,

    A+

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 282
    Points : 356
    Points
    356
    Par défaut
    Bonjour,

    Tu peux utiliser un "Format" pour chaque composante de la concatenation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT Format(titre,???) & " " & Format(prenom,???) & " " & Format(nom,???) As Expr1
    FROM contacts
    Remplace les "???" par le format desire...

    Pour ce qui est de "Expr1", c'est pour donner un nom au champ resultat de la concatenation, au cas ou tu voudrais utiliser le query a partir d'un autre ou dans un formulaire, ou un etat etc...
    Par defaut, Access met Expr1 -> Exprn, mais tu peux "imposer" le nom que tu desires.
    - Bien programmer n'est pas choisir la solution la plus simple, mais la meilleure -

  5. #5
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Citation Envoyé par chuchu57 Voir le message
    ... j'avais mis en place des masques de saisie pour les différents champs (1ère lettre du prénom en majuscule, nom en majuscule, etc) mais après concaténation le champ correspondant ne tient plus en compte des masques car il concatène le texte brut...
    Le masque de saisie n'a d'effet que si on entre manuellement les données.
    Dans ce cas, elles sont enregistrées dans le format du masque saisie.

    Tu peux adopter la proposition de SSJconsult, ou si tu préfères que les données de la table sources soient déjà au format souhaité, tu exécutes une requête mise à jour utilisant StrConv
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE contacts
    SET prenom = StrConv([prenom],3), nom = StrConv([nom],1);
    A+

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 85
    Points : 114
    Points
    114
    Par défaut
    Bonjour

    Ce que tu demandes ne va faire qu'alourdir ta base, en effet tu mets des informations redondantes et inutiles :

    Les initiales peuvent se retrouver lors de la création d'une requête avec la fonction Left.
    De même le fait de concaténer l'ensemble de tes informations dans un champs multiplie les données pour rien, c'est lors de l'extraction des données que tu feras cette concaténation, on ne la stocke pas.

    De plus que feras-tu lorsqu'une femme changera de nom (Mariage ou divorce) ?

    Tu devras refaire une requête pour mette à jour les initiales et le champ concaténer ?

    Si je reprends ton exemple "Titre" + "Nom" + "Prenom" dans une autre colonne, tu augmentes d'un coup de 25 % les données de cette table inutilement et ut augmentera le temps de traitement de tes données.
    PeyePo

  7. #7
    Futur Membre du Club
    Inscrit en
    Mai 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Bonjour, merci à vous 3,

    Finalement j'ai décidé d'utiliser une requête UPDATE séparement, comme ca en plus je peux la reutiliser par ailleurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE New_person SET First_name = StrConv([First_name],3), Initiale1 = Initiale1 & ".", Initiale2 = Initiale2 & ".", Initiale3 = Initiale3 & ".", Nameperson = StrConv([Nameperson],1);
    Mais comment faire pour que la requête ne rajoute pas de "." si les champs Initiale1 (ou 2 ou 3 qui ne sont d'ailleurs pas obligatoires) sont vides.

    Enfin le dernier petit souci que j'ai lors de la concaténation est le suivant, voici deja ma requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO New_contact ( Name )
    SELECT New_person.Title & " " & New_person.First_name & " " & New_person.Initiale1 & New_person.Initiale2 & New_person.Initiale3 & " " & New_person.Nameperson AS Expr1
    FROM New_person;
    Cependant cela n'insère le champ concaténé que lorsque je relance une seconde fois la requête. Pourquoi? Il faut le faire en 2 temps encore?

    En tout cas merci à tous et bonne journée

    A+

  8. #8
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    Dans la requête UPDATE, je ne rajouterai pas de ".", car si tu l'exécute plus d'une fois, tu te retrouves avec plusieurs points.
    Tu peux par exemple te contenter de convertir en majuscules :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE New_person 
    SET New_person.First_name = StrConv([First_name],3), 
    New_person.Initiale1 = StrConv(Initiale1, 1), 
    New_person.Initiale2 = StrConv(Initiale2, 1), 
    New_person.Initiale3 = StrConv(Initiale3, 1), 
    New_person.Nameperson = StrConv([Nameperson],1);
    Ensuite, si on ne s'intéresse qu'à la partie SELECT de la requête ajout de données, tu gère le cas des champs vides avec IIF:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT New_person.Title & " " & New_person.First_name & " " 
    & IIF(Len(Nz(New_person.Initiale1, ""))>0, New_person.Initiale1 & ".", "") 
    & IIF(Len(Nz(New_person.Initiale2, ""))>0, New_person.Initiale2 & ".", "")  
    & IIF(Len(Nz(New_person.Initiale3, ""))>0, New_person.Initiale3 & ".", "")  
    & " " & New_person.Nameperson AS Expr1
    FROM New_person;
    Nz sert à remplacer Null par une valeur de son choix (deuxième argument de Nz(..,..)).
    Ici c'est une chaîne vide ("").

    Si la longueur de ce qui est renvoyé par Nz(..,..) est supérieure à 0, IIF renvoie le deuxième argument (New_person.Initiale1 & "."),
    sinon IIF renvoie le troisième argument ("").

    A+

  9. #9
    Futur Membre du Club
    Inscrit en
    Mai 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    MERCI beaucoup je teste ca alors et je te tiens au courant.
    Merci encore, a+

  10. #10
    Futur Membre du Club
    Inscrit en
    Mai 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    C'est parfait ca tourne nickel...un grand merci à toi.
    A+

  11. #11
    Futur Membre du Club
    Inscrit en
    Mai 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Rebonjour,
    En fait après réflexion, j'ai changé d'idée et je souhaiterai finalement que cette expression concaténée (Expr1) soit directememt envoyé voir un champ supplémentaire nommé "Nom_complet" dans la même table "Contact".
    Cependant je n'arrive pas à ce que ce champ soit rempli dans le même enregistrement.
    J'ai utilisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT TO Contact.Nom_complet
    SELECT .... AS Expr1
    FROM Contact
    Mais dans ce cas la requête remplit le champ correspondant de l'enregistrement suivant et cela uniquement lorsque je relance la requête une seconde fois:

    Si vous pouviez m'aider merci beaucoup
    (Désolé je galère)

    Merci a +

  12. #12
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    En fait après réflexion, j'ai changé d'idée et je souhaiterai finalement que cette expression concaténée (Expr1) soit directememt envoyé voir un champ supplémentaire nommé "Nom_complet" dans la même table "Contact".
    Comme indiqué plus haut, une table n'a pas vocation à stocker des données calculées, surtout quand le calcul est aussi simple qu'ici.
    D'autre part, vous confondez Insertion et Mise à Jour. Le plus simple serait dans un premier temps de vous documenter correctement sur les notions de bases des SGBDR

    Access - Les Bases : Introduction et Conception
    Comprendre les jointures / Relations dans Access

  13. #13
    Nouveau membre du Club
    Femme Profil pro
    Chercheuse Sciences humaines
    Inscrit en
    Juillet 2014
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chercheuse Sciences humaines

    Informations forums :
    Inscription : Juillet 2014
    Messages : 33
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par LedZeppII Voir le message
    Bonjour,

    Dans la requête UPDATE, je ne rajouterai pas de ".", car si tu l'exécute plus d'une fois, tu te retrouves avec plusieurs points.
    Tu peux par exemple te contenter de convertir en majuscules :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE New_person 
    SET New_person.First_name = StrConv([First_name],3), 
    New_person.Initiale1 = StrConv(Initiale1, 1), 
    New_person.Initiale2 = StrConv(Initiale2, 1), 
    New_person.Initiale3 = StrConv(Initiale3, 1), 
    New_person.Nameperson = StrConv([Nameperson],1);
    Ensuite, si on ne s'intéresse qu'à la partie SELECT de la requête ajout de données, tu gère le cas des champs vides avec IIF:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT New_person.Title & " " & New_person.First_name & " " 
    & IIF(Len(Nz(New_person.Initiale1, ""))>0, New_person.Initiale1 & ".", "") 
    & IIF(Len(Nz(New_person.Initiale2, ""))>0, New_person.Initiale2 & ".", "")  
    & IIF(Len(Nz(New_person.Initiale3, ""))>0, New_person.Initiale3 & ".", "")  
    & " " & New_person.Nameperson AS Expr1
    FROM New_person;
    Nz sert à remplacer Null par une valeur de son choix (deuxième argument de Nz(..,..)).
    Ici c'est une chaîne vide ("").

    Si la longueur de ce qui est renvoyé par Nz(..,..) est supérieure à 0, IIF renvoie le deuxième argument (New_person.Initiale1 & "."),
    sinon IIF renvoie le troisième argument ("").

    A+
    Salut LedZeppII,
    Merci pour ce code facile à manipuler et qui marche très bien.
    Pour ceux que ça intéresse, voici mon exemple : traduction de donnée oui/non (champ booléen ) et concaténation avec les données d'un champ texte pour générer du texte intelligible en dehors de la base de données en vue d'une exportation dans un catalogue en prose. (J'espère que ça pourra aider les suivants.)

    En prose :
    Si QUAL_LOC = 0 (case non cochée),
    alors variable traduite par "Pas localisé sur le site."
    sinon "Localisation sur le site :"
    &
    Si Chaîne d'expression de LOC_FAIT est >0 (autrement dit s'il y a une donnée rentrée dans le champ)
    alors la donnée est reportée dans le résultat de la requête (précédée d'un espace et suivie d'un point)
    sinon " " = chaîne vide.

    En code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Localisation : 
    VraiFaux([TAB_FAIT_FUN]![QUAL_LOC]=0;"Pas localisé sur le site.";"Localisation sur le site :") 
    & VraiFaux(NbCar(Nz([TAB_FAIT_FUN]![LOC_FAIT];""))>0;(" " & [TAB_FAIT_FUN]![LOC_FAIT] & ".");"")
    Je suppose que les différences sont dues à une version Access en anglais ou en français (le code a été traduit par la machine alors que je l'avais rentré sur le modèle de LedZeppII).

    J'en profite pour poser la question suivante : j'ai essayé le même code avec un champ à valeurs multiples [TYPE_PERTURB] mais ça ne fonctionne pas. Est-ce qu'il y a une solution à cela ?

    VraiFaux([TAB_FAIT_FUN]![PERTURB]=0;"Pas de perturbation identifiée";"Fait perturbé :")
    &
    VraiFaux([TAB_FAIT_FUN]![TYPE_PERTURB]>0;[TAB_FAIT_FUN]![TYPE_PERTURB];"")

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 01/08/2008, 10h05
  2. Réponses: 2
    Dernier message: 17/06/2008, 00h04
  3. Réponses: 1
    Dernier message: 30/04/2008, 10h44
  4. Concaténer plusieurs champs avec des valeurs uniques
    Par stefposs dans le forum VBA Access
    Réponses: 10
    Dernier message: 30/05/2007, 17h42
  5. Réponses: 44
    Dernier message: 10/10/2006, 22h05

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