Saludos a Todos y Feliz Inicio de Semana!
Quiero compartir con ustedes una rutina que genera un código consecutivo alfanumérico de cualquier tabla que se pase por parametro:
Esto lo pueden usar para generar códigos de referencia por ejemplo para tablas de clientes o catalogos de productos, también si quieren lo pueden usar como generador de códigos unicos ya que es un procedimiento almacenado pero para eso existen los ID's asi que queda a su criterio.
El código es el siguiente:
DELIMITER $$
USE `test`$$
DROP PROCEDURE IF EXISTS `generar_codigo`$$
CREATE PROCEDURE `generar_codigo`(IN p_tabla VARCHAR(20),IN p_campo VARCHAR(20),IN p_codigo VARCHAR(20), IN p_ancho INT(20), IN p_valida INT(2), OUT result VARCHAR(250))
BEGIN
DECLARE cadalf VARCHAR(20) DEFAULT '';
DECLARE valnum TINYINT(2) DEFAULT 0;
DECLARE pos TINYINT(2) DEFAULT 0;
DECLARE bien BOOLEAN DEFAULT FALSE;
DECLARE tope INTEGER(20) DEFAULT 0;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET @retorno = NULL;
/*Verifico si el código existe en base de datos*/
SET @query = CONCAT("select ",p_campo," into @retorno from ", p_tabla, " where ",p_campo," = '",p_codigo,"' limit 1");
PREPARE stmt1 FROM @query;
EXECUTE stmt1;
SET result = @retorno;
DEALLOCATE PREPARE stmt1;
SET result := IFNULL(result,'');
IF p_valida = 1 THEN
/*Si el código existe entonces se retorna -1*/
SET result := IF(result <> '',-1,result);
ELSE
IF LENGTH(p_codigo) = p_ancho THEN
SET result := IF(result <> '',-1,result);
ELSE
WHILE pos <= p_ancho DO
SET pos := pos + 1;
SET cadalf := CONCAT(cadalf,SUBSTRING(p_codigo,pos,1));
END WHILE;
SET p_codigo := '';
SET tope := CONVERT(REPEAT('9', p_ancho - LENGTH(TRIM(cadalf))),UNSIGNED INTEGER);
WHILE (bien = FALSE) AND (valnum <= tope) DO
SET valnum := valnum + 1;
SET p_codigo := CONCAT(TRIM(cadalf),LPAD(TRIM(CONVERT(valnum,CHAR)),p_ancho-LENGTH(TRIM(cadalf)),'0'));
/*Verifico si el código existe en base de datos*/
SET @query2 = CONCAT("select ",p_campo," into @retorno from ", p_tabla, " where ",TRIM(p_campo)," = '",TRIM(p_codigo),"' limit 1");
PREPARE stmt2 FROM @query2;
EXECUTE stmt2;
SET result = @retorno;
DEALLOCATE PREPARE stmt2;
SET result := IFNULL(result,'');
SET bien := IF(result = '',TRUE,FALSE);
END WHILE;
IF bien = FALSE THEN
SET result = -2;
SET p_codigo := '';
ELSE
SET result = p_codigo;
END IF;
END IF;
END IF;
END$$
DELIMITER ;
*******************************************************************************
PARAMETROS:
NOMBRE FLUJO TIPO LONGITUD
p_tabla entrada varchar 20
p_campo entrada varchar 20
p_codigo entrada varchar 20
p_ancho entrada varchar 20
p_valida entrada int 2
result salida varchar 250
P_TABLA => Nombre de la tabla a procesar.
P_CAMPO=> Campo a generar el código (DEBE SER VARCHAR O CHAR)
P_CODIGO => Este tiene varias funciones.
1. Si quieren que la rutina genere un código consecutivo nuevo entonces deben dejarlo en blanco.
2. Si quieren enviar un código y verificar si existe en la tabla entonces pasen el código y lleven el parametro P_VALIDA a 1.
3. Si quieren generar un correlativo con un PREFIJO entonces pasen el prefijo solamente: ejemplo: CLI para que devuelva CLI001 por ejemplo.
P_ANCHO => Ancho del código a generar. No debe ser mayor que el ancho del campo en la tabla. El código resultante será un ZEROFILL.
P_VALIDA => Solo para validar si existe algún código en la tabla. DEBE ENVIARSE EN 1 Y LLENARSE P_CODIGO. Si quieren solamente generar el código entonces lleven a cero el parametro.
RESULT => retorna el código resultante o -1 si el código ya existe en la tabla (aplica solo para P_VALIDA = 1)
USO DEL PROCEDIMIENTO:
Un ejemplo desde la consola sería el siguiente:
1. CALL generar_codigo('cliente','codcli',' ',6,0,@result);
2. SELECT @result AS resultado;
1. Realizamos la llamada al procedimiento pasando sus parámetros. Para este ejemplo solo quiero que me genere el próximo correlativo de la tabla cliente. El campo se llama CODCLI y es VARCHAR(6)
2. Muestro en pantalla el resultado del procedimiento. el resultado puede ser por ejemplo 000001
Si quiero generar correlativos con PREFIJOS entonces:
1. CALL generar_codigo('cliente','codcli','CLI',6,0,@result);
El resultado sería CLI001 por ejemplo.
********************************************************************************
Eso sería todo colegas!
Saludos y espero que les sea de utilidad.
--
Ing. Irwin Rodríguez
Consultor Informático
"Las ideas son fuerzas intangibles, pero tienen más poder que el cerebro físico de donde nacen. Tienen el poder de seguir viviendo, aún después de que el cerebro que las ha creado haya regresado al polvo"
NOTA: La información mostrada en este mensaje es de caracter Confidencial y está dirigida unicamente a los contactos señalados en el encabezado; si el lector de este correo no es el destinatario del mismo,
se le notifica que cualquier copia o distribución queda totalmente
prohibida. Si usted ha recibido este mensaje por error, por favor
notifique inmediatamente al remitente por este mismo medio y bórrelo de su sistema.