MySQL 5 : Les vues — (part 6/7)
Modifier automatiquement des données sélectionnées
Pour ce troisième exemple, nous allons nous intéresser au schéma (là encore très simplifié) d’une application qui permet de vendre des produits en France et au Royaume-Uni, en euro, livre et dollar. Cette application possède une table produit, qui contient le produit (son identifiant) et son prix hors taxe en euro.
Structure de la table produit:
CREATE TABLE produit ( id_produit mediumint(8) unsigned NOT NULL auto_increment, prix_ht decimal(6,2) default NULL, PRIMARY KEY (id_produit) )
Nous disposons également des tables devise et tva qui gèrent respectivement le taux de change des devises et la TVA de différents pays.
Tables devise et tva:
CREATE TABLE devise ( devise enum('Euro', 'Dollar', 'Livre') NOT NULL, valeur decimal(6,5) default NULL, PRIMARY KEY (devise) ); INSERT INTO devise VALUES ('Livre',0.66017); INSERT INTO devise VALUES ('Dollar',1.29852); INSERT INTO devise VALUES ('Euro',1); CREATE TABLE tva ( pays enum('France', 'Royaume-Uni') NOT NULL, normal decimal(3,1) default NULL, reduit decimal(3,1) default NULL, PRIMARY KEY (pays) ); INSERT INTO tva VALUES ('Royaume-Uni',17.5,5.0); INSERT INTO tva VALUES ('France',19.6,5.5);
Le besoin est le suivant : disposer simplement des prix TTC pour chaque pays.
On va donc créer deux vues par pays qui nous permettrons de disposer des prix TTC en fonction de la devise.
La vue produit_france, contient les produits, le prix TTC et le prix TTC réduit qui correspond à l’ajout de la TVA réduite. Les prix sont en euros.
Vue produit_france :
CREATE VIEW 'produit_france' AS SELECT 'produit'.'id_produit' AS 'produit', round((((('produit'.'prix_ht' * 'tva'.'normal') / 100) + 'produit'.'prix_ht') * 'devise'.'valeur'),2) AS 'Prix_ttc_€', round((((('produit'.'prix_ht'* 'tva'.'reduit') / 100) + 'produit'.'prix_ht') * 'devise'.'valeur'),2) AS 'Prix_ttc_reduit_€' FROM (('produit' join 'tva') join 'devise') WHERE (('tva'.'pays' = 'France') and ('devise'.'devise' = 'Euro'));
Certains clients préférant la monnaie de l’oncle Sam, une deuxième vue, produit_france_dollar, est nécessaire pour avoir les prix en dollar.
Vue produit_france_dollar:
CREATE VIEW 'produit_france_dollar' AS SELECT 'produit'.'id_produit' AS 'produit', round((((('produit'.'prix_ht' * 'tva'.'normal') / 100) + 'produit'.'prix_ht') * 'devise'.'valeur'),2) AS 'Prix_ttc_$', round((((('produit'.'prix_ht'* 'tva'.'reduit') / 100) + 'produit'.'prix_ht') * 'devise'.'valeur'),2) AS 'Prix_ttc_reduit_$' FROM (('produit' join 'tva') join 'devise') WHERE (('tva'.'pays' = 'France') and ('devise'.'devise' = 'Dollar'));
Même principe pour le Royaume-Uni :
CREATE VIEW 'produit_royaume_uni' AS SELECT 'produit'.'id_produit' AS 'produit', round((((('produit'.'prix_ht' * 'tva'.'normal') / 100) + 'produit'.'prix_ht') * 'devise'.'valeur'),2) AS 'Net_price_£', round((((('produit'.'prix_ht'* 'tva'.'reduit') / 100) + 'produit'.'prix_ht') * 'devise'.'valeur'),2) AS 'reduced_ Net_price_£' FROM (('produit' join 'tva') join 'devise') WHERE (('tva'.'pays' = 'Royaume-Uni') and ('devise'.'devise' = 'Livre'));
Avec les prix en dollar :
CREATE VIEW 'produit_royaume_uni_dollar' AS SELECT 'produit'.'id_produit' AS 'produit', round((((('produit'.'prix_ht' * 'tva'.'normal') / 100) + 'produit'.'prix_ht') * 'devise'.'valeur'),2) AS 'Net_price_$', round((((('produit'.'prix_ht'* 'tva'.'reduit') / 100) + 'produit'.'prix_ht') * 'devise'.'valeur'),2) AS 'reduced_ Net_price_$' FROM (('produit' join 'tva') join 'devise') WHERE (('tva'.'pays' = 'Royaume-Uni') and ('devise'.'devise' = 'Dollar'));
(à suivre… Conserver la structure d’une table)
Architecte Solution Cloud chez Oracle
MySQL Geek, Architecte, DBA, Consultant, Formateur, Auteur, Blogueur et Conférencier.
—–
Blog: www.dasini.net/blog/en/
Twitter: https://twitter.com/freshdaz
SlideShare: www.slideshare.net/freshdaz
Youtube: https://www.youtube.com/channel/UC12TulyJsJZHoCmby3Nm3WQ
—–