ss



Ejemplo: Autoincremental Alfanumérico

-- tabla para el ejemplo
create table t2(id varchar, dato int);

--función que hace el autoincremento
create or replace function auto1() returns varchar
as $$
DECLARE
    encabezado varchar;
    parte_numero varchar;
    ultimo_numero varchar;
    numero_retorno varchar;

    numero int;
begin
   encabezado := 'ABC';


   select max(id) into ultimo_numero from t2;
   IF ultimo_numero IS NULL THEN
        numero_retorno := encabezado || '000001';
   ELSE
        ---ABC000001   000001

        parte_numero = REPLACE(ultimo_numero, encabezado, '');
        raise notice 'ultimo numero:%', parte_numero;

        numero := parte_numero::int + 1;
        RAISE NOTICE 'siguiente numero:%', numero;

        parte_numero = '000000' || numero::varchar;
        parte_numero = SUBSTR(parte_numero, length(parte_numero)-6+1, 6);

        numero_retorno := encabezado || parte_numero;

   END IF;


  return numero_retorno;
END;
  $$ language plpgsql;


-- Usando la funcioón
insert into t2(id, dato) values (auto1(),1);
select * from t2;

-- Uniendo la función con la tabla
alter table t2 alter column id set default auto1();
insert into t2(dato) values (10);

Ejemplo: Autoincremental Alfanumérico usando la misma función para dos tablas diferentes y la parte alfabética sea definida por el usuario

-- función que recibe como parametro la tabla a utilizar y la parte estática alfabética del autoincremental

create or replace function auto2(tabla varchar, encabezado varchar) returns varchar
as $$
DECLARE
    parte_numero varchar;
    ultimo_numero varchar;
    numero_retorno varchar;
    qry text;

    numero int;
begin

qry:= 'select max(id) from ' || tabla;
   execute qry into ultimo_numero ;
   IF ultimo_numero IS NULL THEN
        numero_retorno := encabezado || '000001';
   ELSE
        parte_numero = REPLACE(ultimo_numero, encabezado, '');
        raise notice 'ultimo numero:%', parte_numero;

        numero := parte_numero::int + 1;
        RAISE NOTICE 'siguiente numero:%', numero;

        parte_numero = '000000' || numero::varchar;
        parte_numero = SUBSTR(parte_numero, length(parte_numero)-6+1, 6);

        numero_retorno := encabezado || parte_numero;

   END IF;


  return numero_retorno;
END;
  $$ language plpgsql;

-- tablas para probar la función
create table t3(id varchar default auto2('t3', 'DEF'), dato int);
create table t4(id varchar default auto2('t4', 'VWXYZ'), dato int);

Ejemplo: Autoincremental Alfabético

-- función que genera un autoincremental alfabético
create or replace function auto3() returns varchar
as $$
DECLARE
    encabezado varchar default 'AAAAAA';
    ultimo_numero varchar;
    retorno varchar;
    alfanum varchar;

    i int;

    caracter char;
    new_caracter char;
    suma_next_level int;


begin

    select max(id) into ultimo_numero from t5;
    IF ultimo_numero IS NULL THEN
        alfanum := encabezado;
    ELSE
        alfanum := '';
        suma_next_level := 1;

        FOR i IN REVERSE 6..1 LOOP
            caracter := SUBSTR(ultimo_numero,i,1);
            --RAISE NOTICE 'pos:% caracter:%',i, caracter;
            IF suma_next_level = 1 THEN
                select * into new_caracter, suma_next_level from next_char(caracter);
                RAISE NOTICE 'pos:% caracter:% new:% suma:%',i, caracter, new_caracter, suma_next_level;
                alfanum := alfanum || new_caracter;
            ELSE
                alfanum := alfanum || caracter;
            END IF;
        END LOOP;

    END IF;


    retorno := '';
    FOR i IN 1..6 LOOP
        retorno := substr(alfanum,i ,1 ) || retorno;
    END LOOP;

    return retorno;
END;
$$ language plpgsql;


-- función que calcula cual es el "siguiente carácter" 
create or replace function next_char( in caracter char,  out retorno char, out suma_next_level int)
as $$
DECLARE
  maximo int default 90;
  --maximo int default 66;
BEGIN
    IF ascii(caracter) + 1 > maximo THEN
        suma_next_level = 1;
        retorno := 'A';
    ELSE
        suma_next_level = 0;
        retorno := chr(ascii(caracter) + 1);
    END IF;
END;
$$ language plpgsql;

-- tabla para probar el ejemplo
create table t5 (id varchar default auto3(), dato int);
insert into t5 (dato) select generate_series(1,20);

Impactos: 4

Categories:

Comments are closed