Reiniciar un registro entero de una tabla al cambiar de año

Reiniciar un registro entero de una tabla al cambiar de año

Buenas, me dirijo a ustedes con la finalidad de que me ayuden a aclarar una pequeña duda.

tengo una función donde incrementa automáticamente un numero entero al ingresar un registro en la tabla el cual ese numero necesito que se reinicie al cambiar de año, es decir, si el ultimo registro en el año 2011 quedo usando el nro 58 que al cambiar al 2012 este quede en 01. Esta es mi funcion

CREATE OR REPLACE FUNCTION schema_acta.fn_insertar_acta(p_fecha text, p_observacion text, p_campo character varying, p_id_ambito integer, p_id_oficina integer, p_nombreusuario character varying)
RETURNS character varying AS
$BODY$

DECLARE
v_ultimo integer;
v_id_anio integer;
v_numero integer;
v_mes integer;
v_anio integer;

BEGIN
BEGIN
v_mes=split_part(p_fecha,'/',2);
v_anio=split_part(p_fecha,'/',3);

select into v_id_anio id from schema_registro.tbl_anio where nombre=v_anio;

select into v_ultimo ultimo from schema_acta.tbl_actaanio where id_anio=v_id_anio;
v_numero=v_ultimo+1;

INSERT INTO schema_acta.tbl_acta (fecha,numero,observacion,campo,id_ambito,id_oficina,id_mes,nombreusuario,id_anio,fecharegistro) VALUES (to_date(p_fecha, 'DD/MM/YYYY'),v_numero,UPPER(p_observacion),UPPER(p_campo),p_id_ambito,p_id_oficina,v_mes,p_nombreusuario,v_id_anio,now());
update schema_acta.tbl_actaanio set ultimo=v_numero where id_anio=v_id_anio;
EXCEPTION
WHEN OTHERS THEN
RETURN 'Ha ocurrido un error al ejecutar la instrucción';
END;
RETURN 'OK';
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Re: Reiniciar un registro entero de una tabla al cambiar de año

Hola jarc.

¿Cuál es exactamente la pregunta que planteas? ¿Saber si tu función está bien?
Por lo pronto te diré que con lo que estoy viendo, no estás sabiendo gestionar dos cosas:

1. Tal y como adelantas, no estás incluyendo un nuevo registro en la tabla schema_registro.tbl_anio si no encuentras uno para el actual.

2. Puede darse que dos peticiones diferentes acaben teniendo el mismo valor para v_numero, si ambas se dan "al mismo tiempo".

Un saludo.

Buenas gracias por tu ayuda,

Buenas gracias por tu ayuda, lo que en realidad quiero es reiniciar el registro de tipo de dato entero de una tabla al cambiar de año ojo no es un id autoincremento es un campo llamado numero, Me explico??? Gracias

Re: Reiniciar un registro entero de una tabla al cambiar de año

Hola jarc.

Bueno en primer lugar me gustaría preguntarte, ¿realmente necesitas las dos tablas: schema_registro.tbl_anio y schema_acta.tbl_actaanio?. En una preguntas por el año concreto para obtener un Id, que luego usas para obtener el último número. ¿No sería mejor unificarlas y preguntar directamente en ella el año, para obtener su último número asociado? Salvo que tenga una lógica mayor a la que expones ¿no te parece redundante tener 2? Incluso aunque debieras tener un número para las actas, otro para las facturas por ejemplo, siempre podrás vincular un código para poder distinguir:

Codigo | Año  | Ultimo número
------------------------------
 ACTA  | 2010 |      12
 ACTA  | 2011 |      34
 FACT  | 2010 |     121
...

Dicho esto, es evidente que eres tú quien conoce la lógica, así que debes ser quien tome la decisión. Por esta razón, en vez de escribir código, voy a darte algunos consejos para que puedas gestionar lo que "creo" que estás queriendo llevar a cabo.

Cualquier tabla de la que obtengas el número y después debas actualizar (sumándole uno), deberás obtenerlo utilizando SELECT...FOR UPDATE, de esta forma evitarás que otros puedan llegar a obtener el mismo número (si lo piden "casi" a la vez).

Para saber si has conseguido el último número del año actual, basta preguntar si la variable obtenida es null. Siguiendo tu ejemplo:

select into v_id_anio id from schema_registro.tbl_anio where nombre=v_anio;

IF v_id_anio IS NULL THEN
  -- No he conseguido un registro coincidente
END IF

Otra cosa es si tienes que insertar un nuevo registro en la tabla de años, en cuyo caso deberás bloquear la tabla entera, para evitar que dos procesos intenten "a la vez" incluir nueva información. O mejor todavía, realizar la operación mediante la gestión de la correspondiente excepción.

Un saludo.