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

Requêtes et SQL. Discussion :

Ordre croissant pour un champ alpha numérique [AC-2003]


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier Avatar de pio_killer
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 194
    Points : 101
    Points
    101
    Par défaut Ordre croissant pour un champ alpha numérique
    Bonjour,

    J'ai une table "Liste" avec les champs : Nom ; Rue ; Num_de_rue
    Le champ "Num_de_rue" est au format texte car il y a des numéros alpha numérique.

    par exemple:
    Julien ; Rue de la colombe ; 3
    Pierre ; Rue de la colombe ; 5
    Jean ; Rue de la colombe ; 7
    Yves ; Rue de la colombe ; 5A
    Martin ; Rue de la colombe ; 8
    Patrick ; Rue de la colombe ; 1
    Claude ; Rue de la colombe ; 5B
    Amandine ; Rue de la colombe ; 9
    Juliette ; Rue de la colombe ; 15

    Je vaux faire une requete pour classer du plus petit numéro de rue au plus grand.

    J'ai fais la requete suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Liste.Nom, Liste.Rue, Liste.Num_de_rue
    FROM Liste
    ORDER BY Liste.Num_de_rue;
    Seulement, cela me classe comme ceci :
    Patrick ; Rue de la colombe ; 1
    Juliette ; Rue de la colombe ; 15
    Julien ; Rue de la colombe ; 3
    Pierre ; Rue de la colombe ; 5
    Yves ; Rue de la colombe ; 5A
    Claude ; Rue de la colombe ; 5B
    Jean ; Rue de la colombe ; 7
    Martin ; Rue de la colombe ; 8
    Amandine ; Rue de la colombe ; 9

    Je voudrais avoir un classement comme ceci :
    Patrick ; Rue de la colombe ; 1
    Julien ; Rue de la colombe ; 3
    Pierre ; Rue de la colombe ; 5
    Yves ; Rue de la colombe ; 5A
    Claude ; Rue de la colombe ; 5B
    Jean ; Rue de la colombe ; 7
    Martin ; Rue de la colombe ; 8
    Amandine ; Rue de la colombe ; 9
    Juliette ; Rue de la colombe ; 15

    Si quelqu'un a une idée ?

    Merci d'avance

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 184
    Points : 1 363
    Points
    1 363
    Par défaut
    En supposant qu'il n'y a qu'un caractère alphabétique au maximum, et en fin du "numéro", il faudrait faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    left('0000000000', 10- len(iif (isnumeric(right(Num, 1)), num & '0', num)) & iif (isnumeric(right(Num, 1)), num & '0', num)
    et classer sur ce calcul.
    Non testé, mais c'est l'idée.
    Si tu as un alpha, tu ne rajoutes rien, sinon, tu rajoutes un 0.
    Et ensuite, tu complètes à 10 caractères, avec des 0 à gauche.

    1 => 0000000010
    1A => 000000001A
    15 => 0000000150
    Et le classement devrait être bon.

  3. #3
    Membre régulier Avatar de pio_killer
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 194
    Points : 101
    Points
    101
    Par défaut
    Salut,

    je n'arrive pas à faire fonctione ta commande.

    J'ai supposé qu'il fallait la mettre en tant qu'expression dans une requête
    Lorsque je la met, access n'accepte pas les virgule de ta commande

    Peux-tu me dire si tu pense qu'il faut la mettre dans une fonction ou dans une requete ?

  4. #4
    Membre régulier Avatar de pio_killer
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 194
    Points : 101
    Points
    101
    Par défaut
    J'ai réussi à écrire ta commande (il manquait une parenthèse à la fin)
    Je ne connaissais pas la fonction "iif" (qui est la fonction "vraifaux" dans le générateur d'expression)

    Voici la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT Liste.Nom, Liste.Rue, Liste.Num_de_rue, Left('0000000000',10-Len(IIf(IsNumeric(Right([Liste]![Num_de_rue],1)),[Liste]![Num_de_rue] & '0',[Liste]![Num_de_rue])) & IIf(IsNumeric(Right([Liste]![Num_de_rue],1)),[Liste]![Num_de_rue] & '0',[Liste]![Num_de_rue])) AS Expr1
    FROM Liste;
    Mais cela ne marche toujours pas. Pour toutes les lignes contenant une lettre, cela marque "#Erreur".

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut
    bonjour,
    où que soit le chiffre je ferais :

    dans un module mettre la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function ExtracNum(Txt)
    Num = ""
    For i = 1 To Len(Txt)
        If IsNumeric(Mid$(Txt, i, 1)) Then
        Num = Num & Mid$(Txt, i, 1)
        End If
    Next i
    ExtracNum = Num
     
    End Function
    puis dans un champ de la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NumSeul: CEnt(ExtracNum([Num_de_rue]))
    tu mets croissant dans tri et cela devrait faire l'affaire.
    bonne continuation.

  6. #6
    Membre régulier Avatar de pio_killer
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 194
    Points : 101
    Points
    101
    Par défaut
    Merci pour ton code.

    J'ai du faire en fait 2 codes (1 pour les numéro et un pour les textes)
    J'ai mis tout ça dans une requête et ça marche super.

    Voici les 2 fonctions:
    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
    Function ExtracNum(Txt)
    Num = ""
    For i = 1 To Len(Txt)
        If IsNumeric(Mid$(Txt, i, 1)) Then
        Num = Num & Mid$(Txt, i, 1)
        End If
    Next i
    ExtracNum = Num
     
    End Function
    Function ExtracText(Txt)
    Num = ""
    For i = 1 To Len(Txt)
        If Not IsNumeric(Mid$(Txt, i, 1)) Then
        Num = Num & Mid$(Txt, i, 1)
        End If
    Next i
    ExtracText = Num
     
    End Function
    Voici la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT CInt(ExtracNum([Num_de_rue])) AS NumSeul, ExtracText([Num_de_rue]) AS TextSeul
    FROM Liste
    ORDER BY CInt(ExtracNum([Num_de_rue])), ExtracText([Num_de_rue]);
    Seul hic, c'est trop long.

    En fait ma table a plus de 15000 enregistrements.
    Alors qu'avec la commande du dessus, c'est quasiment instantané.

    Dommage car ce code marche impec

    Pour la 1ère commande, j'ai cherché et je ne sais pas pourquoi il me met en erreur lorsqu'il y a du texte

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut
    re,
    Pour la 1ère commande, j'ai cherché et je ne sais pas pourquoi il me met en erreur lorsqu'il y a du texte
    qu'entends tu par 1ere commande et c'est long
    quel type d'erreur, en laissant la colonne de base dans ta requête elle devrait être classée dans l'ordre quand à la durée je ne vois pas 15 000 enregistrements c'est pas énorme.

  8. #8
    Membre régulier Avatar de pio_killer
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 194
    Points : 101
    Points
    101
    Par défaut
    La 1ère commande est celle donnée par Kloun au début du topic
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    left('0000000000', 10- len(iif (isnumeric(right(Num, 1)), num & '0', num)) & iif (isnumeric(right(Num, 1)), num & '0', num))
    L'erreur qui apparait est que la requête se termine mais pour toutes les lignes contenant une lettre, dans la cellule, il y a marqué #ERREUR.
    Je crois savoir que cela fait cela lorsque access n'arrive pas à calculer

    Voici la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Liste.Nom, Liste.Rue, Liste.Num_de_rue, Left('0000000000',10-Len(IIf(IsNumeric(Right([Liste]![Num_de_rue],1)),[Liste]![Num_de_rue] & '0',[Liste]![Num_de_rue])) & IIf(IsNumeric(Right([Liste]![Num_de_rue],1)),[Liste]![Num_de_rue] & '0',[Liste]![Num_de_rue])) AS Expr1
    FROM Liste
    ORDER BY Liste.Num_de_rue;
    J'ai joint une capture du résultat

    Quand je dit c'est long, c'est en temps (cela m'a mis près de 2 minute)
    Cela m'embête car cette requête fais partie d'une plus grosse requête qui est longue (car elle lance plusieurs requêtes à la suite y compris celle-ci)

    C'est vrai que 15000 enregistrements, c'est pas énorme mais c'est quand même un calcul très long. Peut-être qu'il y a quelque chose que j'ai oublié de faire ?

  9. #9
    Membre régulier Avatar de pio_killer
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 194
    Points : 101
    Points
    101
    Par défaut
    je suis vraiment bloqué.

    J'essaye de trouver une autre solution mais sans suuccès.

  10. #10
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 184
    Points : 1 363
    Points
    1 363
    Par défaut
    Essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Nom, Rue, Num_de_rue, Left('0000000000',10-Len(IIf(IsNumeric(Right(trim(Num_de_rue),1)),trim(Num_de_rue) & '0',trim(Num_de_rue))) & IIf(IsNumeric(Right(trim(Num_de_rue),1)),trim(Num_de_rue) & '0',trim(Num_de_rue))) AS Test, 
    IIf(IsNumeric(Right(trim(Num_de_rue),1)),trim(Num_de_rue) & '0',trim(Num_de_rue)) as TestSimple
    FROM Liste
    ORDER BY Num_de_rue

  11. #11
    Membre régulier Avatar de pio_killer
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 194
    Points : 101
    Points
    101
    Par défaut
    je te remercie encore

    ça marche mais à moitié. Cela ne fait pas le classement comme voulu.

    J'ai réessayé le code avec la fonction en vba et, je ne sais pas porquoi, cela prend maintenant 2 secondes . (peut-être que lorsque j'ai essayé, il y a avait un problème réseau au boulot)

    Je vais donc essayer avec cette méthode.

  12. #12
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 184
    Points : 1 363
    Points
    1 363
    Par défaut
    Citation Envoyé par pio_killer Voir le message
    Cela ne fait pas le classement comme voulu.
    BEn oui, tu as laissé le ORDER BY Num_de_rue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Nom, Rue, Num_de_rue, Left('0000000000',10-Len(IIf(IsNumeric(Right(trim(Num_de_rue),1)),trim(Num_de_rue) & '0',trim(Num_de_rue))) & IIf(IsNumeric(Right(trim(Num_de_rue),1)),trim(Num_de_rue) & '0',trim(Num_de_rue))) AS Test, 
    IIf(IsNumeric(Right(trim(Num_de_rue),1)),trim(Num_de_rue) & '0',trim(Num_de_rue)) as TestSimple
    FROM Liste
    ORDER BY Left('0000000000',10-Len(IIf(IsNumeric(Right(trim(Num_de_rue),1)),trim(Num_de_rue) & '0',trim(Num_de_rue))) & IIf(IsNumeric(Right(trim(Num_de_rue),1)),trim(Num_de_rue) & '0',trim(Num_de_rue)))

  13. #13
    Membre régulier Avatar de pio_killer
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 194
    Points : 101
    Points
    101
    Par défaut
    En fait, ton champ "test simple" marche, pas le champ "test".
    Lorsque je fais un classement sur "test", j'ai le message "data type mismatch in criteria expression".
    Dans le résultat, il y a toujours l'erreur (voir capture)

    Mais lorsque je fais un tri sur "test simple", la requête se fait mais le classement est mauvais

  14. #14
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 184
    Points : 1 363
    Points
    1 363
    Par défaut
    On avance.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Nom, Rue, Num_de_rue, 
    Left('0000000000',10 - Len(IIf(IsNumeric(Right(trim(Num_de_rue),1)),trim(Num_de_rue) & '0',trim(Num_de_rue)))) & IIf(IsNumeric(Right(trim(Num_de_rue),1)),trim(Num_de_rue) & '0',trim(Num_de_rue)) AS Test, 
    IIf(IsNumeric(Right(trim(Num_de_rue),1)),trim(Num_de_rue) & '0',trim(Num_de_rue)) as TestSimple
    FROM Liste
    order by Left('0000000000',10 - Len(IIf(IsNumeric(Right(trim(Num_de_rue),1)),trim(Num_de_rue) & '0',trim(Num_de_rue)))) & IIf(IsNumeric(Right(trim(Num_de_rue),1)),trim(Num_de_rue) & '0',trim(Num_de_rue))
    Une parenthèse était mal placée.

  15. #15
    Membre régulier Avatar de pio_killer
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 194
    Points : 101
    Points
    101
    Par défaut
    Impec

    Ca marche super bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Nom, Rue, Num_de_rue, 
    Left('0000000000',10 - Len(IIf(IsNumeric(Right(trim(Num_de_rue),1)),trim(Num_de_rue) & '0',trim(Num_de_rue)))) & IIf(IsNumeric(Right(trim(Num_de_rue),1)),trim(Num_de_rue) & '0',trim(Num_de_rue)) AS Test, 
    IIf(IsNumeric(Right(trim(Num_de_rue),1)),trim(Num_de_rue) & '0',trim(Num_de_rue)) as TestSimple
    FROM Liste
    order by Left('0000000000',10 - Len(IIf(IsNumeric(Right(trim(Num_de_rue),1)),trim(Num_de_rue) & '0',trim(Num_de_rue)))) & IIf(IsNumeric(Right(trim(Num_de_rue),1)),trim(Num_de_rue) & '0',trim(Num_de_rue))
    Ta commande marche super bien et me convient.

    Par contre, pour le code de LE VIEUX...

    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 ExtracNum(Txt)
    Num = ""
    For i = 1 To Len(Txt)
        If IsNumeric(Mid$(Txt, i, 1)) Then
        Num = Num & Mid$(Txt, i, 1)
        End If
    Next i
    ExtracNum = Num
     
    End Function
    Function ExtracText(Txt)
    Num = ""
    For i = 1 To Len(Txt)
        If Not IsNumeric(Mid$(Txt, i, 1)) Then
        Num = Num & Mid$(Txt, i, 1)
        End If
    Next i
    ExtracText = Num
     
    End Function
     
    SELECT CInt(ExtracNum([Num_de_rue])) AS NumSeul, ExtracText([Num_de_rue]) AS TextSeul
    FROM Liste
    ORDER BY CInt(ExtracNum([Num_de_rue])), ExtracText([Num_de_rue]);
    ... en fait, j'ai dit que cela marchait bien, mais j'avais oublié de mettre le tri par ordre croissant dans mon test avec plus de 15000 enregistrements, ce qui augmente considérablement le temp de calcul.


    Merci encore de votre aide

  16. #16
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    bjr,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    order by format([num],"0000")
    ça devrait suffire non?

  17. #17
    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 : 41
    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
    Citation Envoyé par Arkham46 Voir le message
    bjr,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    order by format([num],"0000")
    ça devrait suffire non?
    Format("5B","0000") retourne 5B et non 005B

    Du coup, je propose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT  Nom, Rue, NumRue
    FROM Adresses
    ORDER BY  Rue, Val(NumRue), NumRue
    Le premier tri sur la rue, le deuxième sur la partie numérique, le troisième sur l'alphanumérique pour les num rue ayant le même numéro

  18. #18
    Membre régulier Avatar de pio_killer
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 194
    Points : 101
    Points
    101
    Par défaut
    trop cool

    c'est encore plus rapide avec ton code Tofalu

    Si je comprend bien, access tri d'abord numériquement avec Cnum (ce qui met par exemple le 10 après le 9), et ensuite alphabétique (pour trier par exemple 5A puis 5B)

    Merci encore

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

Discussions similaires

  1. Un écouteur pour les touches alpha-numérique
    Par ChPr dans le forum Android
    Réponses: 1
    Dernier message: 23/11/2014, 20h55
  2. incrémenter un champ alpha-numérique ?
    Par niamo dans le forum IHM
    Réponses: 2
    Dernier message: 02/06/2010, 09h56
  3. ajouter un champ alpha numérique
    Par merocean dans le forum Access
    Réponses: 11
    Dernier message: 18/01/2007, 13h18
  4. format personalisé pour un champ numérique
    Par tzinzin dans le forum Access
    Réponses: 2
    Dernier message: 29/03/2006, 16h56
  5. Ordonner ds l'ordre croissant de 2 champs confondus
    Par Coolbens dans le forum Langage SQL
    Réponses: 11
    Dernier message: 17/06/2003, 16h39

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