PDA

Ver la Versión Completa : Iniciar nº secuencia el primer día del año


Jose Manuel
13-08-2005, 21:36:45
Trabajo con D6 con Update2, componentes ODACnet 4.50.3.24 y Oracle 9i y tengo el siguiente problema:

En una tabla he creado un campo llamado N_NUM_ORDEN, que se actualiza con el valor de una “secuencia” que se “dispara” al insertar un registro.

Los códigos de la secuencia y del disparador son:

CREATE SEQUENCE "DESARROLLO"."TA_LIQ_NUM_ORDEN" INCREMENT BY 1
START WITH 5000 MAXVALUE 99999 MINVALUE 1 NOCYCLE
NOCACHE ORDER;

CREATE OR REPLACE TRIGGER "DESARROLLO"."TA_LIQ_GENERAR_NUM_ORDEN"
BEFORE INSERT OR UPDATE OF "NUM_ORDEN" ON "REGISTRO"
FOR EACH ROW
begin
if :new.num_orden is null then
select TA_LIQ_NUM_ORDEN.NextVal
into :new.num_orden
from Dual;
end if;
end;

Aunque ambos funcionan correctamente, yo necesito lo siguiente:

1º Que la secuencia se reinicie siempre a 5000 el primer día del año. ¿Se puede modificar desde Delphi la SEQUENCE, o como podría hacerse? La única forma que conozco es borrar la SEQUENCE y volver a crearla.
2º El nº de orden que me devuelve la “SEQUENCE”, lo graba correctamente en la base de datos, pero yo quisiera saber que nº ha puesto sin tener que hacer una consulta, pues es necesario mostrar el nº de orden del registro grabado.
El campo “Num_Orden.Text” lo dejo en blanco cuando quiero que se dispare la secuencia, es decir que si escribo un nº no se dispara, esto lo hago para grabar directamente nº del 1 al 5000.
¿La pregunta es cómo paso el valor que me devuelve la secuencia al campo “Num_orden.text” o a cualquier otra variable que pueda manejar?

Este es parte del codigo utilizado para insertar el registro.


Procedure TfLiq.grabaSQLliq;
begin
fdm.OraSQL_liq.SQL.clear;
fdm.OraSQL_liq.SQL.Text:=
'INSERT INTO Desarrollo.registro'+#13+
'(C_NUM_OFICINA, N_NUM_YEAR, N_NUM_ORDEN)'+#13+
' VALUES '+#13+
'(:C_NUM_OFICINA, :N_NUM_YEAR, :N_NUM_ORDEN,'+#13+
'RETURNING'+#13+
' N_NUM_ORDEN'+#13+
'INTO'+#13+
' :N_NUM_ORDEN';

fdm.OraSQL_liq.ParamByName('C_NUM_OFICINA').AsString := num_oficina.text;
fdm.OraSQL_liq.ParamByName('N_NUM_YEAR').AsString := Num_year.text;
fdm.OraSQL_liq.ParamByName('N_NUM_ORDEN').AsString := Num_Orden.Text;

fdm.OraSQL_liq.prepared;
fdm.OraSQL_liq.execute;

Num_orden.text:= fdm.OraSQL_liq.ParamByName('N_NUM_ORDEN').AsString;
End;