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

Décisions SGBD Discussion :

Gestion de Stock CMUP (calcul ou redondance)


Sujet :

Décisions SGBD

  1. #1
    Membre éprouvé Avatar de b_reda31
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 899
    Points : 961
    Points
    961
    Par défaut Gestion de Stock CMUP (calcul ou redondance)
    Bonjour,
    je voudrai développer un petit logiciel de gestion de stock. J'ai commencé à me documenter sur les différentes stratégies de valorisations de stock :
    - FIFO.
    - CMUP après chaque entrée.
    - CMUP après une période.

    Je pense avoir bien compris ces concepts, cependant j'aurai besoin de quelques conseils pour leur mise en place d'un point du vue "base de données".

    j'ai bien réfléchis à la question et je me retrouve face à un dilem...

    On considère que nous sommes dans une stratégie : CMUP après chaque entrée

    et pour faire simple, disons que nous avons deux tables :
    Table Entrée : IdArticle,QtEntree,Prix Unitaire Achat, NumBonEntree ...etc.
    et Table Sortie : IdArticle,QtSortie,Prix Vente,NumBonSortie,...etc.

    Ma première hésitation concerne la valeur du CMUP, j'hésite entre deux options :
    Option 1 : Ajouter le champs "CMUP" dans le fichier entrée, ainsi tous l'historique des valeurs du CMUP sera stocké dans le fichier "Entrée". Lors de l'enregistrement de chaque entrée on recalcule le cmup par rapport à l'ancien et au quantités (avant et après entrée).
    je pense que cette option présente l'avantage d'être rapide lors de la génération d'état car aucun calcul n'est nécessaire, simple requêtes de sélection avec critères...
    Par contre, s'il arrive que l'on enregistre une entrée antidatée,on devra alors mettre à jour touutes les entrée à partir de cette date (recalcul)....

    Option 2 : : Ne pas stocker le CMUP dans l'entrée, il n y a ainsi aucune redondance, cependant en fonction du volume des entrées, les calculs lors de génération d'état peuvent prendre du temps...
    Quelle méthode est la plus préconisée ? ou peut être que vous pouvez m'en proposer une autre ?



    Merci par avance

    Réda
    « Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste!!»

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Stocker la valeur est effectivement tentant, car d'un point de vue performances, on peut s'attendre à avoir de meilleures performances.

    Cependant, si demain il y a une correction d'entrée dans le passé, toutes les lignes de CMUP entre la date modifiée et maintenant seront fausses, et il faudra corriger en masse un grand volume d'information.

    Une vue matérialisée me semble plus opportune (ou une colonne calculée indexée).
    On ne jouit bien que de ce qu’on partage.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 769
    Points : 52 720
    Points
    52 720
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par b_reda31 Voir le message
    et pour faire simple, disons que nous avons deux tables :
    Table Entrée : IdArticle,QtEntree,Prix Unitaire Achat, NumBonEntree ...etc.
    et Table Sortie : IdArticle,QtSortie,Prix Vente,NumBonSortie,...etc.
    Votre modèle est faux d'emblée. Dans un MCD chaque information, en dehors des clefs étrangères, ne doit figurer qu'une seule fois. Comme vous voulez modéliser directement au niveau physique vous faites n'importe quoi...

    La table unique est la suivante :
    • Clef, Date, IdArt, Qté, PUHT, IdBon...
    • Clef est la clef primaire de la table.
    • Date est la date du mouvement
    • IdArt la clef étrangère du prdoduit visé
    • Qté est la quantité (un réel) qui peut être positif => entrée, ou négatif => sortie


    Puis faites deux vues qui vont présenter, l'une les entrées, l'autre les sorties.

    Au niveau des calculs de stock, une simple fonction de fenêtrage suffit :
    SUM(qté) OVER(PARTITION BY IdArt ORDER BY DATE)

    Mais comme il est impératif de faire des inventaires, votre stock initial doit partir du dernier inventaire.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre éprouvé Avatar de b_reda31
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 899
    Points : 961
    Points
    961
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Stocker la valeur est effectivement tentant, car d'un point de vue performances, on peut s'attendre à avoir de meilleures performances.
    Cependant, si demain il y a une correction d'entrée dans le passé, toutes les lignes de CMUP entre la date modifiée et maintenant seront fausses, et il faudra corriger en masse un grand volume d'information.
    Une vue matérialisée me semble plus opportune (ou une colonne calculée indexée).
    Merci! je vais jeter un oeil sur "les vues matérialisées", je ne les ai jamais utilisées...



    Citation Envoyé par SQLpro Voir le message
    Votre modèle est faux d'emblée. Dans un MCD chaque information, en dehors des clefs étrangères, ne doit figurer qu'une seule fois. Comme vous voulez modéliser directement au niveau physique vous faites n'importe quoi...

    La table unique est la suivante :
    • Clef, Date, IdArt, Qté, PUHT, IdBon...
    • Clef est la clef primaire de la table.
    • Date est la date du mouvement
    • IdArt la clef étrangère du prdoduit visé
    • Qté est la quantité (un réel) qui peut être positif => entrée, ou négatif => sortie
    Je vous remercie de votre rectification, je suis ravi que vous parlez de ce point car j'allais justement en parler dans un autre sujet (section Schéma), mais tant qu'on y est autant le faire ici ...

    J'aimerai approfondir le fait que vous considérez que le premier modèle est faux.
    Prenons un autre exemple si vous permettez. Sans trop entrer dans les détail de gestion, considérons que l'on désire mettre en place un SI qui permet de modéliser plusieurs types de pièces :
    - Facture Client
    - Facture Proforma Client
    - Avoir Client


    En fouillant un peu sur les logiciels existant (opensource, gratuit), je me suis rendu compte que l'on pouvait trouver deux façon de modéliser ce SI :

    Méthode 1 : On considère un document quelque soit son type (Facutre, Proforma, Avoir) comme une seule entité, puisque les documents ont globalement les mêmes attributs (Clé Document,Date, Clé Client, Total TVA,Total TTC,...etc)
    On ajoute cependant à l'entité "Document", l'attribut "TypeDocument" pour différencier les différents types de documents possibles.

    Méthode 2 :
    Créer une entité pour chaque type de document
    1. Entité FactureClient
    2. Entité FactureProformaClient
    3. Entité AvoirClient

    Dans la même façon de voir, si on reprend le premier exemple que j'ai donné (Entrée/Sortie)

    On peut considérer une seule entité(méthode 1) : "Mouvement" qui regroupe à la fois les entrées et les sorties en différenciant les sorties par le signe négatif en quantité.

    ou les eclater en deux entités (méthode 2)
    1. Entrée
    2. Sortie


    Maintenant, dans l'absolu, pouvons-nous affirmer que la deuxième méthode est fausse ?
    je me suis vraiment posé cette question avant de poster ce sujet, j'en suis arrivé à cette modeste conclusion :

    - Mise à jour de la structure du fichier :
    Dans le cas d'un mise à jour structurelle des données, par exemple ajouter un champ (attribut) au document
    dans la première méthode il suffit simplement d'ajouter le champs dans l'entité "Document", par contre pour la deuxième méthode il faudrait reporter ce champ sur toutes les autre entités représentant les documents (Facture, FactureProforma,...) ce qui peut être assez lourd!

    - Performance : d'un point du vue performance, je pense que la deuxième méthode est plus rapide, dans la mesure où les données sont répartis sur plusieurs fichiers. Si on veut récuperer les facture d'un client, il suffit de chercher dans le fichier "Facture" qui contient uniquement les facture et non pas dans un gros fichier contenant toutes pièces.

    Je ne cherche pas à remettre en question ce que vous affirmez mais juste à comprendre pourquoi on peut d'emblée dire la deuxième méthode est fausse! (dans l'absolu)

    Merci à vous.
    « Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste!!»

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Peut-être qu'il ne faut pas penser en fichiers mais en tables. D'un point de vue physique les tables peuvent être indexées, ce qui accélère la recherche de lignes, voire partitionnées pour ne manipuler qu'une partie des lignes.
    Il faut penser aussi la modélisation en fonction des opérations à effectuer : si devis, factures et avoirs sont dans trois tables distinctes, il faudra trois interrogations pour connaître toutes les opérations associées à un client. Par ailleurs, une facture a plusieurs lignes : devra-t-il y avoir une table pour les lignes de facture et une autre pour les lignes de devis ?
    Je te laisse continuer à réfléchir sur le modèle le plus adapté...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 769
    Points : 52 720
    Points
    52 720
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par b_reda31 Voir le message
    Je vous remercie de votre rectification, je suis ravi que vous parlez de ce point car j'allais justement en parler dans un autre sujet (section Schéma), mais tant qu'on y est autant le faire ici ...

    J'aimerai approfondir le fait que vous considérez que le premier modèle est faux.
    Prenons un autre exemple si vous permettez. Sans trop entrer dans les détail de gestion, considérons que l'on désire mettre en place un SI qui permet de modéliser plusieurs types de pièces :
    - Facture Client
    - Facture Proforma Client
    - Avoir Client


    En fouillant un peu sur les logiciels existant (opensource, gratuit), je me suis rendu compte que l'on pouvait trouver deux façon de modéliser ce SI :

    Méthode 1 : On considère un document quelque soit son type (Facutre, Proforma, Avoir) comme une seule entité, puisque les documents ont globalement les mêmes attributs (Clé Document,Date, Clé Client, Total TVA,Total TTC,...etc)
    On ajoute cependant à l'entité "Document", l'attribut "TypeDocument" pour différencier les différents types de documents possibles.
    Cel n'est pas dans les bonnes pratiques car cela conduit à un méta modèle qui possède tout un tas de limites logique et fonctionnelles. Et c'est un débat assez complexe, car le typage risque de devenir rapidement flou. Par exemple, pourquoi ne pas faire tout cela en XML ?

    Méthode 2 :
    Créer une entité pour chaque type de document
    1. Entité FactureClient
    2. Entité FactureProformaClient
    3. Entité AvoirClient
    C'est la bonne méthode, à condition d'introduire un héritage entre Facture et FactureProforma.

    Dans la même façon de voir, si on reprend le premier exemple que j'ai donné (Entrée/Sortie)

    On peut considérer une seule entité(méthode 1) : "Mouvement" qui regroupe à la fois les entrées et les sorties en différenciant les sorties par le signe négatif en quantité.

    ou les eclater en deux entités (méthode 2)
    1. Entrée
    2. Sortie
    Vous serez obligé de redondez certaines informations et donc vous violez les règles de modélisation qui supposent qu'il n'existe aucune redondance et que chaque information doit être mise une seule fois dans le modèle....

    Maintenant, dans l'absolu, pouvons-nous affirmer que la deuxième méthode est fausse ?
    je me suis vraiment posé cette question avant de poster ce sujet, j'en suis arrivé à cette modeste conclusion :

    - Mise à jour de la structure du fichier :
    Déjà vous faites une erreur énorme. Une table n'est pas un fichier. Une table est un objet logique qui est suffisamment plastique pour être modifié dan sa structure à la volée, ce qui n'est pas le cas d'un fichier qu'il faut entièrement reconstruire à chaque ajout d'info...
    Dans le cas d'un mise à jour structurelle des données, par exemple ajouter un champ (attribut) au document
    En matière de SGBDR on ne parle pas de champ... On parle d'attribut dans le MCD et de colonne dans le MPD. Les champs c'est une notion purement physique alors que nous sommes dans la pure logique. Parler de champs, c'est propre au cultivateur, au chirurgien (champ opératoire) ou encore dans les formulaire papier ou écran...
    dans la première méthode il suffit simplement d'ajouter le champs dans l'entité "Document", par contre pour la deuxième méthode il faudrait reporter ce champ sur toutes les autre entités représentant les documents (Facture, FactureProforma,...) ce qui peut être assez lourd!
    et en sus couteux et redondant !

    - Performance : d'un point du vue performance, je pense que la deuxième méthode est plus rapide, dans la mesure où les données sont répartis sur plusieurs fichiers. Si on veut récuperer les facture d'un client, il suffit de chercher dans le fichier "Facture" qui contient uniquement les facture et non pas dans un gros fichier contenant toutes pièces.
    Vous commettez une nouvelle erreur. Ce n'est pas au niveau de la modélisation que l'on se préoccupe des performances. Un SGBDR a été conçu pour manipuler des relations et il le fait vite et bien. Il faut donc respecter A LA LETTRE les principes de modélisation (pas de NULL, pas de redondances... etc). L'obsession qui consiste à essayer de se pencher sur le problème de performance à ce moment (la modélisation) ne peut que vous entrainer à produire l'inverse : un modèle imbécile, biscornu, peu évolutif, redondant et au final des performance de merde !
    Il faut comprendre que la genèse des bases de données relationnelles est venu à la suite des problèmes de performances des modèles anciens (hiérarchique, "réseau" des années 60). Le principe étant une séparation ABSOLUE entre les aspects logique (la modélisation) et les aspects physique (le stockage, l'indexation...).

    Je ne cherche pas à remettre en question ce que vous affirmez mais juste à comprendre pourquoi on peut d'emblée dire la deuxième méthode est fausse! (dans l'absolu)

    Merci à vous.
    En particulier dans votre cas, la table pourrait être partitionnée en deux si les performances ne sont pas au rendez-vous. Une partition contiendrait les entrées et l'autre les sorties.
    Vous auriez ainsi la pertinence d'un modèle parfait et les performances les plus extrêmes...

    C'est aussi pour cela qu'il existe deux métiers dans les SGBDR, celui de développeur et celui de DBA et l'un n'a absolument pas à se préoccuper des prérogatives de l'autre, ni même besoin de connaître intimement ce qui se passe de l'autre coté de la barrière. Cela a été voulu par Codd (l'inventeur des SGBDR) justement parce que les système précédents mélangeait les deux, ce qui posait des problèmes à la fois de logique de traitement et de performance !!!!

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. [XL-2010] Tableaux calculés gestion de stock
    Par scoobydoos dans le forum Excel
    Réponses: 8
    Dernier message: 19/03/2016, 10h01
  2. [AC-2003] calcul gestion de stock par requête
    Par yieiyiei dans le forum Modélisation
    Réponses: 8
    Dernier message: 21/02/2015, 08h24
  3. [DB2] calcul, gestion des stocks
    Par moineaux44 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/06/2006, 13h06
  4. Gestion de stock CMUP après chaque entrée
    Par priest69 dans le forum Access
    Réponses: 9
    Dernier message: 13/12/2005, 10h03
  5. gestion des stocks
    Par gekondo dans le forum Access
    Réponses: 1
    Dernier message: 30/09/2005, 11h41

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