L'altro giorno ho avuto l'esigenza di
generare dei codici colore direttamente dalla fonte dati, per comodità e prestazioni. La fonte dati era composta da un grosso numero di dati e dovevo generare dei gradienti di colore per rappresentare dei dati in maniera visuale su delle mappe.
Per fare questa cosa
ho normalizzato i miei numeri in una scala da 0 a 255 in modo da poterlo convertire facilmente in un codice colore HTML e metterlo direttamente in pagina. Per poter fare questo occorre poter trasformare i numeri dalla base decimale a quella
esadecimale, in quanto in HTML i codici colori sono scritti come come una tripletta di numeri esadecimali.
Ad esempio
il rosso viene scritto con il seguente codice #FF0000. In html i
colori vengono espressi come combinazione delle tre componenti fondamentali, il rosso, il verde e il blu, conosciuta anche come RGB o tricromia. Quindi nell'esempio precedente i primi due caratteri dopo il # (cancelletto) rappresentano il valore della componente rossa (FF ovvero 255, valore massimo), mentre i secondi due caratteri rappresentano la componente verde (00 ovvero 0, valore minimo) ed infine i terzi due caratteri rappresentano la componente blu (00 ovvero 0, valore minimo).
Quindi il nostro problema è di prendere un numero è di convertirlo in una stringa esadecimale. Per fare questo possiamo utilizzare in TSQL (l'sql di SQL Server) una funzione non documentata che si chiama sys.fn_varbintohexstr. Questa funzione prende in input un numero e restituisce in output una stringa con la sua rappresentazione esadecimale.
Ad esempio se eseguo questa SQL
SELECT sys.fn_varbintohexstr(255)
Ottengo come risultato 0x000000ff.
Nel nostro caso specifico, ci serve un numero esadecimale a due cifre e quindi dobbiamo prendere gli ultimi due caratteri di questa stringa.
SELECT RIGHT(sys.fn_varbintohexstr(@Numero),2)
dove @Numero sarà il numero da 0 a 255 che vogliamo convertire.
In conclusione se voglio rappresentare un mio dato (come abbiamo detto già normalizzato in un valore da 0 a 255) con un gradiente di colore rosso, quello che dovrò scrivere è
SELECT '#' + RIGHT(sys.fn_varbintohexstr(@NumeroNormalizzato),2) + '0000'
In questo modo otterrò un codice colore HTML dipendente dal dato che voglio visualizzare.
Happy coding. :-)