PROBLEMA CON NUMERACION CONSECUTIVA forms

RONALD
04 de Julio del 2004
hola a todos.

Tengo una forma que busca el max de un numero y le suma 1 para asi llevar un consecutivo, el codigo es el siguiente:

FOR I IN(SELECT nvl(MAX(to_number(NUM_SERV)),0)+1 serv
FROM DET_SERVICIO1)LOOP
IF I.serv IS NULL THEN
:DET_SERVICIO1.NUM_SERV := 1;
ELSE
:DET_SERVICIO1.NUM_SERV := I.serv;
END IF;
END LOOP;

El problema es que si se ejecuta la forma desde dos o mas maquinas a la vez, el numero que trae es el mismo, esto me imagino que es porque no se ha salvado el registro y lo toma como que si no existiera, me han comentado de algo asi como un select for update, pero en realidad no se como funciona, si alguien me puede ayudar seria excelente es urgente

Gracias de antemano desde Venezuela.

Andres Ramirez
04 de Julio del 2004
He leido tu problema y te aconsejo que utilices una secuencia. Estas aumenta en forma automatica por ej:
Tu creas una secuencia llamada sec_numero

Select sec_numero.nextval into vnumero from dual;

al realizar el Select en forma automatica se y si otra persona llama esta misma funcion traera la nueva secuencia y asi sucesivamente.

RONALD
04 de Julio del 2004
Gracias, ya lo he intentado, el problema es que si no se guarda el registro, ese numero de la secuencia queda vacío y pasa al siguiente, y deberia ser estrictamente una secuencia.

Por ejemplo si entro 10 veces a la forma y no guardo ninguna la secuencia me aumenta el valor 10 veces

Si sabes como hacer que la secuencia se incremete unicamente cuando efectivamente se guarde el registro, sería perfecto.

Gracias.

ivan jahir
04 de Julio del 2004
El select max que estas haciendo esta bien pero como no estas actualizando el registro queda en las tres maquinas iguales; me imagino que este consecutivo lo necesitas para una solicitud o algo así, la idea seria que el select max lo hagas en el moemento que se va a grabar y el usuario no sepa que número le corresponde hasta que grabe y para dar este efecto tienes que programar el select max y el update a la tabla del select max para que actualice el consecutivo en el preinsert del bloque que se va a grabar y no cada vez que abran la forma