Ver Mensaje Individual
  #6  
Antiguo 03-09-2011
Avatar de ariefez
ariefez ariefez is offline
Miembro
 
Registrado: sep 2005
Ubicación: Perú - Lima
Posts: 63
Reputación: 19
ariefez Va por buen camino
FIBPlus también lo soporta en su tiempo me acuerdo haberlo implementado, pero, luego use generadores, como comentan lineas arriba.

Implementación: mediante un procedimiento obtener el valor del generador en el evento OnBeforePost y luego trabajar con dicho valor según lo requerido, cabe recalcar que uso ClientDataSet en la capa de Entidad y bueno en la Logica uso solo referencias.

El procedimiento para obtener el valor del generador es:

Código SQL [-]
create or alter procedure Proc_Get_Sequence (
    P_SEQ_NAME d_sys_field_name )
returns (
    ID integer )
as
begin
    execute statement
        'select next value for ' || :P_SEQ_NAME || ' from rdb$database'
    into :ID;

    suspend;
end;

O de forma general:

Código SQL [-]
create or alter procedure Proc_Get_Sequence (
    P_TABLE  type of d_sys_relation_name )
returns (
    ID integer )
as
    declare variable vField d_sys_field_name;
begin
    P_TABLE = upper(P_TABLE);

    select rdb$field_name from rdb$relation_fields
        where
            rdb$relation_name = :P_TABLE and
            rdb$field_id = 0
    into :vField;

    if (vField is not null) then
    begin

        vField = 'S_' || vField;

        if ( exists (
                select rdb$generator_name from rdb$generators
                    where rdb$generator_name = :vField ) ) then

            execute statement
                'select next value for ' || :vField || ' from rdb$database'
            into :ID;

    end

    if (ID is null) then
        ID = 0;

    suspend;
end;

Donde:
P_TABLE: Es es nombre de la tabla
d_sys_relation_name: dominio tipo varchar(31)
d_sys_field_name: dominio tipo varchar(31)

El nombre del generador como se puede observar es "S_" || "El nombre del campo", en mi caso siempre es el que se define primero en la tabla (rdb$field_id = 0).

Bueno y otro requerimiento es que exista el generador, sino el procedimiento devolverá cero.

Uso Firebird 2.5, pero creo que también esta disponible para la versión 2.1
Responder Con Cita