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 :

Structurer ses tables pour répartir une quantité selon différentes tables et conditions de jointures


Sujet :

Modélisation

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 56
    Points : 53
    Points
    53
    Par défaut Structurer ses tables pour répartir une quantité selon différentes tables et conditions de jointures
    Bonjour,

    Je me heurte à un petit problème de structuration de mes tables sous Access, et j’aimerais avoir votre avis pour savoir si les solutions que j’ai envisagées sont assez fiables ou s’il y a une meilleure manière de faire ? (en privilégiant la robustesse et la rigueur).

    Pour simplifier, imaginons que je vende des légumes, et que selon le type de légume, chaque mois, mes légumes sont produits dans un champ différent (et parfois plusieurs) en fonction du marché où ils sont vendus.

    J’ai donc une table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ProductionLégume (
    	Type : Chaîne de caractères
    	Marché : Chaîne de caractères
    	Mois de production : Mois
    	Quantité : Entier Long               )
    Qui représente donc ce que je dois produire comme type de légume chaque mois pour chaque marché.

    Champ(s) souligné(s) = clé primaire. (*)= clé étrangère.

    J’ai une bonne quantité de type de légumes qui sont toujours produits dans le même champ (90%). La notion de Marché et de Mois n’intervient donc pas.
    J’ai ainsi une table de Répartition MonoChamp qui ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Repartition Mono (
    	Type (*) : Chaîne de Caractères
    	Champ : Chaîne de Caractères    )
    Pour les autres types de légumes (10%), ils sont produits dans différents champs, et cela dépend du marché où ils sont vendus. Et bien sûr, cela vari d’un mois à l’autre, sinon ce serait trop facile ! J’ai donc une table de Répartition MultiChamps qui ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Repartition Multi (
    	Type (*) : Chaîne de Caractères
    	Marché (*) : Chaîne de Caractères
    	Mois de production (*) : Mois
    	Champ : Chaîne de Caractères
    	Taux de répartition : Pourcentage     )
    Prenons l’exemple suivant :

    Table ProductionLégume
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Type	Marché		Mois		Quantité
    Type01	ID_Marché02	"2011/02"	6980
    Type02	ID_Marché03	"2011/02"	14655
    Et dans mes deux tables de répartitions j’ai actuellement :

    Répartition Mono
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Type (*)	Champ
    Type01		ID_Champ1
    Et

    Répartition Multi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    
    Type(*)	Marché(*)	Mois(*)		Champ		Taux%
    Type02	ID_Marché03	"2011/02"	ID_Champ5	50 %
    Type02	ID_Marché03	"2011/02"	ID_Champ8	30 %
    Type02	ID_Marché03	"2011/02"	ID_Champ9	20 %
    Il suffise donc que j’effectue une jointure de type externe de ma table ProductionLégume sur une colonne pour la table Répartition Mono, et sur trois colonnes pour la table Répartition Multi. Ce qui m’intéresse c’est donc le champ « Champ ID » et « Taux*Quantité » pour savoir où produire et combien. Avec cette double jointure externe, je dois donc faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    VraiFaux(
    	RépartitionMulti.Champ Est Pas Null ;
    	RépartitionMulti.Champ ;
    	VraiFaux(
    		RépartitionMono.Champ Est Pas Null ;
    		« Erreur pas de correspondance! »
    	)
    )
    et idem pour la colonne avec Taux*Quantité. Pas très rigoureux non ? J’arrive quand même à obtenir ce que je veux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    
    Type(*)	Marché(*)	Mois(*)	Champ		ProductionRépartie
    Type02	ID_Marché03	2011/02	ID_Champ5	14655 * 50 %
    Type02	ID_Marché03	2011/02	ID_Champ8	14655 * 30 %
    Type02	ID_Marché03	2011/02	ID_Champ9	14655 * 20 %
    Type01	ID_Marché02	2011/02	ID_Champ1	6980 * 100%
    J’aimerais donc savoir si vous aviez en tête une meilleure manière de structurer ça ? Car au niveau des intégrités référentielles c’est du coup carrément impossible à mettre en place. Il serait possible de mettre toutes les répartitions dans la même table, en considérant les types « monochamp » avec une entrée à 100%, mais étant donné que j’ai plus d’une cinquantaine de types de produits, avec une vingtaine de marchés, et ce pour chaque mois, je me retrouve avec une table mono de 50 entrées à 50*20*12 mois = 12000. Je sais que cela ne posera pas trop de problème à Accès, mais s’il y a une manière plus élégante de faire, avec des classes d’associations par exemple, de gérer cette sorte de jointure conditionnelle, ça m'intéresse.

    De plus la table de répartition doit être mise à jour mensuellement par l'import d'un fichier Excel, et les types de produits, marchés, etc sont ammenés à évoluer, du coup pour éviter des problèmes d'intégrité, je pense qu'il est nécessaire d'avoir une structure bien construite.

    J'espère que vous m'avez suivi jusque là
    Merci beaucoup d'avance de me consacrer un peu de votre temps.

    PS : je travaille avec Access 2003

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


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 600
    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 600
    Points : 56 698
    Points
    56 698
    Billets dans le blog
    40
    Par défaut
    bonjour,

    pour bien structurer ses tables il faut commencer par modéliser les données à partir des règles de gestion.

    Et là…

    Citation Envoyé par thomas.m
    J’ai une bonne quantité de type de légumes qui sont toujours produits dans le même champ (90%). La notion de Marché et de Mois n’intervient donc pas.
    J’ai ainsi une table de Répartition MonoChamp qui ressemble à ça :
    Avec un exemple "monochamp" sur Type01
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Code :
     
    Type(*)	Marché(*)	Mois(*)	Champ		ProductionRépartie
    …
    Type01	ID_Marché02	2011/02	ID_Champ1	6980 * 100%
    Avec un marché et un mois qui ne devait, soi-disant, pas intervenir

    Ce que j’ai compris :

    Un type de légume est produit chaque mois :
    ProductionTypeLegume(Type, Mois, quantité)

    La production est répartie dans un ou plusieurs champs :
    Repartition(#Type, #Mois, champ, pourcentage) reliée à ProductionTypeLegume

    Le reste est flou :
    Peut-être qu’une répartition est destinée à un marché particulier, dans ce cas :
    Repartition(#Type, #Mois, champ, pourcentage, Marché)

    Mais sinon…

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 56
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par f-leb Voir le message
    Un type de légume est produit chaque mois :
    ProductionTypeLegume(Type, Mois, quantité)

    La production est répartie dans un ou plusieurs champs :
    Repartition(#Type, #Mois, champ, pourcentage) reliée à ProductionTypeLegume
    Bonsoir,
    Merci tout d'abord d'avoir pris la peine de me lire.

    Alors en fait je me suis peut être mal exprimé (il faut dire que ce n'est pas tout simple :/)

    Un type de légume est produit chaque mois pour un marché préci (ou client est peut être plus clair):
    ProductionTypeLegume(Type, Mois, Marché, quantité)
    Par exemple, je veux 5000 carottes pour le marché1 (client1) en Février, 2000 carottes pour le marché2 (client2) en Février etc..

    La production est répartie dans des champs (j'aurais peut être dû utiliser le mot "usine" car champ est ambigû dans ce cas là).
    Disons la production nécessaire pour chaque Client pour chaque mois de chaque Type de Produit est répartie dans des Usines selon différents critères. Il y a deux répartitions en quelque sorte:

    Repartition_Mono(#Type, Usine)
    Pour certains Types, on attribue la production à une Usine sans se soucier du client(ou marché) ni même du mois. On fait donc la jointure sur Type uniquement

    Repartition_Multi(#Type, #Marché, #Mois, Usine, Pourcentage)
    Dans ce cas là, pour certains Types, on répartie la quantité dans plusieurs Volumes, et celà dépend du Marché(Client). On fait donc la jointure sur Type, Marché et Mois.

    En fait on produit des modèles différents dans des usines, et souvent on n'a pas le choix, des modèles sont forcément attribués à une usine car on ne peut pas les fabriquer ailleurs, et pour certains modèles, on peut les fabriquer dans plusieurs Usines, du coup on les fabriques en fonction du Client à qui on veut les livrer (autant produire près de là où on va les vendre), et ces taux de répartion changent d'un mois à l'autre.

    J'espère avoir été assez clair, n'hésitez pas à me demander des précisions!

    Merci beaucoup encore pour le temps consacré,

    Bonne soirée

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


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 600
    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 600
    Points : 56 698
    Points
    56 698
    Billets dans le blog
    40
    Par défaut
    bon, on va faire autrement…

    Citation Envoyé par thomas.m
    En fait on produit des modèles différents dans des usines, et souvent on n'a pas le choix, des modèles sont forcément attribués à une usine car on ne peut pas les fabriquer ailleurs, et pour certains modèles, on peut les fabriquer dans plusieurs Usines
    On attribue donc des modèles à une ou plusieurs usines selon leurs capacités:


    Citation Envoyé par thomas.m
    Disons la production nécessaire pour chaque Client pour chaque mois de chaque Type de Produit…


    Citation Envoyé par thomas.m
    La production est répartie dans des champs (j'aurais peut être dû utiliser le mot "usine" car champ est ambigû dans ce cas là).
    On répartit donc la production dans les différentes usines mais seulement vers celles qui ont la capacité de produire le modèle.


    T’en penses quoi ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 56
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    Tout d'abord merci beaucoup pour ta réponse,

    Je trouve ça vraiment pas mal, mais je ne comprends pas très bien l'utilité de AttribuerProd vu que Repartir pourrait suffir dans ce cas là? (on pourrait le schinter?)



    En fait, je reçois tous les mois un fichier avec les Usines et taux de répartition en fonction de Client et idTypeModele et Mois. 90% des modèles sont toujours fait dans la même usine. Du coup, il y a redondance d'énormément d'informations si pour ces 90% de Type de Modèles on doit tous les mois rajouter des entrées pour chaque Client, Mois .. alors que la répartition ne change pas.
    Actuellement, les tables sont comme ça:



    J'aimerais donc trouver une façon élégante de gérer cette double jointure externe, un peu comme tu as fait, mais d'avoir les champs Client et Mois remplis uniquement pour les idTypeModele qui se font dans plusieurs Usines.

    Merci !

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


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 600
    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 600
    Points : 56 698
    Points
    56 698
    Billets dans le blog
    40
    Par défaut
    bonjour,

    certains modèles ont leurs productions réparties dans plusieurs usines selon le client et le mois:


    d'autres modèles sont produits dans une seule usine avec une qtté mensuelle identique chaque mois quelque soit le client:


    Il faudra veiller à ce qu'un modèle ne puisse se retrouver à la fois dans ProductionMono et ProductionMulti.

    c'est mieux comme ça ?

    [EDIT] manque une table Client pour bien faire ...[/EDIT]

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 56
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par f-leb Voir le message
    d'autres modèles sont produits dans une seule usine avec une qtté mensuelle identique chaque mois quelque soit le client:
    Hum en fait c'est faux ... Cette quantité varie d'un mois à l'autre, c'est pour ça que j'aimerais conserver la table Production en une seule table avec
    Client Mois TypeModele Quantité



    (PS: mon Client est un Pays en fait)

    Voilà en exemple concret les deux différents types de répartition que j'ai:
    Multisites:


    et Monosite:


    Peut être si c'est plus clair, voilà comment je gère ça actuellement:



    Après il y a peut être pas de meilleure solution...

    Merci encore pour ton temps.

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


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 600
    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 600
    Points : 56 698
    Points
    56 698
    Billets dans le blog
    40
    Par défaut
    Bonjour thomas.m,

    je persévère quand même…


    Une production concerne un pays, un mois et un modèle (table Production)
    Certains modèles sont produits dans une seule et même usine (table RepartitionMono) quels que soient le pays et le mois (cas du "type 2" par exemple).

    La table Repartir (dont le contenu apparait en sous-feuille de données de la table Production) ne comprend que les répartitions des modèles fabriqués par plusieurs usines.
    Il n’y a donc aucune redondance, les 500 "type 2" de Février et les 700 du mois de Mars seront toujours fabriquées dans l’ "usine 38" d’après la table RepartitionMono.

    Pour avoir la répartition globale, il faut passer par plusieurs requêtes à construire avec les assistants.

    La première pour les productions multi-sites avec les jointures nécessaire sur les tables Production et Repartir :


    La deuxième pour les productions mono-sites faisant participer la table RepartitionMono :


    Et la dernière avec UNION sur les deux précédentes :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM Requête1
    UNION
    SELECT * FROM Requête2


    Sommes-nous d’accord cette fois ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 56
    Points : 53
    Points
    53
    Par défaut
    Merci beaucoup Fabien, c'est exactement ce que je cherchais.

    Je testerai ça lundi et je te tiendrai au courant, mais ça devrait surement aller.

    Merci encore, et bon weekend.

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

Discussions similaires

  1. Macro ImageJ pour binariser une photo selon ses canaux RGB
    Par zorino-liger dans le forum ImageJ
    Réponses: 1
    Dernier message: 05/04/2012, 10h53
  2. 3 tables pour crée une réquete spécial !
    Par gastoncs dans le forum Modélisation
    Réponses: 10
    Dernier message: 15/10/2007, 20h26
  3. [Conception]structure de BDD pour gérer une arborescence
    Par petitours dans le forum Modélisation
    Réponses: 11
    Dernier message: 13/04/2007, 16h58
  4. Réponses: 2
    Dernier message: 22/01/2006, 01h11
  5. Pb pour afficher une page selon la résolution de l'écran
    Par magic8392 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 24/10/2005, 11h35

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