TITULO: Función Decode

DESCRIPCION:  Decodifica el Valor pasado como parámetro Valor de acuerdo a los valores pasados en matrizValores.

Permite pasar valores de cualquier tipo, puesto que los parámetros y la propia Funcion están declarados como Variant.

 

EXPLICACION:

En el Sql que manejamos en el trabajo (yo ni soy ni trabajo de informático, pero hago mis pinitos) existe una funcion llamada Decode que me he acostumbrado a utilizar porque me resulta muy práctica.

 

En Access no existe y en mas de una ocasión la he echado de menos, así que me he puesto y he intentado emular el comportamiento de dicha función. No es que con Access no se pueda hacer lo que hace esta función, a base de Iif o de Select Case se puede hacer perfectamente pero, aparte de que como he comentado, ya me había acostumbrado a utilizarla, es que me da la impresión de que con ella se pueden simplificar mucho algunos codigos.

 

Como muestra un boton: como algunos sabreis, el sistema de calificaciones universitario está volviendo a cambiar, hasta hace poco se ha utilizado un sistema de calificaciones a base de literales (supenso, aprobado, notable, sobresaliente y Matricula). Cuando había que calcular la calificacion media se hacia traduciendo esas notas por un valor de 0 a 4 respectivamente. Como resultado las notas medias eran del tipo de 1,27, 3,42 ... 4 la calificacion media máxima. Pues bien. ahora hemos cambiado a un sistema de calificaciones numericas de 0 a 10 con un decimal, y las notas medias son del tipo 5,54, 9,42 ... 10 (maximo). Si necesitamos trasladar las notas medias antiguas a su equivalente en el nuevo sistema nos encontramos que para hacerlo con Access, un torpon como yo, no ha encontrado otra forma de hacerlo que esta:

 

Dim nb As Byte 'nota base

Dim ni As Byte 'rango de puntos correspondientes en el sistema 0-10 a los decimales del sistema 0-4

 

Select Case Int(Me.NotaOriginal)

    Case 0

        nb = 0

        ni = 5

    Case 1

        nb = 5

        ni = 2

    Case 2

        nb = 7

        ni = 2

    Case 3

        nb = 9

        ni = 1

    Case 4

        nb = 10

        ni = 0

End Select

 

Me.NotaFinal = Round(nb + ((Me.NotaOriginal - Int(Me.NotaOriginal)) * ni), 2)

 

O anidar una serie de Iif que hicieran lo mismo

 

Sin embargo, con esta función Decode, la cosa puede quedar así:

 

Me.NotaFinal = Decode(Int(Me.NotaOriginal), 10, 0, Me.Nota * 5, 1, 5 + ((Me.NotaOriginal - 1) * 2), 2, 7 + ((Me.NotaOriginal - 2) * 2), 3, 9 + Me.NotaOriginal - 3)

 

De la misma forma, resulta muy práctica su utilizacion en Sql para obtener estadísticas: por ejemplo, tenemos una tabla de datos personales que incluye el codigo postal o la provincia de residencia, pero no nos interesa obtener como resultado las 52 provincias con su numero de residentes, sino solamente saber cuantos son los dos o tres determinadas provincias:

 

SELECT decode([Prov],"Otras",18,"Granada",29,"Malaga") AS Provincia, Count(DNI) AS NumAlum

FROM Alumnos

GROUP BY decode([Prov],"Otras",18,"Granada",29,"Malaga");

 

 

En fin, Espero que sea de utilidad

                                               Marciano, Octubre de 2006