Valores auto_increment personalizados

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:

  1. 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
    );
  2. 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 ;
  3. 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:

  1. 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)
    );
  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 ;
  3. 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)
  4. 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!

Instalar bmon como servicio

bmon es una herramienta para monitorear el estado de red actual, es muy útil para saber que cantidad del ancho de banda esta siendo utilizado en ese momento.

Lo mas útil es que guarda (en memoria solamente) información histórica de los últimos 60 segundos, minutos,horas y dias; el único problema es que es necesario que este corriendo todo el tiempo.

 

En un escenario en el que un servidor Linux es usado como proxy para una red (basicamente) Windows nos será de utilidad acceder a esa información en tiempo real desde cualquier parte de la red.

Para ello podemos dejar ejecutando bmon en una sesión cargada con screen al mismo tiempo configuramos bmon para que genere salida HTML cada segundo la cual leeremos desde Apache.

Pasos para instalar y ejecutar:

  1. Instalar screen y bmonsudo apt-get install screen bmon
  2. Crear el directorio /var/www/bmon-html
  3. Crear el archivo /etc/init/bmon.conf  con el siguiente contenido
    description "bmon bandwidth monitoring process"
    
    start on (local-filesystems and net-device-up and runlevel [2345])
    stop on runlevel [016]
    
    exec screen -d -m -S bmon bmon -O html:path=/var/www/bmon-html
  4. Iniciar el servicio:sudo service bmon start
  5. Luego estará disponible la pagina  http://localhost/bmon-html/ , y estará actualizada constantemente.

Enjoy!