En el Perú los formatos numéricos de las facturas es 001-000033 , la serie (001) cambia eventualmente pero el valor auto-incrementado es el mismo:
001-000034 001-000035 001-000036 ...
Para manejar esto en MySQL he preparado una solución basada en otro articulo mio:
- Crear la tabla para guardar los números actuales:
create table _sequence ( seq_name varchar(50) not null primary key, seq_group varchar(10) not null, seq_val int unsigned not null );
- Crear una función para obtener el valor siguiente e incrementarlo:
delimiter // drop function if exists getNextCustomSeq// create function getNextCustomSeq ( sSeqName varchar(50), sSeqGroup varchar(10) ) returns varchar(20) begin declare nLast_val int; set nLast_val = (select seq_val from _sequence where seq_name = sSeqName and seq_group = sSeqGroup); if nLast_val is null then set nLast_val = 1; insert into _sequence (seq_name,seq_group,seq_val) values (sSeqName,sSeqGroup,nLast_Val); else set nLast_val = nLast_val + 1; update _sequence set seq_val = nLast_val where seq_name = sSeqName and seq_group = sSeqGroup; end if; set @ret = (select concat(sSeqGroup,'-',lpad(nLast_val,6,'0'))); return @ret; end// delimiter ;
- Crear un procedimiento almacenado para modificar el valor actual:
delimiter // drop procedure if exists sp_setSeqCustomVal// create procedure sp_setCustomVal(sSeqName varchar(50), sSeqGroup varchar(10), nVal int unsigned) begin if (select count(*) from _sequence where seq_name = sSeqName and seq_group = sSeqGroup) = 0 then insert into _sequence (seq_name,seq_group,seq_val) values (sSeqName,sSeqGroup,nVal); else update _sequence set seq_val = nVal where seq_name = sSeqName and seq_group = sSeqGroup; end if; end// delimiter ;
Haciendo algunas pruebas:
- Crear una tabla:
create table custom_autonums ( id int not null primary key auto_increment, seq_1 varchar(20), -- custom sequence 1 seq_2 varchar(20), -- custom sequence 2 unique(seq_1), unique(seq_2) );
- Crear un trigger para la tabla:
delimiter // drop trigger if exists custom_autonums_bi// create trigger custom_autonums_bi before insert on custom_autonums for each row begin set new.seq_1 = getNextCustomSeq("seq_1","001"); set new.seq_2 = getNextCustomSeq("seq_2","DBA"); end// delimiter ;
- Insertando algunos valores:
insert into custom_autonums (id) values (null),(null),(null); select * from custom_autonums; +----+------------+------------+ | id | seq_1 | seq_2 | +----+------------+------------+ | 4 | 001-000001 | DBA-000001 | | 5 | 001-000002 | DBA-000002 | | 6 | 001-000003 | DBA-000003 | +----+------------+------------+ 3 rows in set (0.00 sec)
- Alterando los valores actuales:
call sp_setCustomVal('seq_1','001',675); insert into custom_autonums (id) values (null),(null),(null); select * from custom_autonums; +----+------------+------------+ | id | seq_1 | seq_2 | +----+------------+------------+ | 4 | 001-000001 | DBA-000001 | | 5 | 001-000002 | DBA-000002 | | 6 | 001-000003 | DBA-000003 | | 7 | 001-000676 | DBA-000004 | | 8 | 001-000677 | DBA-000005 | | 9 | 001-000678 | DBA-000006 | +----+------------+------------+ 6 rows in set (0.00 sec)
Enjoy!