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

ALM Discussion :

ordonner simplement une liste de référence ne suivant pas l'ordre alphabétique


Sujet :

ALM

  1. #1
    Membre habitué
    Avatar de martinbrait
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Points : 131
    Points
    131
    Par défaut ordonner simplement une liste de référence ne suivant pas l'ordre alphabétique
    Bonjour,

    Parfois, le gestionnaire veut ordonner à sa façon, une liste dans un combobox, ou un état, sans rapport avec l'ordre numérique ou l'ordre alphabétique.

    Je vous propose une méthode simple de ma préférence, pour personnaliser le classement d'une liste de référence, sans ajout de colonne supplémentaire.

    J'aime préfixer directement un numéro, devant chaque valeur figurant dans ma colonne des clefs métier.
    Dans un champ de formulaire, j'affiche ma référence clef métier, ôtée de son numéro d'ordre de tri (premier caractère à gauche),
    Dans un tri ascendant-descendant, j'utilise intégralement la valeur de ma référence clef métier, dans mon instruction order by.
    Prenons l'exemple de la table tr_grade_tgd2 ci-dessous :

    Dans un champ de formulaire...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select Right(cgd,Len(cgd)-1)As CodeGrade from tr_grade_tgd2
    Dans un tri ascendant-descendant...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select lgd from tr_grade_tgd2
    order by cgd desc

    Nom : liste_reference_atrier.PNG
Affichages : 388
Taille : 8,2 Ko

    Avec le fruit de votre expérience, avez-vous une idée plus efficace ?

  2. #2
    Invité
    Invité(e)
    Par défaut Quand on a deux idées à exprimer, on fait deux phrases
    Mes mnémoniques de colonnes ne devraient jamais dépasser 7 caractères. J'y ajoute systématiquement la désignation en clair (dans la légende, sous access, ou en description, pour les autres SGBD).
    Je tiens à mes préfixes devant chaque mnémonique de colonne. Je préfixe systématiquement mes noms de colonnes de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    t_ : type texte
    n_ : type numérique
    m_ : type mémo
    d_ : type date
    h_ : type timestamp
    Ainsi, lors notamment de requêtes depuis des sources externes, je ne me pose pas 36 questions à enquêter sur la concordance de type entre la colonne source et la colonne cible.
    J'aime préfixer directement un numéro devant chaque valeur pour personnaliser le classement d'une liste de référence sans ajout de colonne supplémentaire.

    Avec le fruit de votre expérience, avez-vous une idée plus efficace ?
    Oui… Changer tes habitudes qui interrogent et font craindre le pire.

    En littérature administrative, il y a une règle qui dit :

    « quand on a deux idées à exprimer, on fait deux phrases ».

    C’est vrai également en informatique, notamment pour les BDD. Un attribut constitué d'un ordre de tri concaténé à un libellé, c'est une aberration et contraire aux principes des Bases de Données.

    Fonctionnaire, j’ai utilisé une table des grades pendant 40 ans. À chaque libellé correspond un code et pour répondre à des besoins applicatifs, il suffit d’enrichir la table avec d’autres codes, types… et un flag ; mais il ne s’agit sûrement pas de dénaturer un libellé en lui adjoignant un ordre de tri.

    Table des grades :

    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
    { gr    (grades) --------------------------------------------------------------}
    
    create table gr
    (
    c_gr             char(4)  not null, { code grade                               }
    m_gr             char(10) not null, { mnémonique grade                         }
    l_gr             char(30) not null, { libellé grade                            }
    l_gr_maj         char(38) not null, { libellé grade en majuscules              }
    l_gr_min         char(50) not null, { libellé grade en minuscules              }
    c_bdd            char(1),           { code BDD [A]dministratifs/[E]nseignants  }
    categorie        char(1),           { [A]/[B]/[C]                              }
    ordre_paiement   char(1)  not null, { [O]/[N]                                  }
    sous_couvert     char(1)  not null, { null/[N]on                               }
    c_sa             char(2),           { code situation administrative            }
    c_gf_a           char(2),           { code grade-fonction administratifs       }
    c_gf_e           char(2),           { code grade-fonction enseignants          }
    t_gr             char(1),           { typologie grades                         }
    t_pf             char(1),           { typologie personnels                     }
    flag             char(1)            { null/[-]                                 }
    ) ;
    Un sql pour flaguer les grades :

    Il s’agit de flaguer les grades (gr) des personnels formation (pf) ayant candidaté (cf) à des formations de l’administration (cf.c_bdd = "A").

    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
    {------------------------------------------------------------------------------}
    {
    flag_gr.sql
    }
    {------------------------------------------------------------------------------}
    
    select unique
           pf.c_gr
    from   pf,
           cf
    where  cf.c_bdd = "A"
    and    cf.n_pf = pf.n_pf
    into temp t0;
    
    update gr
    set    gr.flag = null
    where  gr.flag is not null;
    
    update gr
    set    gr.flag = "-"
    where  gr.c_gr = (select t0.c_gr
                      from   t0
                      where  t0.c_gr = gr.c_gr);
    
    {------------------------------------------------------------------------------}
    Petite citation à méditer :

    « La simplicité, c’est une lumière qui séduit l’âme » - Daniel Schneiderman
    Dernière modification par Invité ; 08/11/2018 à 16h30.

  3. #3
    Membre habitué
    Avatar de martinbrait
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Points : 131
    Points
    131
    Par défaut
    Bonjour IFA2377,

    J'aime beaucoup votre solution,
    qui me semble, de loin, beaucoup plus explicite,
    que mes désormais lointaines mauvaises combines....
    M E R C I !!!

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Il vaut effectivement mieux créer une colonne pour enregistrer l'ordre "logique" ou "classique" ou normalisé en interne.

    Il y a aussi une astuce en SQL pour mettre en avant certaines valeurs les plus utilisées.
    Par exemple, si les pays principaux sont, dans l'ordre, la France, l'Espagne puis l'Allemagne, on peut faire ceci :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT pay_id, pay_code, pay_nom_francais
    FROM tr_pays_pay
    ORDER BY 
    	CASE pay_code
    		WHEN 'F' THEN 1
    		WHEN 'E' THEN 2
    		WHEN 'D' THEN 3
    		ELSE 1000
    	END,
    	pay_nom_francais

    Si besoin d'ajouter un 4ème pays à mettre en priorité dans la liste, il suffit d'ajouter une ligne de SQL dans le CASE et on peu même facilement changer l'ordre.
    Si on met ça dans une vue, toutes les applications qui utilisent la référence des pays seront instantanément impactées par la modif.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre habitué
    Avatar de martinbrait
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Points : 131
    Points
    131
    Par défaut
    Bonsoir Cinéphil !

    Citation Envoyé par Cinéphil
    ...créer une colonne pour enregistrer l'ordre "logique" ou "classique" ou normalisé en interne...
    Je prends bien note, c'est désormais acquis !

    J'aime beaucoup la suggestion sql avec l'order by de secours,
    qui fait entrevoir une issue, en cas de force majeure.

    Problème résolu

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/09/2018, 00h50
  2. [XL-2007] Choix d'une liste dans un CB suivant la feuille active
    Par magnum812 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 13/01/2017, 17h05
  3. [XL-2010] Copie une cellule par rapport a un une liste de référence.
    Par zergo dans le forum Excel
    Réponses: 2
    Dernier message: 19/12/2016, 12h19
  4. Réponses: 6
    Dernier message: 07/11/2014, 08h06
  5. Problème : faire une liste de références
    Par blinxsweeper dans le forum C#
    Réponses: 6
    Dernier message: 28/02/2008, 17h33

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