Product Lifecycle Management -PLM- case study



Resources
Headlines
Requirements

L’objet de l'étude de cas est de construire un système d’information et sa gestion des articles, nomenclature de fabrication, postes de charge, gammes de fabrication, mouvements de stock et inventaires d’une entreprise manufacturière.

L'application de type Create – Read - Update - Delete -CRUD- doit permettre de créer, lire, modifier et supprimer toutes les données du système d’information.

Articles
Nomenclature de fabrication
Articles et nomenclature de fabrication ⤳ UML Class Diagram

Enterprise Architect

Postes de charge
Gammes de fabrication
Postes de charge et gammes de fabrication ⤳ UML Class Diagram

Enterprise Architect

Mouvements de stock et inventaire
Mouvements de stock et inventaire ⤳ UML Class Diagram

Enterprise Architect

OCL (Enterprise Architect)

Les articles de type « Pièce » et « Matière Première (« -MP- ») n'ont pas de gamme de fabrication.

context Article inv:
    self.oclIsTypeOf(Piece) implies
        self.gamme de fabrication->isEmpty() and self.oclIsTypeOf(MP) implies
            self.gamme de fabrication->isEmpty()
  1. Design Manage -Package- Validate -Tools- Configure Validation RulesElement: (OCL) Conformance
  2. Design Manage -Package- Validate -Tools- Validate Current Package
SQL (expected)
create table Article(
    reference varchar(30),
    designation varchar(30) not null,
    -- autres propriétés ici...
    constraint Article_pk primary key(reference),
    constraint Article_unique unique(designation),
    constraint Article_check check(PF_ou_MP_ou_Piece_ou_SE = 'PF' or PF_ou_MP_ou_Piece_ou_SE = 'MP' or
                                   PF_ou_MP_ou_Piece_ou_SE = 'Pi' or PF_ou_MP_ou_Piece_ou_SE = 'SE'));
create table Lien_de_nomenclature(
    compose varchar(30),
    composant varchar(30),
    quantite_de_composition float not null,
    constraint Lien_de_nomenclature_pk primary key(compose,composant),
    constraint Lien_de_nomenclature_fk_1 foreign key(compose) references Article(reference) on delete cascade,
    constraint Lien_de_nomenclature_fk_2 foreign key(composant) references Article(reference) on delete cascade,
    constraint Lien_de_nomenclature_check check(compose <> composant));

Exercise

  1. Display OCL constraints within compartments of constrained classes in UML Class Diagram
  2. OCL: si le lien machine d'une opération vers son poste de charge est non vide (cardinalité haute à 1) alors le lien main d'oeuvre est vide (cardinalité basse à 0)
  3. OCL: si le lien machine d'une opération vers son poste de charge est non vide (cardinalité haute à 1) alors la valeur de l'attribut est machine du poste de charge est true
  4. SQL, question 2. avec CHECK
  5. SQL, question 3. avec CHECK
-- Q4
-- Plus simple : un seul attribut ('machine' et 'main_d_oeuvre' fusionnent) clef étrangère vers la table 'Poste_de_charge' ?
CONSTRAINT CHECK(machine IS NULL OR main_d_oeuvre IS NULL) -- Peu de RDBMS supportent…
-- Q5
-- Procédure stockée ?
Model transformation (Enterprise Architect) and t☛

Model-Driven Architecture -MDA-

Data Definition Language -DDL- built-in transformation

Notation for Data engineering

  1. Develop Datatypes -Data Modeling- (Oracle) Set as Default ⤳ set RDBMS platform
  2. Start Preferences -Appearance- Preferences… Code Editors -Source Code Engineering- ⤳ (Oracle) Default Database: ⤳ set RDBMS platform
  3. Design Transform -Package- Apply transformation… -Transform- ⤳ run transformation
  4. Note: checking Generate Code on result does not seem to enact the generation of SQL source code?

UML Class DiagramPlatform-Specific Model -PSM-

SQL code generation (Oracle) from Platform-Specific Model -PSM- (Oracle SQL script )

CREATE TABLE "Article"(
    "ArticleID" NUMBER(8,2) NOT NULL,
    "Reference" VARCHAR2(50) NULL, -- {id} UML constraint put aside...
    "Designation" VARCHAR2(50) NULL,
    -- autres propriétés ici...
);

CREATE TABLE "LienDeNomenclature"(
    "LienDeNomenclatureID" NUMBER(8,2) NOT NULL,
    "ArticleID" NUMBER(8,2) NULL -- WHAT A BIG MISTAKE!
    "QuantiteDeComposition" FLOAT(126) NULL
);

ALTER TABLE "Article" ADD CONSTRAINT "PK_Article" PRIMARY KEY ("ArticleID") USING INDEX;
ALTER TABLE "LienDeNomenclature" ADD CONSTRAINT "PK_LienDeNomenclature" PRIMARY KEY ("LienDeNomenclatureID") USING INDEX;

ALTER TABLE "LienDeNomenclature" ADD CONSTRAINT "FK_Lien de nomenclature_Article" FOREIGN KEY ("ArticleID") REFERENCES "Article" ("ArticleID");
Data engineeringDatabase Builder (Enterprise Architect)

UML Class DiagramPlatform-Specific Model -PSM-*

*Crow's Foot notation

CREATE TABLE  "Article_DB"(
    "REFERENCE" VARCHAR(30) NOT NULL,
    "DESIGNATION" VARCHAR(30) NOT NULL,
    -- autres propriétés ici...);

CREATE TABLE  "Lien_de_nomenclature_DB"(
    "COMPOSE" VARCHAR(30) NOT NULL,
    "COMPOSANT" VARCHAR(30) NOT NULL,
    "QUANTITE_DE_COMPOSITION" FLOAT(10) NOT NULL);

ALTER TABLE  "Article_DB" ADD CONSTRAINT "ARTICLE_PK" PRIMARY KEY ("REFERENCE") USING INDEX;
ALTER TABLE  "Article_DB" ADD CONSTRAINT "ARTICLE_UNIQUE" UNIQUE ("DESIGNATION") USING INDEX;
ALTER TABLE  "Article_DB" ADD CONSTRAINT "ARTICLE_CHECK" CHECK (PF_ou_MP_ou_Piece_ou_SE = 'PF' or PF_ou_MP_ou_Piece_ou_SE = 'MP' or PF_ou_MP_ou_Piece_ou_SE = 'Pi' or PF_ou_MP_ou_Piece_ou_SE = 'SE');

ALTER TABLE  "Lien_de_nomenclature_DB" ADD CONSTRAINT "LIEN_DE_NOMENCLATURE_PK" PRIMARY KEY ("COMPOSE","COMPOSANT") USING INDEX;
ALTER TABLE  "Lien_de_nomenclature_DB" ADD CONSTRAINT "LIEN_DE_NOMENCLATURE_CHECK" CHECK (COMPOSE <> COMPOSANT);
ALTER TABLE  "Lien_de_nomenclature_DB" ADD CONSTRAINT "LIEN_DE_NOMENCLATURE_FK_1" FOREIGN KEY ("COMPOSE") REFERENCES "Article_DB" ("REFERENCE");
ALTER TABLE  "Lien_de_nomenclature_DB" ADD CONSTRAINT "LIEN_DE_NOMENCLATURE_FK_2" FOREIGN KEY ("COMPOSANT") REFERENCES "Article_DB" ("REFERENCE");

Exercise

Data engineeringXML (Enterprise Architect)

Original XSD PLM_1.xsd 

<?xml version="1.0"?>
<!-- Espace de nom 'xs' doit être utilise dans la def. du schema : -->
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
           
    <!-- Type deporte pour element 'Lien_de_nomenclature' : -->
    <xs:complexType name="Type_lien_de_nomenclature">
        <!-- Note that attributes have no order : -->
        <!-- DTD-like : -->
        <!-- <xs:attribute name="compose" type="xs:IDREF" use="required"/> -->
        <!-- <xs:attribute name="composant" type="xs:IDREF" use="required"/> -->
        <xs:attribute name="compose" type="xs:string" use="required"/>
        <xs:attribute name="composant" type="xs:string" use="required"/>
        <!-- Attention, certaines quantites de composition sont decimales ! => "xs:decimal" : -->
        <xs:attribute name="quantite_de_composition" type="xs:decimal" use="required"/>
    </xs:complexType> 
    
    <xs:element name="PLM">
        <xs:complexType>
            <!-- 'xs:all' si pas d'ordre : -->
            <xs:sequence>
                <!-- Au moins 1 voire plusieurs (1-N) '<Article ... />' ('minOccurs="1"' par defaut) : -->
                <xs:element name="Article" minOccurs="1" maxOccurs="unbounded">
                    <!-- Type *NON* deporte : -->
                    <xs:complexType>
                        <!-- DTD-like ('xs:ID' signifie "primary key") : -->
                        <!-- <xs:attribute name="reference" type="xs:ID" use="required"/> --> 
                        <xs:attribute name="reference" type="xs:string" use="required"/>
                        …

Exercise

Data engineeringXSLT (Enterprise Architect)

Model
  1. Create «xmlTransform» and next -drag & drop- Artifact (Internal) files PLM_1.xsd  PLM_with_XSD_1_.xml  PLM_with_XSD_1_TO_WEB.xsl  PLM_with_XSD_1_.html 
  2. Link files to «xmlTransform»

XSLT transformation code

XSLT transformation execution

XSLT transformation execution result

Validation