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

Schéma Discussion :

Gestion multi unités des articles [MCD]


Sujet :

Schéma

  1. #1
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2013
    Messages : 33
    Points : 52
    Points
    52
    Par défaut Gestion multi unités des articles

    Bonjour tout le monde

    Actuellement, je me trouve coincé dans mon MCD (j’ignore la façon concrète)

    Voici le problème :


    je développe une application de gestion de stock pour une boutique. Je suis coincé dans la réalisation de MCD pour la gestion multi unités des articles.

    Un article peut être acheté sous plusieurs unités différentes, on peut aussi le vendre sous les mêmes unités. Je dois aussi gérer le stock en prenant en compte ces unités.

    Exemple : J’achète Tomates en carton de 24 chez le fournisseur, je vends en pièce, en carton de 12 et en carton de 6.

    Si je vérifie mon stock, je dois voir les stocks pour :

    les cartons de 24, les pièces, les cartons de 12, et 6.

    NB : je peux aussi acheter la prochaine fois en carton de 12 chez le fournisseur

    Je réfléchis et je parcours le net. Je n'ai vu aucun lien qui ne me donne d’idées concrètes.

    Puisque ce forum est rempli des pros, s’il existe une meilleure approche je suis preneur.

    https://www.mercator.eu/mercator/std...es-unites.html

    https://www.developpez.net/forums/d1...table-produit/

    Merci

  2. #2
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    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 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut Articles, unités, stock, etc.
     

    Bonsoir mrfof,

    Je n’ai ps tout saisi de votre demande...

    D’instinct, je dirais que si le stock est géré par paire {article, unité}, on peut définir une association ARTICLE_UNITE entre les entités-types ARTICLE et UNITE, porteuse de la quantité en stock par article et unité.

    Pour brancher les achats et les ventes, on transforme cette association en entité-type associative, donc identifiée relativement à ARTICLE et UNITE (cardinalités 1,1(R)).

    Une ébauche :

    MCD

    Nom : mrfof_unites(mcd).png
Affichages : 550
Taille : 13,0 Ko

    MLD

    Nom : mrfof_unites(mld).png
Affichages : 518
Taille : 16,6 Ko

    Les CREATE TABLE :

    CREATE TABLE UNITE 
    (
            uniteId          INT              NOT NULL
          , uniteLibelle     VARCHAR(16)      NOT NULL
          , uniteQte         INT              NOT NULL 
        , CONSTRAINT UNITE_PK PRIMARY KEY (uniteId)
    ) ;
    
    CREATE TABLE ARTICLE 
    (
            articleId        INT              NOT NULL
          , reference        VARCHAR(16)      NOT NULL
          , statut           VARCHAR(8)       NOT NULL
        , CONSTRAINT ARTICLE_PK PRIMARY KEY (articleId)
    ) ;
    
    CREATE TABLE ARTICLE_UNITE 
    (
            articleId        INT              NOT NULL
          , uniteId          INT              NOT NULL
          , quantiteStock    INT              NOT NULL
        , CONSTRAINT ARTICLE_UNITE_PK PRIMARY KEY (articleId, uniteId)
        , CONSTRAINT ARTICLE_UNITE_ARTICLE_FK FOREIGN KEY (articleId)
              REFERENCES ARTICLE (articleId)
       , CONSTRAINT ARTICLE_UNITE_UNITE_FK FOREIGN KEY (uniteId)
             REFERENCES UNITE (uniteId)
    ) ;
    
    CREATE TABLE LIGNE_COMMANDE 
    (
            cdeId            INT              NOT NULL
          , ligneCdeId       INT              NOT NULL
          , articleId        INT              NOT NULL
          , uniteId          INT              NOT NULL
          , ligneCdeQte      INT              NOT NULL
        , CONSTRAINT LIGNE_COMMANDE_PK PRIMARY KEY (cdeId, ligneCdeId)
        , CONSTRAINT LIGNE_COMMANDE_ARTICLE_UNITE_FK FOREIGN KEY (articleId, uniteId)
              REFERENCES ARTICLE_UNITE (articleId, uniteId)
    ) ;
    
    CREATE TABLE LIGNE_FACTURE 
    (
            factId           INT              NOT NULL
          , ligneFactId      INT              NOT NULL
          , articleId        INT              NOT NULL
          , uniteId          INT              NOT NULL
          , ligneFactQte     INT              NOT NULL
       CONSTRAINT LIGNE_FACTURE_PK PRIMARY KEY (factId, ligneFactId),
       CONSTRAINT LIGNE_FACTURE_ARTICLE_UNITE_FK FOREIGN KEY (articleId, uniteId)
           REFERENCES ARTICLE_UNITE (articleId, uniteId)
    ) ;
    

    Un début de jeu d’essai

    -------------------------------------
    -- Les unités
    -------------------------------------
    INSERT INTO UNITE (uniteId, uniteLibelle, uniteQte) VALUES
        (1, 'carton', 24)
      , (2, 'carton', 12)
      , (3, 'carton', 6) 
      , (4, 'pièce', 1)
      , (5, 'cageot', 12) 
      , (6, 'cageot', 8) 
    ;
    SELECT '' as 'unite =>  ', * 
    FROM UNITE
    ;
    unite =>   uniteId     uniteLibelle     uniteQte
    ---------- ----------- ---------------- -----------
               1           carton           24
               2           carton           12
               3           carton           6
               4           pièce            1
               5           cageot           12
               6           cageot           8
    
    
    -------------------------------------
    -- Les articles
    -------------------------------------
    INSERT INTO ARTICLE (articleId, reference, statut) VALUES
        (1, 'tomates', 's')
      , (2, 'pommes', 's')
      , (3, 'poires', 's') 
      , (4, 'scoubidous', 's')
    ;
    SELECT '' 'as article =>  ', * FROM ARTICLE
    ;
    article =>   articleId   reference        statut
    ------------ ----------- ---------------- ------
                 1           tomates          s
                 2           pommes           s
                 3           poires           s
                 4           scoubidous       s
    
    -----------------------------------------
    -- Les paires {article, unité}
    -- et quantités en stock correspondantes
    -----------------------------------------
    INSERT INTO ARTICLE_UNITE (articleId, uniteId, quantiteStock) VALUES
        (1,1, 110)
      , (1,2, 120)
      , (1,3, 130)
      , (1,4, 140)
      , (2,1, 210)
      , (2,4, 240)
      , (2,5, 250)
    ;
    SELECT '' as 'article_unite =>  ', y.reference, z.uniteLibelle + ' ('+ CAST(z.uniteQte as varchar(8)) + ')', x.quantiteStock
    FROM   ARTICLE_UNITE as x
      JOIN ARTICLE as y ON x.articleId = y.articleId 
      JOIN UNITE as z ON x.uniteId = z.uniteId
    
    article_unite =>   reference                        quantiteStock
    ------------------ ---------------- -----------------------------
                       tomates          carton (24)     110
                       tomates          carton (12)     120
                       tomates          carton (6)      130
                       tomates          pièce (1)       140
                       pommes           carton (24)     210
                       pommes           pièce (1)       240
                       pommes           cageot (12)     250
    
    -----------------------------
    -- Les lignes de commande
    -----------------------------
    
    INSERT INTO LIGNE_COMMANDE (cdeId, ligneCdeId, articleId, uniteId, ligneCdeQte)
    VALUES
         (1, 1, 1, 1, 10)
       , (1, 2, 1, 2, 20)
       , (1, 3, 2, 1, 25)
       , (1, 4, 2, 5, 15)
    ;
    SELECT '' as 'ligne_commande =>  '
        , cdeId, ligneCdeId, y.reference, z.uniteLibelle + ' ('+ CAST(z.uniteQte as varchar(8)) + ')', t.ligneCdeQte
    FROM   LIGNE_COMMANDE as t
      JOIN ARTICLE_UNITE as x ON t.articleId = x.articleId AND t.uniteId = x.uniteId 
      JOIN ARTICLE as y ON x.articleId = y.articleId 
      JOIN UNITE as z ON x.uniteId = z.uniteId
    ;
    ligne_commande =>   cdeId       ligneCdeId  reference                    ligneCdeQte
    ------------------- ----------- ----------- ---------------- -----------------------
                        1           1           tomates     carton (24)      10
                        1           2           tomates     carton (12)      20
                        1           3           pommes      carton (24)      25
                        1           4           pommes      cageot (12)      15
    
    -----------------------------------
    -- Les lignes de facture
    -----------------------------------
    
    INSERT INTO LIGNE_FACTURE(factId, ligneFactId, articleId, uniteId, ligneFactQte)
    VALUES
         (1, 1, 1, 2, 5)
       , (1, 2, 1, 3, 20)
       , (1, 3, 1, 4, 12)
       , (1, 4, 2, 1,21)
       , (1, 5, 2, 5, 25)
    ;
    SELECT '' as 'ligne_facture =>  '
        , factId, ligneFactId, y.reference, z.uniteLibelle + ' ('+ CAST(z.uniteQte as varchar(8)) + ')', t.ligneFactQte
    FROM   LIGNE_FACTURE as t
      JOIN ARTICLE_UNITE as x ON t.articleId = x.articleId AND t.uniteId = x.uniteId 
      JOIN ARTICLE as y ON x.articleId = y.articleId 
      JOIN UNITE as z ON x.uniteId = z.uniteId
    ;
    ligne_facture =>   factId      ligneFactId reference                     ligneFactQte
    ------------------ ----------- ----------- ---------------- -------------------------
                       1           1           tomates     carton (12)         5
                       1           2           tomates     carton (6)         20
                       1           3           tomates     pièce (1)          12
                       1           4           pommes      carton (24)        21
                       1           5           pommes      cageot (12)        25
    

    Maintenant si tout ça ne répond pas à votre besoin, on peut reprendre à zéro...

    Concernant la cohérence du stock par rapport aux commandes et aux factures, des triggers ad-hoc devraient permettre de s’en assurer.


     
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Autres difficultés éventuelles à prendre en compte :
    - il est possible que le prix d'achat et le prix de vente soient parfois exprimés selon une unité différente de celle du conditionnement mais que ce prix dépende du conditionnement.
    Par exemple, pour les tomates, prix d'achat et de vente différent selon qu'il s'agit de plateau de 24, de 12 ou de vrac, mais parfois (toujours ?) exprimé au kilogramme
    Pour des épices, prix exprimé au conditionnement (sachet, flacon) indifféremment du grammage
    - au niveau traitement (à voir plus tard donc), il sera difficile de tenir compte en temps réel des reconditionnements (plateaux dans lesquels les clients ont prélevé des tomates par exemple, ou plateaux reconstitués à partir d'autres incomplets, freinte...).

  4. #4
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2013
    Messages : 33
    Points : 52
    Points
    52
    Par défaut
    Bonjour Fsmrel et escartefigue ainsi que tout les intervenants.

    Merci pour vos interventions

    Je pense que j'ai pas bien détaillé mon problème surtout que je n'avais pas pu faire une énoncé. Désolé pour ça.

    Grace a cette discussion et mes recherches, j'ai compris comment certains logiciels traite le problème.


    Enoncé :
    R1 : Chaque article a une unité de gestion de stock
    R2 : Une unité de gestion de stock peut concerner plusieurs articles

    R11 : Chaque article possède plusieurs conditionnements
    R22 : Un conditionnement appartient a un seul article.

    R111 : Chaque conditionnement a une unité
    R222 : Une unité peut concerner plusieurs conditionnements

    Voici le MCD
    Nom : MCD CONDITIONNEMENT.Jpg
Affichages : 533
Taille : 33,3 Ko

    Je me rappel FSMREL, vous m’avez dit dans un de mes anciens sujet de faire attention aux identifiants relatif et je me retrouve avec un autre cas.
    • - Relation entre entité-type (Article-Unite) est là pour unité de gestion du stock pas pour les ventes et achats.
    • - Pour les ventes et achats, c’est conditionnement qui définit, et ‘Quantite’ dans conditionnement représente le nombre d’unité de stock que ce conditionnement contient.


    Exemple : J’ai un article ‘Tomate’ sont unité de stock est PCE (donc mon stock est en pièce)

    Table unite

    Id Code Libelle
    1 PCE Pièce
    2 CAT CARTON
    3 PQT Paquet

    Table article

    Id Unite_id Reference Designation
    1 1 T3023 Tomate


    Table conditionnement

    Id Article_id Unite_id Quantite Prix_achat Prix_vente
    1 1 1 500 500 600
    2 1 2 24 12000 14500
    3 1 3 6 3000 4000

    Maintenant supposons que j’ai vendu :
    1. Une Pièce, elle représente 1 unité de stock donc j’enlève juste 1
    2. Pour Carton, il représente 24 unité de stock donc j’enlève juste 24 etc.


    D’un point de vu théorique ça marche, mais ça reste implémentation dans le code.
    Je veux que vous analysiez mon model afin de me dire les améliorations possibles

    Merci

  5. #5
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    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 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut Articles, unités, stock, conditionnement, etc.
     

    Bonsoir mrfof,

    On y voit plus clair. Le MCD pourrait devenir le suivant, dans lequel l’entité-type CONDITIONNEMENT se substitue à l’entité-type ARTICLE_UNITE ; en notant que l’entité-type ARTICLE n’est pas une propriété (multivaluée) de l’entité-type UNITE, donc qu’il n’y a pas identification de la 1re par relativement à la 2e (via l’association ARTICLE_UNITE_STOCK).

    MCD

    Nom : mrfof_unites(mcd)v2.png
Affichages : 503
Taille : 18,7 Ko

    MLD


    Nom : mrfof_unites(mld)v2.png
Affichages : 483
Taille : 19,5 Ko


    Code SQL


    CREATE TABLE UNITE 
    (
            uniteId          INT              NOT NULL
          , uniteLibelle     VARCHAR(16)      NOT NULL
          , uniteQte         INT              NOT NULL 
        , CONSTRAINT UNITE_PK PRIMARY KEY (uniteId)
    ) ;
    
    CREATE TABLE ARTICLE 
    (
            articleId        INT              NOT NULL
          , uniteStockId     INT              NOT NULL
          , reference        VARCHAR(16)      NOT NULL
          , statut           VARCHAR(8)       NOT NULL
        , CONSTRAINT ARTICLE_PK PRIMARY KEY (articleId)
    ) ;
    
    CREATE TABLE CONDITIONNEMENT 
    (
            articleId        INT              NOT NULL
          , uniteId          INT              NOT NULL
          , condId           INT              NOT NULL
          , condQuantite     INT              NOT NULL
        , CONSTRAINT CONDITIONNEMENT_PK PRIMARY KEY (articleId, uniteId, condId)
        , CONSTRAINT CONDITIONNEMENT_ARTICLE_FK FOREIGN KEY (articleId)
              REFERENCES ARTICLE (articleId)
       , CONSTRAINT CONDITIONNEMENT_UNITE_FK FOREIGN KEY (uniteId)
             REFERENCES UNITE (uniteId)
    ) ;
    
    CREATE TABLE LIGNE_COMMANDE 
    (
            cdeId            INT              NOT NULL
          , ligneCdeId       INT              NOT NULL
          , articleId        INT              NOT NULL
          , uniteId          INT              NOT NULL
          , condId           INT              NOT NULL
          , ligneCdeQte      INT              NOT NULL
        , CONSTRAINT LIGNE_COMMANDE_PK PRIMARY KEY (cdeId, ligneCdeId)
        , CONSTRAINT LIGNE_COMMANDE_CONDITIONNEMENT_FK FOREIGN KEY (articleId, uniteId, condId)
              REFERENCES CONDITIONNEMENT (articleId, uniteId, condId)
    ) ;
    
    CREATE TABLE LIGNE_FACTURE 
    (
            factId           INT              NOT NULL
          , ligneFactId      INT              NOT NULL
          , articleId        INT              NOT NULL
          , uniteId          INT              NOT NULL
          , condId           INT              NOT NULL
          , ligneFactQte     INT              NOT NULL
       CONSTRAINT LIGNE_FACTURE_PK PRIMARY KEY (factId, ligneFactId),
       CONSTRAINT LIGNE_FACTURE_CONDITIONNEMENT_FK FOREIGN KEY (articleId, uniteId, condId)
           REFERENCES CONDITIONNEMENT (articleId, uniteId, condId)
    ) ;
    

     
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  6. #6
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2013
    Messages : 33
    Points : 52
    Points
    52
    Par défaut


    Merci le Grand FSMREL vous avez résolu mon problème. je voulais être sûr.

    Merci encore pour les éclaircissements

  7. #7
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    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 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut Articles, unités, stock, conditionnement, etc.
     

    Well! Et n’oubliez pas de marquer la discussion comme résolue.

    A vous revoir pour une autre aventure…
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

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

Discussions similaires

  1. Gestion des articles en multi-sites
    Par bogacidre dans le forum SAGE
    Réponses: 3
    Dernier message: 10/09/2013, 11h43
  2. Plugin personnalisé de gestion de contenu des articles
    Par CompuTux dans le forum WordPress
    Réponses: 1
    Dernier message: 29/03/2011, 09h53
  3. gestion des articles avec un indice
    Par cladsam dans le forum SAP
    Réponses: 10
    Dernier message: 13/02/2008, 11h14

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