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

IHM Discussion :

remplacement caractères accentués dans une table


Sujet :

IHM

  1. #1
    Invité
    Invité(e)
    Par défaut remplacement caractères accentués dans une table
    bonjour à tous,

    je mets régulièrement à jour des tables à partir de fichiers Excel collectés dans différents services de la société. Ces tables contiennent les identités de différentes catégories d'employés, et donc un turn over régulier qui impose ces mises à jour.
    Le problème est que ces noms et prénoms contiennent des caractères accentués qui gênent la fonction "auto complète" d'une liste déroulante dans un form de saisie.
    J'ai bien sûr trouvé ici quelques fonctions se rapprochant de ma problématique et un article intéressant sur les regex, mais c'est vraiment trop hard pour mes neurones.

    A l'ouverture de ce formulaire chaque table est importée dans une table temporaire contenant toutes ces identités via plusieurs requêtes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sql = "INSERT INTO Tbl_TempEmployes( Identite ,Qualite ) SELECT Identite, Qualite FROM SrvEntretien ;"
    DoCmd.RunSQL sql
    sql = "INSERT INTO Tbl_TempEmployes( Identite ,Qualite ) SELECT Identite, Qualite FROM SrvMaintenance;"
    DoCmd.RunSQL sql
    sql = "INSERT INTO Tbl_TempEmployes( Identite ,Qualite ) SELECT Identite, Qualite FROM SrvDRH;"
    DoCmd.RunSQL sql
    etc.....
    Après ces importations, comment puis-je remplacer automatiquement les caractères accentués avec un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    identite = Replace(identite, "é", "e")
    PS : les identités sont une concaténation Nom/Prenom.

  2. #2
    Membre expérimenté Avatar de Gabout
    Homme Profil pro
    Utilisateur autodidacte
    Inscrit en
    Mai 2006
    Messages
    1 404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Utilisateur autodidacte

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 404
    Points : 1 683
    Points
    1 683
    Par défaut
    Bonjour,

    La réponse se trouve, comme bien souvent dans la ici.

    A+
    Gabout

  3. #3
    Invité
    Invité(e)
    Par défaut
    merci Gabout,

    dans un 1er temps, j'ai pu filtrer la source du form comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RecordSource = "SELECT * FROM employes WHERE identite like ""*é*"" ;"
    ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     identite = Replace(identite, "é", "e")
    remplace bien le "é" par un "e" mais uniquement sur le 1er enregistrement
    Dernière modification par Invité ; 08/11/2008 à 20h06.

  4. #4
    Membre confirmé Avatar de ypicot
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    412
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 412
    Points : 579
    Points
    579
    Par défaut
    Tu peux passer par de l'itératif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    rst = OpenRecordSet (...)
    Do While Not rst.EOF
      Identite = rst("Identite")
      Identite = replace(Identite, "é", "e")
      Identite = replace(Identite, "è", "e")
      ...
      rst("Identite") = Identite
    Loop
    Je te laisse ajouter les .update, modifier si tu utilises l'ADO, ...

    Yvan
    Une solution n'est valable que dans un contexte donné

  5. #5
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    Tu pourrais tout "simplement"
    1- te faire une fonction de remplacement. Par exemple, quelque chose comme cela :
    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
    Function CleanAccents(ByVal myChaine As String) As String
        Dim lngNum  As Long     'numéro du caractère en cours de traitement
        Dim blnMaj  As Boolean  'VRAI si le caractère sélectionné est en majuscule
        For lngNum = 1 To Len(myChaine)
            blnMaj = Asc(UCase(Mid(myChaine, lngNum, 1))) = Asc(Mid(myChaine, lngNum, 1))
            Select Case LCase(Mid(myChaine, lngNum, 1))
                Case "à", "â", "ä"              'tous les a accentués
                    Mid(myChaine, lngNum, 1) = IIf(blnMaj, "A", "a")
                Case "é", "è", "ê", "ë"         'tous les e accentués
                    Mid(myChaine, lngNum, 1) = IIf(blnMaj, "E", "e")
                Case "î", "ï"                   'tous les i accentués
                    Mid(myChaine, lngNum, 1) = IIf(blnMaj, "I", "i")
                Case "ô", "ö"                   'tous les o accentués
                    Mid(myChaine, lngNum, 1) = IIf(blnMaj, "O", "o")
                Case "ù", "û", "ü"              'tous les u accentués
                    Mid(myChaine, lngNum, 1) = IIf(blnMaj, "U", "u")
                Case "ÿ"                        'tous les y accentués
                    Mid(myChaine, lngNum, 1) = IIf(blnMaj, "Y", "y")
                Case Else                       'sinon
                    'rien à faire
            End Select
        Next
        CleanAccents = myChaine
    End Function
    2-Et ensuite, en une simple requête de mise à jour modifier d'un coup tous tes champs sans itération.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Merci à tous les deux, je vais essayer de me dépatouiller avec les 2 solutions proposées, je vous tiens au courant.

  7. #7
    Membre confirmé Avatar de ypicot
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    412
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 412
    Points : 579
    Points
    579
    Par défaut
    Maxence, si je puis me permettre, il manque le "ç".

    Yvan
    Une solution n'est valable que dans un contexte donné

  8. #8
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut

    Tu peux
    Mais, comme il n'a parlé que des caractères accentués ...

  9. #9
    Invité
    Invité(e)
    Par défaut
    bonjour tous,
    alors j'ai commencé par la proposition de YPICOT qui me semblait plus simple et j'ai mis ce code dans mon form après les rqt d'insertion pour que la table soit remplie.
    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
    Sub DAOOpenRecordset()
    Dim rst As DAO.Recordset
    rst = OpenRecordset(Tbl_TempEmployes)
    Do While Not rst.EOF
    identite = rst("Identite")
    identite = Replace(identite, "à", "a")
    identite = Replace(identite, "ä", "a")
    identite = Replace(identite, "â", "a")
    identite = Replace(identite, "é", "e")
    identite = Replace(identite, "è", "e")
    identite = Replace(identite, "ë", "e")
    identite = Replace(identite, "ê", "e")
    identite = Replace(identite, "î", "i")
    identite = Replace(identite, "ï", "i")
    identite = Replace(identite, "ô", "o")
    identite = Replace(identite, "ö", "o")
    identite = Replace(identite, "ù", "u")
    identite = Replace(identite, "ü", "u")
    identite = Replace(identite, "û", "u")
    identite = Replace(identite, "ÿ", "y")
    rst("Identite") = identite
    Loop
    rst.Close
    End Sub
    A l'ouverture du form : pas d'erreur, mais pas de correction des accents non plus.
    Quand je fais un déboguage du code ça me dit :
    "Erreur de compilation / Sub ou Function non définie"

  10. #10
    Membre confirmé Avatar de ypicot
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    412
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 412
    Points : 579
    Points
    579
    Par défaut
    Plusieurs lignes sont à corriger (je ne connais pas ton niveau en VBA, donc je n'avais donné que les grandes lignes) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    rst = CurrentDb.OpenRecordset("Tbl_TempEmployes")
    do while ...
      Identite = rst(...)
      ...
      rst.Edit
      rst("Identite") = Identite
      rst.Update
      rst.MoveNext
    Loop
    ...
    Contrairement aux apparences, la fonction de Maxence n'est pas forcément plus complexe.

    Yvan
    Une solution n'est valable que dans un contexte donné

  11. #11
    Invité
    Invité(e)
    Par défaut
    merci Yvan,
    j'ai un petit niveau, je me débrouille à peu pres pour manier les requêtes en vba... filtrages ça va aussi, j'ai réussi à me faire un form de recherche tout seul avec cases à cocher et combos... mais alors quand j'entends parler de recordset...
    C'est un truc sur lequel je fais un blocage ! Je me suis imprimé et infusé l'article de Warin sur les recordsets, mais j'y reste hermétique.
    J'ai collé ici le code de mon form si tu peux me mettre les explications en commentaires ça serait super.
    J'ai compris qu'on ouvre un recordset en DAO qui est bien declare dans les references, on déclare les variables CurrentDb et Rst.
    On ouvre le jeu d'enregistrement de la table désignée.
    on crée une boucle "tant que..."
    on remplace mais après..... ???
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    Private Sub Form_Open(Cancel As Integer)
     
    DoCmd.Maximize
     
    Dim sql As String
     
    sql = "INSERT INTO Tbl_TempEmployes ( Identite, Qualite, Poste )SELECT Identite, Qualite, Poste FROM TblClim;"
    DoCmd.RunSQL sql
    sql = "INSERT INTO Tbl_TempEmployes ( Identite, Qualite, Poste )SELECT Identite, Qualite, Poste FROM TblElec;"
    DoCmd.RunSQL sql
    sql = "INSERT INTO Tbl_TempEmployes ( Identite, Qualite, Poste )SELECT Identite, Qualite, Poste FROM TblPlom;"
    DoCmd.RunSQL sql
    '..... etc
     
    RecordSource = "SELECT Identite, Qualite,Poste  FROM Tbl_TempEmployes order by Identite;"
     
    ChoixQualite.RowSource = "SELECT Qualite FROM Tbl_TempEmployes group by Qualite;"
     
    End Sub
     
     
    Sub DAOOpenRecordset()
    Dim CurrentDb As DAO.Database
    Dim rst As DAO.Recordset
    rst = CurrentDb.OpenRecordset("Tbl_TempEmployes")
    Do While Not rst.EOF
    identite = rst("Identite")
    identite = Replace(identite, "à", "a")
    identite = Replace(identite, "ä", "a")
    identite = Replace(identite, "â", "a")
    identite = Replace(identite, "é", "e")
    identite = Replace(identite, "è", "e")
    identite = Replace(identite, "ë", "e")
    identite = Replace(identite, "ê", "e")
    identite = Replace(identite, "î", "i")
    identite = Replace(identite, "ï", "i")
    identite = Replace(identite, "ô", "o")
    identite = Replace(identite, "ö", "o")
    identite = Replace(identite, "ù", "u")
    identite = Replace(identite, "ü", "u")
    identite = Replace(identite, "û", "u")
    identite = Replace(identite, "ÿ", "y")
    rst.Edit
    rst("Identite") = identite
    rst.Update
    rst.MoveNext
    Loop
    rst.Close
    End Sub
    Dernière modification par Invité ; 11/11/2008 à 18h34.

  12. #12
    Membre confirmé Avatar de ypicot
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    412
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 412
    Points : 579
    Points
    579
    Par défaut
    - Vire le Dim CurrentDb : CurrentDb est une fonction qui retourne la base de données active
    - Fait un Dim Identite As Variant (si tu mets un String, ca va planter si tu as un Null)
    - N'oublie pas le Option Explicit
    - Indente ton code, ca sera beaucoup plus lisible.

    Yvan
    Une solution n'est valable que dans un contexte donné

Discussions similaires

  1. [MySQL] Transformation des caractères accentués dans une table
    Par betadev dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 06/01/2012, 11h58
  2. Réponses: 3
    Dernier message: 25/02/2009, 15h59
  3. Remplacer les caractères accentués dans une chaine
    Par shaun_the_sheep dans le forum Général Java
    Réponses: 5
    Dernier message: 07/05/2008, 10h41
  4. Réponses: 2
    Dernier message: 08/08/2007, 15h32
  5. Réponses: 4
    Dernier message: 10/04/2007, 11h10

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