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 :

Concatenation caractére [Toutes versions]


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juillet 2010
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2010
    Messages : 142
    Par défaut Concatenation caractére
    Bonjour,
    Je reviens vers le forum pour demander de l'aide à propos du codage d'une logique que je voudrais implementer dans ma BD.

    Je dispose d'une table qui a comme clé primaire un champs nommé : Code.
    Ce code la est generé grace à une requete SQL (via VBA) qui me permet de concatener les 2 derniere chaine de caractére de certains colonnes.

    Le probleme, est qu'il se peut qu'il y ai des clés primaire identique sur plusieurs ligne, la seule difference entre les 2 lignes (que je deduis) est qu'il y a forcement des valeurs non identique dans d'autres colonne.
    J'explique ceci dans cette structure :
    _________________________
    |Code|Nom|Ville|Pays|Valeur|
    **********************
    |obisce|Bob|Paris|France|100|
    |obisce|Bob|Paris|France|200|
    |iameie|Lilia|Rome|Italie|400|
    |omrere|Tom|Londre|Angleterre|200|
    |omrere|Tom|Londre|Angleterre|800|
    |omrere|Tom|Londre|Angleterre|700|
    ****************************

    Ce que je souhaiterais faire, dans la limite du possible, c'est que à l'aide de VBA, pouvoir faire ceci :
    Si des codes sont identiques, concatener à ces codes 1 & 2 & 3respectivement (ou A & B.. qu'importe), de façon à n'avoir vraiment que des clés primaire unique.

    En sachant que mon champs [Code] est de type Texte.
    Pour pouvoir avoir à la fin :
    _________________________
    |Code|Nom|Ville|Pays|Valeur|
    **********************
    |obisce1|Bob|Paris|France|100|
    |obisce2|Bob|Paris|France|200|
    |iameie|Lilia|Rome|Italie|400|
    |omrere1|Tom|Londre|Angleterre|200|
    |omrere2|Tom|Londre|Angleterre|200|
    |omrere3|Tom|Londre|Angleterre|200|
    ****************************

    J'effectue actuellement une repartition d'une table sur plusieurs table, mais pour l'instant, j'ai juste ajouté un champs NumeroAuto qui me permet d'avoir une clé primaire, et ce n'est vraiment pas evident, je dois penser à implementer une clé primaire double ... etc trop de bizzarerie. Cette methode est plus esthetique et plus maniable !


    Voila !

  2. #2
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Salut,

    Tu pourrais adopter la structure suivante:
    obisce_1
    obisce_2
    etc..
    tu fais une requête pour récupérer tous les codes commençant par obisce, dans une colonne tu split les codes par rapport au _, tu récupère ainsi la partie numérique, sur laquelle du applique un ORDER BY DESC, et tu fait un TOP 1 pour récupérer la valeur la plus haute. Tu peux alors calculer la prochaine valeur à utiliser pour le code suivant.
    Style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select top 1 split(code, "_")(1) as valeur
    from LaTable
    order by valeur desc
    A creuser...(je ne suis pas sur que la fonction split() puisse s'utiliser comme ça dans une requête sql, faut voir...)

    Cordialement,

  3. #3
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juillet 2010
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2010
    Messages : 142
    Par défaut
    Salut,

    Je te remercie tout dabors pour ta reponse Philippe PONS.

    Par contre, je ne sais pas si ce que tu m'a proposé soit fonctionnel. J'ai essayé, ceci ne fonctionne pas vraiment ...

    [EDIT]
    Avec un peu de reflexion, j'ai pu developper ceci :
    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
    Sub concatCode()
    Set rst = db.OpenRecordset("SELECT Code, Count(Code) as n FROM Ville GROUP BY Code")
    Do
        For i = 1 To 10
            If rst.Fields("n") > 1 Then
                rst.Edit
                    rst.Fields("Code") = rst.Fields("Code") & "_" & i
                rst.Update
            End If
        Next i
        rst.MoveNext
    Loop Until rst.EOF
    rst.Close
    MsgBox "Good Very Good"
    End Sub
    Mais, comme à la majorité du temps, des erreurs s'imposent :
    Erreur 3027 : Mode lecture seul.


    Des propositions ?

  4. #4
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Bonjour,

    Oui, la fonction Split() n'est pas utilisable dans une requête sql.

    Par contre, tu peux récupérer l'indice max avec la requête suivante, que je vien de tester:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TOP 1 Right([COD],Len([COD])-InStr(1,[COD],"_")) AS MAX_VAL
    FROM VILLE
    ORDER BY Right([COD],Len([COD])-InStr(1,[COD],"_")) DESC;
    Cordialement,

  5. #5
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juillet 2010
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2010
    Messages : 142
    Par défaut
    Citation Envoyé par Philippe PONS Voir le message
    Bonjour,

    Oui, la fonction Split() n'est pas utilisable dans une requête sql.

    Par contre, tu peux récupérer l'indice max avec la requête suivante, que je vien de tester:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TOP 1 Right([COD],Len([COD])-InStr(1,[COD],"_")) AS MAX_VAL
    FROM VILLE
    ORDER BY Right([COD],Len([COD])-InStr(1,[COD],"_")) DESC;
    Cordialement,
    J'ai pas compris l'utilité de cette requete, je viens de la tester, elle me permet de renvoyer la valeur maximal de la colonne CODE ...
    Comment l'implementer à mon code?

    Actuellement, je veux mettre en place une procedure qui me permettera de modifier la colonne PCS. Cette fonction va chercher les doublons et faire la modification decrite plus haut.

  6. #6
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Ok, il manque un critère de filtrage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT TOP 1 Right([COD],Len([COD])-InStr(1,[COD],"_")) AS MAX_VAL
    FROM VILLE
    WHERE Left([COD],InStr(1,[COD],"_")-1)="obisce"
    ORDER BY Right([COD],Len([COD])-InStr(1,[COD],"_")) DESC;
    en remplaçant "obisce" par la racine de ta clé.

    Après,tu récupères donc la valeur max du suffixe de la racine de clé concernée, et ça te permet de construire la valeur de la prochaine clé.

    Je ne sais pas comment est ton code, donc je ne peux pas te dire comment implanter cette requête

    Cordialement,

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

Discussions similaires

  1. Concatenation de chaine de caractère.
    Par alexglvr dans le forum Débuter
    Réponses: 2
    Dernier message: 24/01/2009, 14h04
  2. Réponses: 11
    Dernier message: 03/09/2008, 10h41
  3. [SQL] : Concatener des chaines de caractères
    Par basto dans le forum VBA Access
    Réponses: 2
    Dernier message: 30/04/2007, 16h47
  4. concatener chaine de caractère
    Par 88-FFX-88 dans le forum C++
    Réponses: 2
    Dernier message: 24/03/2007, 10h48
  5. [C++.net]Concatener des chaines de caractère
    Par Dlyan dans le forum MFC
    Réponses: 3
    Dernier message: 27/03/2006, 15h25

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