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

Modélisation Discussion :

Numérotation Personnalisée à plusieurs niveaux


Sujet :

Modélisation

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Mai 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2014
    Messages : 7
    Points : 9
    Points
    9
    Par défaut Numérotation Personnalisée à plusieurs niveaux
    Bonjour à tous,

    J'ai déjà vu de nombreux sujets concernant mon problème mais aucun n'a permis d'y répondre..

    Je vous expose le problème. Je cherche à construire une base de données servant à la résolution d'incidents rencontrés. Les Cas sont recensés dans la table T_Cas et sont classés en Sous-Catégories (qui sont elles dans la table T_Sous_Categorie). Ces Sous-Catégories sont elles même regroupées en Catégories qui sont référencées dans la table T_Categorie.

    Mes Catégories ont leur identifiant en NumAuto. Mon objectif est d'avoir une codification précise pour pouvoir extraire des statistiques par la suite.
    Je souhaite donc que la clé primaire de mes sous-catégories soit du type [N°Catégorie](sous-entendu à laquelle la sous-catégorie est rattachée) puis un numéro qui se met en automatique à partir de 1. Par exemple pour la première Sous-Catégorie rattachée à la Catégorie 1, la clé primaire serait 1.1

    Il faut refaire cela avec les Cas du type 1.1.3 pour le cas N°3 de la Sous-Catégorie 1 de la Catégorie 1. Mais bon, si on arrive à le faire déjà pour les sous-catégories, j'imagine que cela facilitera la manipulation pour les Cas..

    Je ne sais pas comment faire cela, pour tout vous dire je n'en ais aucune idée même. Est-ce que je peux le faire dans les paramètres du champs dans la table ou alors par Requête (je ne connais rien au VBA) ou est-ce que je peut laisser la numérotation en NumAuto et rajouter un Champs Calculé à ma table..
    Je ne sais pas et j'implore votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    Bonjour et bienvenue,


    Mon objectif est d'avoir une codification précise pour pouvoir extraire des statistiques par la suite.

    Si tu as un modèle de ce type



    quel est ton problème ?

    Que les "N° auto" ne commencent pas à 1 et dans une suite continue ?

  3. #3
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 112
    Points : 31 585
    Points
    31 585
    Billets dans le blog
    16
    Par défaut
    Bonsoir Raphaël et Claude,


    Si j’ai bien compris, le problème de Raphaël est celui de l’identification relative.




    Dans ce contexte, la clé de la table SOUS_CATEGORIE n’est pas le singleton {SousCategorieId} (cas de l’identification absolue), mais la paire {CategorieId, SousCategorieId} (cas de l’identification relative) : pour chaque catégorie, la numérotation de l’attribut SousCategorieId commence à 1.

    Cet exercice de numérotation est simple en SQL si l’on peut se servir de triggers.

    Exemple avec MySQL :

    Déclaration des tables

    Code SQL : 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
    USE temp ;
    -- --------------------------------------------------------------------
    -- Déclaration des tables
    -- --------------------------------------------------------------------
     
    CREATE TABLE CATEGORIE
    (
            CategorieId         INT            NOT NULL   AUTO_INCREMENT t
          , CategorieNom        VARCHAR(64)    NOT NULL
      , CONSTRAINT CATEGORIE_PK PRIMARY KEY (CategorieId)     
    ) ;
     
    CREATE TABLE SOUS_CATEGORIE
    (
            CategorieId         INT            NOT NULL
          , SousCategorieId     INT            NOT NULL  
          , SousCategorieNom    VARCHAR(64)    NOT NULL
      , CONSTRAINT SOUS_CATEGORIE_PK PRIMARY KEY (CategorieId, SousCategorieId)   
      , CONSTRAINT SOUS_CATEGORIE_FK FOREIGN KEY (CategorieId) REFERENCES CATEGORIE  (CategorieId)  
    ) ;
     
    -- ------------------------------------------------------
    -- Sac pour test des inserts de masse
    -- ------------------------------------------------------
    CREATE TABLE W
    (
            CategorieId         INT            NOT NULL
          , SousCategorieId     INT            NOT NULL  
          , SousCategorieNom    VARCHAR(64)    NOT NULL
    ) ;

    Le trigger qui va bien :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    -- ----------------------------------------------------------------------------
    --  Le trigger pour incrémenter la colonne SousCategorieId
    -- ----------------------------------------------------------------------------
     
    CREATE TRIGGER IncrementonsSousCategorie BEFORE INSERT ON SOUS_CATEGORIE 
    FOR EACH ROW
        BEGIN 
            SET NEW.SousCategorieId = (SELECT COALESCE(MAX(SousCategorieId) + 1, 1)  
                                       FROM   SOUS_CATEGORIE 
                                       WHERE  CategorieId = NEW.CategorieId) ;
        END

    Testons :

    Code SQL : 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
     
    -- --------------------------------------------------------------
    -- Quelques catégories
    -- --------------------------------------------------------------
     
    INSERT INTO CATEGORIE (CategorieNom) VALUES ('catégorie 1re') ;
    INSERT INTO CATEGORIE (CategorieNom) VALUES ('catégorie 2e') ;
     
    -- --------------------------------------------------------
    -- Sac pour effectuer les inserts de masse
    -- --------------------------------------------------------
     
    INSERT INTO W VALUES (1, 0,  'un, un') ;
    INSERT INTO W VALUES (1, 0,  'un, deux') ;
    INSERT INTO W VALUES (1, 0,  'un, trois') ;
    INSERT INTO W VALUES (2, 0,  'deux, un') ;
    INSERT INTO W VALUES (2, 0,  'deux, deux') ;
    INSERT INTO W VALUES (2, 0,  'deux, trois') ;
    INSERT INTO W VALUES (2, 0,  'deux, quatre') ;
     
    -- ----------------------------------------------------------------
    -- INSERT de masse dans la table SOUS_CATEGORIE
    -- ----------------------------------------------------------------
     
    INSERT INTO SOUS_CATEGORIE SELECT * FROM W ; 
     
    -- -----------------------------------------------
    -- Au résultat
    -- -----------------------------------------------
     
    SELECT * FROM SOUS_CATEGORIE ;

    =>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CategorieId    SousCategorieId    SousCategorieNom
              1                  1    un, un
              1                  2    un, deux
              1                  3    un, trois
              2                  1    deux, un
              2                  2    deux, deux
              2                  3    deux, trois 
              2                  4    deux, quatre


    Avec ACCESS cela n’est pas aussi simple, sauf à passer par un projet adp, ce qui revient, si j’ai bien compris, à botter en touche, en commençant par exporter les données vers SQL Server...


    Maintenant, ça fait bien 10 ans que je n’ai pas écrit une ligne en Basic, aussi soyez indulgent pour ce qui suit...

    Pour me dérouiller un peu, j’ai bricolé quelque chose en ACCESS (2003), permettant d’effectuer l’insertion d’une ligne de la table SOUS_CATEGORIE, avec incrémentation relative de la sous-catégorie par rapport à la catégorie.

    Partons sur la base d’une table SOUS_CATEGORIE de 3 attributs :

    {CategorieId, SousCategorieId, SousCategorieNom} ;

    De clé : {CategorieId, SousCategorieId}.

    Un 1er module (nommé Appelant) transmet à un 2e module (nommé IncrementonsSousCategorie) la valeur de l’attribut CategorieId, ainsi que celle de l’attribut SousCategorieNom. Le 2e module est chargé d’incrémenter SousCategorieId relativement à CategorieId et d’effectuer l’insert dans la table SOUS_CATEGORIE.

    C’est bien fruste, mais les virtuoses d’ACCESS ne manqueront pas de trouver plus élégant et efficace..


    1er module :

    Il s’agit par exemple de créer, pour la catégorie 123, une sous-catégorie ayant pour nom « Parlottes et fêtes » :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Appelant()
     
    Dim Categorie As Integer, SousCategorieNom As String
     
    Categorie = 123
    SousCategorieNom = "Fêtes et parlottes"
     
    Call IncrementonsSousCategorie(Categorie, SousCategorieNom)
     
    End Sub


    2e module :

    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
    Sub IncrementonsSousCategorie(ByRef theCategorie As Integer, ByRef theSousCatNom As String)
     
    Dim MaBase As DAO. Database
    Dim R As String
     
    Set MaBase = CurrentDb
     
    R = "SELECT  COUNT(*) AS Kount FROM SOUS_CATEGORIE WHERE CategorieId = " & theCategorie
    Set Sqlresult = MaBase.OpenRecordset(R, dbOpenDynaset)
     
    theKount = Sqlresult.Fields("Kount").Value
     
    If theKount = 0 Then
        R = "INSERT INTO SOUS_CATEGORIE (CategorieId, SousCategorieId, SousCategorieNom) VALUES (" & theCategorie & ", 1, '" & theSousCatNom & "') ;"
    Else
        R = "INSERT INTO SOUS_CATEGORIE (CategorieId, SousCategorieId, SousCategorieNom) "
        R = R & "SELECT CategorieId, (SELECT MAX(SousCategorieId)+1 FROM SOUS_CATEGORIE WHERE CategorieId = " & theCategorie & "), '" & theSousCatNom & "' "
        R = R & " FROM SOUS_CATEGORIE "
        R = R & " WHERE CategorieId = " & theCategorie & " AND SousCategorieId = (SELECT MAX(SousCategorieId) FROM SOUS_CATEGORIE WHERE CategorieId = " & theCategorie & ") ;"
    End If
     
    MaBase.Execute R
    Sqlresult.Close
     
    End Sub


    En clair :

    — S’il s’agit de créer la 1re sous-catégorie de la catégorie 123, la réalisaton devient :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO SOUS_CATEGORIE (CategorieId, SousCategorieId, SousCategorieNom) VALUES (123, 1, 'Parlottes et fêtes') ;

    — Sinon, s’il s’agit d’une autre sous-catégorie de la catégorie 123 :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    INSERT INTO SOUS_CATEGORIE (CategorieId, SousCategorieId, SousCategorieNom) 
        SELECT CategorieId
             , (SELECT MAX(SousCategorieId) + 1 
                FROM   SOUS_CATEGORIE WHERE CategorieId = 123)
             , 'Parlottes et fêtes'  
        FROM SOUS_CATEGORIE  
        WHERE CategorieId = 123 
          AND SousCategorieId = (SELECT MAX(SousCategorieId) 
                                 FROM   SOUS_CATEGORIE 
                                 WHERE  CategorieId = 123) ;

    C’est donc rustique, lourd, largement améliorable (par exemple, transformation du 2e module en fonction), mais j’essaie d’amorcer la pompe...

  4. #4
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut


    Quel plaisir de lire vos interventions !

    Merci.

    Bon dimanche.

  5. #5
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 755
    Points : 57 605
    Points
    57 605
    Billets dans le blog
    42
    Par défaut
    S'ils apprennent que tu as codé en VBA au Relationland, aïe aïe aïe

  6. #6
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 112
    Points : 31 585
    Points
    31 585
    Billets dans le blog
    16
    Par défaut
    Y a pas de mauvais outils...

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Mai 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2014
    Messages : 7
    Points : 9
    Points
    9
    Par défaut
    Bonjour,
    Tout d'abord merci de vous pencher sur mon problème. En fait, mon problème est exactement celui décrit par fsmrel. Cependant, n'étant pas un expert je ne comprend pas. Où et comment faut-il saisir ces codes ??

    Je vous remercie d'avance.
    Cdlt

  8. #8
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 112
    Points : 31 585
    Points
    31 585
    Billets dans le blog
    16
    Par défaut
    Bonjour Raphaël,


    Pour mettre en œuvre mon système rustique, j’ai donc créé les deux modules, en ouvrant la fenêtre ad-hoc et y en sélectionnant « Modules » :





    J’ai cliqué sur « Nouveau » :




    J’ai eu droit au module vide suivant (Module1) :





    Et j’a rédigé les instructions qui vont bien :





    Même chose pour le 2e module :



    Pour la suite, je passe la main aux spécialistes d’ACCESS...

  9. #9
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 591
    Points
    3 591
    Billets dans le blog
    8
    Par défaut à la manière SQLpro
    Bonjour
    Citation Envoyé par fsmrel Voir le message
    Cet exercice de numérotation est simple en SQL si l’on peut se servir de triggers.
    Je trouve que Achille est un peu trop indulgent envers notre ami François
    Alors, François c'est un peu beau tout ça, mais Access, depuis sa version 2010, implémente les triggers en sa manière.
    Amicalement @+.

  10. #10
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 112
    Points : 31 585
    Points
    31 585
    Billets dans le blog
    16
    Par défaut
    Hélas, Bugs ! Je ne dispose que d’un antique et solennel ACCESS 2003, mais je ne doute pas que vous fournirez à Raphaël le code ACCESS 2010 qui va bien. Je vous transmets le bâton...

    En tout cas, merci pour le lien.

  11. #11
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    Je vous transmets le bâton...
    ... normalement, il a déjà la carotte...

  12. #12
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 112
    Points : 31 585
    Points
    31 585
    Billets dans le blog
    16
    Par défaut
    Well done, Claude ! Logique imparable, nous devons tous nous incliner devant tant d'à-propos

  13. #13
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 591
    Points
    3 591
    Billets dans le blog
    8
    Par défaut
    Bonjour
    Citation Envoyé par ClaudeLELOUP Voir le message
    ... normalement, il a déjà la carotte...
    Merci de l'honneur.
    Pour le moment je propose Numérotation personnalisée des enregistrements du même auteur.
    Si cela ne suffit pas, je tenterai un code adapté.
    Ceci par manque de temps car j'ai la version 2013 en machine virtuelle pour test et apprentissage; pour le moment je suis sur 2007 en production.
    @+

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Mai 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2014
    Messages : 7
    Points : 9
    Points
    9
    Par défaut Merci
    Merci à tous pour votre aide, vous m'avez permis de résoudre mon problème !

Discussions similaires

  1. Liste numérotée à plusieurs niveaux
    Par niouky dans le forum Word
    Réponses: 1
    Dernier message: 27/06/2012, 16h41
  2. Création JPopupMenu avec plusieurs niveaux
    Par gpcanto dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 01/06/2006, 08h50
  3. Apache 1.3 VirtualDocumentRoot à plusieurs niveaux
    Par marcha dans le forum Apache
    Réponses: 1
    Dernier message: 25/05/2006, 20h30
  4. Plusieurs niveaux de colonnes dans TDBGrid
    Par TicTacToe dans le forum Composants VCL
    Réponses: 4
    Dernier message: 31/01/2006, 10h44
  5. Création de plusieurs niveaux de sous formulaires
    Par Farbin dans le forum Access
    Réponses: 2
    Dernier message: 25/10/2005, 20h15

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