miércoles, 11 de diciembre de 2013

Update Sequences Manually

Cuando se registra o elimina filas en una tabla directamente desde la base de datos del ADempiere, se debe ejecutar siempre la función:

select update_sequences();

Para actualizar el número de secuencia del campo primario de la tabla afectada, sin embargo, si usamos una función que invoca una cantidad considerable a otras funciones, afectamos tablas y por ultimo actualizamos la secuencia, esto nos podrá lanzar un error de "memoria compartida agotada". Para aplicar la solución mencionada en ese post, se debe actualizar la secuencia del campo sin utilizar la funcion update_sequences, sino que se debe hacer de forma manual como se demuestra a continuacion:

create or replace function mifuncion(p1, p2,.....pn)
returns void
as $$

DECLARE
secuencia        VARCHAR;

-- VARIABLES DE SECUENCIA
    DECLARE
        SEQ_JOURNALBATCH NUMERIC;
        SEQ_JOURNAL NUMERIC;
        SEQ_VALIDCOMBINATION NUMERIC;
        SEQ_JOURNALLINE NUMERIC;


begin

/*secuencia = (
        SELECT update_sequences()
    );*/

/************** ACTUALIZAR SECUENCIA **********************/

    SEQ_JOURNALBATCH =
    COALESCE((
        SELECT MAX(GB.GL_JOURNALBATCH_ID) FROM GL_JOURNALBATCH GB
    ), 1000000) + 1;

    SEQ_JOURNAL =
    COALESCE((
        SELECT MAX(G.GL_JOURNAL_ID) FROM GL_JOURNAL G
    ), 1000000) + 1;

    SEQ_VALIDCOMBINATION =
    COALESCE((
        SELECT MAX(VC.C_VALIDCOMBINATION_ID) FROM C_VALIDCOMBINATION VC
    ), 1000000) + 1;
   
    SEQ_JOURNALLINE =
    COALESCE((
        SELECT MAX(GL.GL_JOURNALLINE_ID) FROM GL_JOURNALLINE GL
    ), 1000000) + 1;

    UPDATE AD_SEQUENCE
        SET CurrentNext = SEQ_JOURNALBATCH
    WHERE NAME = 'GL_JournalBatch'
    AND IsTableID = 'Y';

    UPDATE AD_SEQUENCE
        SET CurrentNext = SEQ_JOURNAL
    WHERE NAME = 'GL_Journal'
    AND IsTableID = 'Y';

    UPDATE AD_SEQUENCE
        SET CurrentNext = SEQ_VALIDCOMBINATION
    WHERE NAME = 'C_ValidCombination'
    AND IsTableID = 'Y';

    UPDATE AD_SEQUENCE
        SET CurrentNext = SEQ_JOURNALLINE
    WHERE NAME = 'GL_JournalLine'
    AND IsTableID = 'Y';


end;
$$ language plpgsql;

No hay comentarios:

Publicar un comentario