viernes, 24 de julio de 2015

Generar secuencias hexadecimales para usar como códigos alfanuméricos en MySQL

Diseñando una tabla para almacenar documentos, se encontró que la cantidad de registros que se requería almacenar era bastante considerable. Eso no representaba un problema en realidad. La dificultad era como generar los código correspondientes, tomando en cuenta que requería que dichos códigos comenzaran con los caracteres DOC seguido de una secuencia numérica, y obtener la menor longitud máxima de siete caracteres.
Si se hace uso de cuatro dígitos decimales, es posible obtener hasta diez mil códigos: desde DOC0000 hasta DOC9999.
Considerando que el código ya tenía una estructura alfanumérica, por qué no usar cuatro dígitos hexadecimales y obtener así un mayor número de códigos, en lugar de usar cuatro dígitos decimales.
De lo anterior, se deduce que es posible generar hasta 65535 códigos: desde DOC0000 hasta DOCFFFF, aumentando considerablemente la cantidad de códigos y usando la misma cantidad de dígitos.
Para la generación automática del código, se toma la parte numérica del último registro y se le suma uno. Cuando la tabla esta vacía, se asigna de forma directa el código DOC0001 al primer registro que se agregue a la tabla.
Se crea una variable en MySQL de tipo VARCHAR, con una longitud de siete caracteres.
DECLARE docCode VARCHAR(7);
Se consulta el último código almacenado en la tabla y se le asigna a la variable docCode. Mediante el uso de un IF, se determina si debe generarse un nuevo código o si debe asignarse el DOC0001
IF docCode IS NULL THEN
 SET docCode = 'DOC0001';
ELSE
 SET docCode = //instrucción para generar el código
END IF;
Para la convertir los códigos de decimal a hexadecimal y viceversa, se hace uso de la función CONV que incluye MySQL.
CONV(N,from_base,to_base)
Convierte números entre diferentes bases numéricas. Retorna una representación de cadena de carácters para el número N, convertido de base from_base a base to_base. Retorna NULL si algún argumento es NULL. El argumento N se interpreta como entero, pero puede especificarse como un entero o cadena. La base mínima es 2 y la máxima es 36. Su to_base es un número negativo, N se trata como un número con signo. De otro modo, N se trata como sin signo. CONV() funciona con precisión de 64-bit.
Para obtener el último registro se hace uso de la función MAX y, para separar la parte numérica, se hace uso de RIGHT.
En este caso, la tabla se llama documents y el campo correspondiente al código se llama idCode.
A continuación, el código completo:
BEGIN
 DECLARE docCode VARCHAR(7);
 SET docCode = (SELECT CONV(MAX(RIGHT(documents.idCode,4)),16,10)+1 FROM documents);
 IF docCode IS NULL THEN
  SET docCode = 'DOC0001';
 ELSE
  SET docCode = CONCAT('DOC',REPEAT('0',4-LENGTH(docCode)),CONV(docCode,10,16));
 END IF;

//Aquí continua con el INSERT
END;  

No hay comentarios.:

Publicar un comentario