Syndication : Atom 1.0  RSS 2.0
Blogs des développeurs   »   Le blog d'ElSuket

Article complet: Gérer des couleurs en base de données

03/07/2009

Permalink 07:10:32, Catégories: Récapitulatif SGBD, SQL Server, Snippets, Agent SQL Server, T-SQL, 2344 mots   French (FR) , elsuket

[SGBD][SQL Server] Gérer des couleurs en base de données

Il peut vite devenir difficile de gérer de façon uniforme les couleurs pour plusieurs applications accédant à une base de données :

- s'il s'agit d'une application web, les couleurs s'affichent sur 6 caractères alphanumériques de la base hexadécimale,
- s'il s'agit d'une application lourde, elle peut interpréter les couleurs comme un entier qui est la somme RVB, ou bien sous forme hexadécimale.

Voyons comment gérer cela simplement ...

[Suite:]

Voici une table qui fera tous les calculs automatiquement à partir des trois composantes RVB :

--------------------------------- 
-- Nicolas SOUQUET - 03/07/2009 -  
--------------------------------- 
CREATE TABLE TbCouleur 

  IDCouleur INT NOT NULL IDENTITY CONSTRAINT PK_TbCouleur PRIMARY KEY, 
  nomCouleur VARCHAR(10) NOT NULL CONSTRAINT UQ_TbCouleur_nomCouleur UNIQUE, 
  composanteRouge TINYINT, 
  composanteVert TINYINT, 
  composanteBleu TINYINT, 
  Decimale AS (composanteRouge + composanteVert * 256 + composanteBleu * 256 * 256) PERSISTED NOT NULL, 
  Hexadecimale AS (CAST(composanteRouge + composanteVert * 256 + composanteBleu * 256 * 256 AS VARBINARY(3))) PERSISTED NOT NULL, 
  HTML AS (dbo.Fn_RVB_To_HTML(composanteRouge, composanteVert, composanteBleu)) PERSISTED NOT NULL, 
  CONSTRAINT UQ_TbCouleur_composanteRouge_composanteVert_composanteBleu UNIQUE (composanteRouge, composanteVert, composanteBleu) 
)

L'utilisation de colonnes calculées (persistées, mais ce n'est pas obligatoire !) pour faire effectuer tous les calculs au moteur de base de données rend très simple toute saisie de nouvelles couleurs.

Pour calculer le codage HTML, nous utilisons la fonction suivante, dont le code est un peu barbare, mais efficace :

--------------------------------- 
-- Nicolas SOUQUET - 03/07/2009 -  
--------------------------------- 
CREATE FUNCTION Fn_RVB_To_HTML 
  ( 
    @rouge TINYINT, 
    @vert TINYINT, 
    @bleu TINYINT 
  ) 
  RETURNS CHAR(6) 
  WITH SCHEMABINDING 
AS 
BEGIN 
  RETURN 
  ( 
    CASE @rouge / 16 
      WHEN 0 THEN '0' 
      WHEN 1 THEN '1' 
      WHEN 2 THEN '2' 
      WHEN 3 THEN '3' 
      WHEN 4 THEN '4' 
      WHEN 5 THEN '5' 
      WHEN 6 THEN '6' 
      WHEN 7 THEN '7' 
      WHEN 8 THEN '8' 
      WHEN 9 THEN '9' 
      WHEN 10 THEN 'A' 
      WHEN 11 THEN 'B' 
      WHEN 12 THEN 'C' 
      WHEN 13 THEN 'D' 
      WHEN 14 THEN 'E' 
      WHEN 15 THEN 'F' 
    END + 
    CASE @rouge % 16 
      WHEN 0 THEN '0' 
      WHEN 1 THEN '1' 
      WHEN 2 THEN '2' 
      WHEN 3 THEN '3' 
      WHEN 4 THEN '4' 
      WHEN 5 THEN '5' 
      WHEN 6 THEN '6' 
      WHEN 7 THEN '7' 
      WHEN 8 THEN '8' 
      WHEN 9 THEN '9' 
      WHEN 10 THEN 'A' 
      WHEN 11 THEN 'B' 
      WHEN 12 THEN 'C' 
      WHEN 13 THEN 'D' 
      WHEN 14 THEN 'E' 
      WHEN 15 THEN 'F' 
    END + 
    CASE @vert / 16 
      WHEN 0 THEN '0' 
      WHEN 1 THEN '1' 
      WHEN 2 THEN '2' 
      WHEN 3 THEN '3' 
      WHEN 4 THEN '4' 
      WHEN 5 THEN '5' 
      WHEN 6 THEN '6' 
      WHEN 7 THEN '7' 
      WHEN 8 THEN '8' 
      WHEN 9 THEN '9' 
      WHEN 10 THEN 'A' 
      WHEN 11 THEN 'B' 
      WHEN 12 THEN 'C' 
      WHEN 13 THEN 'D' 
      WHEN 14 THEN 'E' 
      WHEN 15 THEN 'F' 
    END + 
    CASE @vert % 16 
      WHEN 0 THEN '0' 
      WHEN 1 THEN '1' 
      WHEN 2 THEN '2' 
      WHEN 3 THEN '3' 
      WHEN 4 THEN '4' 
      WHEN 5 THEN '5' 
      WHEN 6 THEN '6' 
      WHEN 7 THEN '7' 
      WHEN 8 THEN '8' 
      WHEN 9 THEN '9' 
      WHEN 10 THEN 'A' 
      WHEN 11 THEN 'B' 
      WHEN 12 THEN 'C' 
      WHEN 13 THEN 'D' 
      WHEN 14 THEN 'E' 
      WHEN 15 THEN 'F' 
    END + 
    CASE @bleu / 16 
      WHEN 0 THEN '0' 
      WHEN 1 THEN '1' 
      WHEN 2 THEN '2' 
      WHEN 3 THEN '3' 
      WHEN 4 THEN '4' 
      WHEN 5 THEN '5' 
      WHEN 6 THEN '6' 
      WHEN 7 THEN '7' 
      WHEN 8 THEN '8' 
      WHEN 9 THEN '9' 
      WHEN 10 THEN 'A' 
      WHEN 11 THEN 'B' 
      WHEN 12 THEN 'C' 
      WHEN 13 THEN 'D' 
      WHEN 14 THEN 'E' 
      WHEN 15 THEN 'F' 
    END + 
    CASE @bleu % 16 
      WHEN 0 THEN '0' 
      WHEN 1 THEN '1' 
      WHEN 2 THEN '2' 
      WHEN 3 THEN '3' 
      WHEN 4 THEN '4' 
      WHEN 5 THEN '5' 
      WHEN 6 THEN '6' 
      WHEN 7 THEN '7' 
      WHEN 8 THEN '8' 
      WHEN 9 THEN '9' 
      WHEN 10 THEN 'A' 
      WHEN 11 THEN 'B' 
      WHEN 12 THEN 'C' 
      WHEN 13 THEN 'D' 
      WHEN 14 THEN 'E' 
      WHEN 15 THEN 'F' 
    END 
  ) 
END

Ainsi l'ajout d'une nouvelle couleur dans la table se fait simplement :

--------------------------------- 
-- Nicolas SOUQUET - 03/07/2009 -  
--------------------------------- 
INSERT INTO dbo.TbCouleur(nomCouleur, composanteRouge, composanteVert, composanteBleu) VALUES ('Blanc', 255, 255, 255) 
INSERT INTO dbo.TbCouleur(nomCouleur, composanteRouge, composanteVert, composanteBleu) VALUES ('Noir', 0, 0, 0) 
INSERT INTO dbo.TbCouleur(nomCouleur, composanteRouge, composanteVert, composanteBleu) VALUES ('Gris', 190, 190, 190) 
INSERT INTO dbo.TbCouleur(nomCouleur, composanteRouge, composanteVert, composanteBleu) VALUES ('Rouge', 255, 0, 0) 
INSERT INTO dbo.TbCouleur(nomCouleur, composanteRouge, composanteVert, composanteBleu) VALUES ('Vert', 0, 255, 0) 
INSERT INTO dbo.TbCouleur(nomCouleur, composanteRouge, composanteVert, composanteBleu) VALUES ('Bleau', 0, 0, 255) 
INSERT INTO dbo.TbCouleur(nomCouleur, composanteRouge, composanteVert, composanteBleu) VALUES ('Jaune', 255, 255, 0) 
INSERT INTO dbo.TbCouleur(nomCouleur, composanteRouge, composanteVert, composanteBleu) VALUES ('Orange', 255, 165, 0) 
INSERT INTO dbo.TbCouleur(nomCouleur, composanteRouge, composanteVert, composanteBleu) VALUES ('Rose', 255, 192, 203) 
INSERT INTO dbo.TbCouleur(nomCouleur, composanteRouge, composanteVert, composanteBleu) VALUES ('Violet', 238, 130, 238)

ou encore à l'aide de la procédure stockée suivante :

--------------------------------- 
-- Nicolas SOUQUET - 03/07/2009 -  
--------------------------------- 
CREATE PROCEDURE Ps_Couleur_Ajouter 
  @nomCouleur VARCHAR(10), 
  @composanteRouge TINYINT, 
  @composanteVert TINYINT, 
  @composanteBleu TINYINT 
AS 
BEGIN 
  INSERT INTO dbo.TbCouleur 
  ( 
    nomCouleur, 
    composanteRouge, 
    composanteVert, 
    composanteBleu 
  ) 
  VALUES 
  ( 
    @nomCouleur, 
    @composanteRouge, 
    @composanteVert, 
    @composanteBleu 
  ) 
END

Et pour ajouter les couleurs :

--------------------------------- 
-- Nicolas SOUQUET - 03/07/2009 -  
--------------------------------- 
EXEC dbo.Ps_Couleur_Ajouter 'Blanc', 255, 255, 255 
EXEC dbo.Ps_Couleur_Ajouter 'Noir', 0, 0, 0 
EXEC dbo.Ps_Couleur_Ajouter 'Gris', 190, 190, 190 
EXEC dbo.Ps_Couleur_Ajouter 'Rouge', 255, 0, 0 
EXEC dbo.Ps_Couleur_Ajouter 'Vert', 0, 255, 0 
EXEC dbo.Ps_Couleur_Ajouter 'Bleau', 0, 0, 255 
EXEC dbo.Ps_Couleur_Ajouter 'Jaune', 255, 255, 0 
EXEC dbo.Ps_Couleur_Ajouter 'Orange', 255, 165, 0 
EXEC dbo.Ps_Couleur_Ajouter 'Rose', 255, 192, 203 
EXEC dbo.Ps_Couleur_Ajouter 'Violet', 238, 130, 238

Et le résultat est le suivant :

Les trois fonctions suivantes permettent d'obtenir la couleur souhaitée dans la représentation qui conviendra suivant l'application :

----------------------------------------------------- 
-- Nicolas SOUQUET - 03/07/2009 - Fn_Couleur_GetRVB - 
----------------------------------------------------- 
CREATE FUNCTION Fn_Couleur_GetRVB 
  (@nomCouleur VARCHAR(10)) 
RETURNS TABLE 
WITH SCHEMABINDING 
AS 
RETURN 

  SELECT composanteRouge AS R, 
      composanteVert AS V, 
      composanteBleu AS B 
  FROM dbo.TbCouleur 
  WHERE nomCouleur = @nomCouleur 

 
------------------------------------------------------ 
-- Nicolas SOUQUET - 03/07/2009 - Fn_Couleur_GetHTML - 
------------------------------------------------------ 
CREATE FUNCTION Fn_Couleur_GetHTML 
  (@nomCouleur VARCHAR(10)) 
  RETURNS CHAR(6) 
  WITH SCHEMABINDING 
AS 
BEGIN 
  RETURN 
  ( 
    SELECT HTML 
    FROM dbo.TbCouleur 
    WHERE nomCouleur = @nomCouleur 
  ) 
END 
 
---------------------------------------------------------- 
-- Nicolas SOUQUET - 03/07/2009 - Fn_Couleur_GetDecimale - 
---------------------------------------------------------- 
CREATE FUNCTION Fn_Couleur_GetDecimale 
  (@nomCouleur VARCHAR(10)) 
  RETURNS INT 
  WITH SCHEMABINDING 
AS 
BEGIN 
  RETURN 
  ( 
    SELECT Decimale 
    FROM dbo.TbCouleur 
    WHERE nomCouleur = @nomCouleur 
  ) 
END 
 
-------------------------------------------------------------- 
-- Nicolas SOUQUET - 03/07/2009 - Fn_Couleur_GetHexadecimale - 
-------------------------------------------------------------- 
CREATE FUNCTION Fn_Couleur_GetHexadecimale 
  (@nomCouleur VARCHAR(10)) 
  RETURNS VARBINARY(3) 
  WITH SCHEMABINDING 
AS 
BEGIN 
  RETURN 
  ( 
    SELECT Hexadecimale 
    FROM dbo.TbCouleur 
    WHERE nomCouleur = @nomCouleur 
  ) 
END 

On peut ensuite envisager le code d'une procédure comme suit :

--------------------------------- 
-- Nicolas SOUQUET - 03/07/2009 -  
--------------------------------- 
CREATE PROCEDURE maProcedure 
  @... 
  @application 
AS 
BEGIN 
  SELECT CASE ETAT 
        WHEN uneValeur THEN CASE @application 
                    WHEN 'HTML' THEN dbo.Fn_Couleur_GetHTML('Rouge') 
                    WHEN 'EXE' THEN dbo.Fn_Couleur_GetDecimale('Rouge') 
                  END 
        ELSE CASE @application 
            WHEN 'HTML' THEN dbo.Fn_Couleur_GetHTML('Blanc') 
            WHEN 'EXE' THEN dbo.Fn_Couleur_GetDecimale('Blanc') 
          END 
      END 
  FROM dbo.TbEtat AS ETAT 
END

Bien sûr il est préférable de stocker les divers états possibles dans une table et de gérer le CASE avec la valeur de clé de la table.
On peut également penser à récupérer une représentation d'une couleur à partir d'une autre ...

ElSuket

Social Bookmarking:

                                     

Commentaires, Pingbacks:

Connectez-vous pour vous abonner à cet article:

Flux de commentaires pour cet article : Atom 1.0  RSS 2.0

Cet article n'a pas de Commentaires/Pingbacks pour le moment...

Vous devez être identifié pour poster un commentaire.

Liste des blogs

Le blog d'ElSuket

ElSüket

Rechercher

<  Décembre 2011  >
Lun Mar Mer Jeu Ven Sam Dim
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

Liens

Indexation

  • [SGBD][SQL Server] Différence entre fragmentation interne et externe d'un index

    Quand on parle de la fragmentation physique des indexes, on parle aussi de fragmentation externe. Celle-ci se "produit" lorsque l'ordre logique des pages de l'index est incorrect. Les nouvelles valeurs de clé de l'index sont alors insérées dans de nouvelles pages d'index, qui désordonnent l'ordre original de la clé de l'index.

    Quand on parle de fragmentation logique de l'index, on parle aussi de fragmentation interne : c'est le cas lorsque la quantité de données stockée dans les pages de l'index est plus petite que la quantité maximale de données que peut stocker une page.

    ElSuket

    Permalien
  • [.NET][SGBD][SQL Server] Lister les caractéristiques des indexes sous SQL Server 2005 et 2008

    Voici une requête qui nous permet de retrouver pour tout index :

    - la liste de ses colonnes clé
    - la liste de ses colonnes incluses
    - la définition de son filtre
    - le script de création de cet index

    ]suite

    Permalien
  • [SGBD][SQL Server] Lister les colonnes des index d'une base de données

    Voici une petite requête qui permet de lister les colonnes de tous les index d'une base de données, avec leur type et l'ordre des colonnes dans la clé de l'index :
    ]suite

    Permalien
  • [SGBD][SQL Server] Purge du cache de plans

    Il est possible qu'un jour vous trouviez dans les journaux de SQL Server le libellé suivant :

    SQL Server has encountered n occurrence(s) of cachestore flush for the (partie du cache de plans) cachestore due to some database maintenance or reconfigure operations"

    Ce message n'apparaît qu'à partir du SP2 de SQL Server 2005, et il est écrit par intervalles de 5 minutes.
    La purge du cache de plans peut se produire dans les cas suivants :
    ]suite

    Permalien
  • [SGBD][SQL Server] Recherche d'indexes manquants sous SQL Server 2005

    Une nouvelle fonctionnalité intéressante, introduite avec SQL Server 2005, est la recherche d’indexes manquants.
    Elle permet, de façon très simple, de trouver les indexes manquants qui pourraient simplifier le travail
    du moteur de base de données s’ils étaient posés sur des tables de base ou des vues indexées.
    Néanmoins, cette fonctionnalité comporte quelques limitations, qui doivent être prise en compte avant qu’on
    ait décidé de créer l’index conseillé par SQL Server.
    Comme vous le verrez, plusieurs sujets sont connexes à cet article, mais nous ne les aborderons pas ici.
    Ils seront l’objet de prochains articles.

    ]suite

    Permalien
  • [.NET][SGBD][SQL Server] Rechercher les index inutiles

    Si les index représentent l'optimisation la plus simple à mettre en place, on souhaite néanmoins conserver le minimum d'entre-eux, car leur maintenance lors de l'exécution de requêtes de modifications de données (INSERT, UPDATE, DELETE) peut être coûteuse, surtout sur des tables volumineuses.
    Voyons comment collecter cette information ...
    ]suite

    Permalien
  • [.NET][SGBD][SQL Server] Une procédure pour connaître l'état physique et l'utilisation des index

    Voici une petite procédure stockée qui permet de connaître l'état physique des index (nombre de pages du niveau feuille, fragmentation et taux d'utilisation des pages) en même temps que la façon dont ils sont utilisés (nombres de seeks et de scans, ...).

    Elle est utilisable pour collecter ces statistiques sur l'ensemble d'une base de données, ou bien sur une table en particulier
    ]suite

    Permalien
  • [SGBD][SQL Server] Une procédure stockée pour défragmenter les indexes sous SQL Server 2005 et ultérieur

    Voici une petite procédure stockée que l'on peut exécuter régulièrement dans un job pour défragmenter les indexes de toutes les bases de données, en fixant les seuils de nombre de page et de pourcentage moyen de fragmentation

    ]suite

    Permalien
  • [SGBD][SQL Server] [Agent SQL Server] Gestion de l'historique

    Outre sa principale fonctionnalité de gestion d'exécutions, l'Agent SQL Server comporte quelques fonctionnalités intéressantes concernant la gestion de son historique.
    ]suite

    Permalien

Snippets

  • [SGBD][SQL Server] Calculer le Buffer Cache Hit Ratio

    S'il est une valeur intéressante à suivre pour le performances d'un serveur, c'est bien le Buffer Cache Hit Ratio, ou Taux d'accès au cache des tampons, car celui-ci est un rapport du nombre de pages lues en RAM par rapport au nombre de pages lues à partir des disques.

    Voici une petite requête pour trouver sa valeur :

    ]suite

    Permalien
  • [SGBD][SQL Server] Caractériser une adresse IP

    Voici une procédure stockée pour :

    - vérifier une adresse IP
    - chercher si celle-ci est privée
    - chercher la classe de cette adresse IP

    ]suite

    Permalien
  • [SGBD][SQL Server] Comment exécuter une procédure stockée dès le démarrage de SQL Server ?

    Nous allons voir comment on peut exécuter n'importe quelle procédure stockée dès le démarrage de SQL Server, à l'aide de la procédure stockée sp_procoption

    ]suite

    Permalien
  • [SGBD][SQL Server] Concaténer les valeurs d'une colonne dans une variable

    Il est souvent demandé s'il est possible de concaténer les valeurs d'une colonne dans une variable, éventuellement en les séparant avec un symbole de ponctuation.
    Voici comment faire, sans curseur ni expression de table commune ...
    ]suite

    Permalien
  • [SGBD][SQL Server] Connaître l'état d'un service : xp_servicecontrol

    Comment connaître simplement l'état d'un service ?
    Est-il possible d'arrêter et de démarrer un service avec une requête ?

    ]suite

    Permalien
  • [SGBD][SQL Server] Consulter l'historique des restaurations de bases de données

    Voici une petite requête qui permet de voir toutes les restaurations de bases de données d'une instance ...

    ]suite

    Permalien
  • [SGBD][SQL Server] Créer une table de dates

    Pourquoi ne pas créer une table de dates pour se faciliter les recherches dans des tables suivant la colonne de type date qu'elles contiennent ?
    On peut vous demander par exemple de rechercher la quantité d'eau consommée par un parc de machines pour la deuxième semaine de chaque mois d'une année.
    Imaginez un peu la complexité de la requête à écrire ...
    Voyons comment on peut résoudre cette demande très facilement en créant une table de dates ...

    ]suite

    Permalien
  • [SGBD][SQL Server] Découper une chaîne en sous-chaînes de longueur fixe

    Certains me désignent sur le forum SQL Server comme l'homme qui murmure à l'oreille des CTE.
    En voici donc une nouvelle !

    ]suite

    Permalien
  • [SGBD][SQL Server] Détecter un caractère unicode dans une chaîne de caractères

    Voici une petite fonction qui permet de vérifier la présence d'un caractère qui n'est pas supporté par la norme ASCII dans une chaîne de caractères ...

    ]suite

    Permalien
  • [SGBD][SQL Server] Exemples d'affectations de variables en ligne sous SQL Server 2008

    Voici quelques exemples simples de code qui montrent que sous SQL Server 2008, on peut non seulement se passer des sempiternelles deux lignes de code nécessaires jusqu'en version 2005 pour déclarer et affecter d'un valeur une variable, mais on peut aller encore plus loin ...

    ]suite

    Permalien
  • [SGBD][SQL Server] Exporter le code de vues, procédures stockées, triggers, fonctions SQL vers un fichier

    Pour effectuer une revue de code ou pour gérer des versions de code en phase de développement, il peut être intéressant d'exporter les codes des modules SQL vers un fichier.
    Voyons comment réaliser cela, à l'aide de l'utilitaire en ligne de commande BCP ...

    ]suite

    Permalien

Syndiquez ce blog XML

Articles :

Commentaires :

 
 
 
 
Partenaires

Hébergement Web