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;
Re: Reiniciar un registro entero de una tabla al cambiar de año
Lun, 12/12/2011 - 16:55 — doctoreHola 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,
Mar, 13/12/2011 - 16:02 — jarcBuenas 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
Mar, 13/12/2011 - 21:35 — doctoreHola 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:
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:
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.