Resetar Sequence todo mês
Buenas pessoal,
tenho uma sequence no meu banco que tem como chave primaria um id e uma data, presiso que esse id que é automaticamente gerado por uma sequencia seja resetado todo o dia primeiro de cada mês. alguem tem alguma sugestão
Desde ja agradeço.
tenho uma sequence no meu banco que tem como chave primaria um id e uma data, presiso que esse id que é automaticamente gerado por uma sequencia seja resetado todo o dia primeiro de cada mês. alguem tem alguma sugestão
Desde ja agradeço.
Jardel Gugel
Curtidas 0
Respostas
Jair N.
25/11/2010
Boa Tarde, você quer que sei "ID" seja reinicializado todo dia 1º de cada mês com um valor
existe atualmente alguma função que gera a seqüência do seu "ID"?
existe atualmente alguma função que gera a seqüência do seu "ID"?
GOSTEI 0
Jair N.
25/11/2010
olhando o enunciado voce está contando que este dia 1º estará sempre sendo alimentado, mas caso não seja como ficará, veja este exemplo onde o ano e o mês está sendo o início do identificador:
SELECT 1 + COALESCE ((
SELECT MAX(tabela.id)
FROM tabela
HAVING EXTRACT(MONTH FROM MAX(tabela.data)) = EXTRACT(MONTH FROM CURRENT_DATE)
AND EXTRACT(YEAR FROM MAX(tabela.data)) = EXTRACT(YEAR FROM CURRENT_DATE)), 0)
SELECT 1 + COALESCE ((
SELECT MAX(tabela.id)
FROM tabela
HAVING EXTRACT(MONTH FROM MAX(tabela.data)) = EXTRACT(MONTH FROM CURRENT_DATE)
AND EXTRACT(YEAR FROM MAX(tabela.data)) = EXTRACT(YEAR FROM CURRENT_DATE)), 0)
GOSTEI 0
Jardel Gugel
25/11/2010
Jair,
Tenho uma tabela que contem essa chave primaria,
CONSTRAINT os_pk PRIMARY KEY (codos, dataos)
sendo que o codos é um inteiro que é gerenciado e gerado por uma sequence que pretendo setar todo mês, e também tenho a dataos que é uma data de abertura de ordem de serviço essa é sempre a data e hora de criação da ordem.
o que quero fazer é setar a sequence que gerência o código da ordem de serviço todo inicio de mês.
Isso manual sei fazer queria uma forma de automatizar a reiniciação da sequence mas não sei como se usando trigger ou procedure, ou se o postgres disponibiliza uma outra forma.
ate mais Jardel
Tenho uma tabela que contem essa chave primaria,
CONSTRAINT os_pk PRIMARY KEY (codos, dataos)
sendo que o codos é um inteiro que é gerenciado e gerado por uma sequence que pretendo setar todo mês, e também tenho a dataos que é uma data de abertura de ordem de serviço essa é sempre a data e hora de criação da ordem.
o que quero fazer é setar a sequence que gerência o código da ordem de serviço todo inicio de mês.
Isso manual sei fazer queria uma forma de automatizar a reiniciação da sequence mas não sei como se usando trigger ou procedure, ou se o postgres disponibiliza uma outra forma.
ate mais Jardel
GOSTEI 0
Jair N.
25/11/2010
Como teste segue a exemplo:
CREATE OR REPLACE FUNCTION funint_seqos(data date) RETURNS integer AS
$BODY$
DECLARE
new_day date;
BEGIN
IF (data IS NOT Null) THEN
new_day := data;
ELSE
new_day := CURRENT_DATE;
END IF;
-- Pega o último número seqüêncial no período informado a este acrescido de mais um...
RETURN 1 + COALESCE((SELECT MAX(os.codos) FROM os HAVING EXTRACT(MONTH FROM MAX(os.dataos)) = EXTRACT(MONTH FROM new_day) AND EXTRACT(YEAR FROM MAX(os.dataos)) = EXTRACT(YEAR FROM new_day)), 0);
-- O retono para valor não encontrado será no mínimo um...
END;
$BODY$
LANGUAGE plpgsql;
ALTER TABLE os ALTER COLUMN codos SET DEFAULT funint_seqos(CURRENT_DATE);
Quando for fazer uma inclusão a exemplo chame a função para passagem do parâmetro exemplo:
"codos = funint_seqos(datsos)"; ou na consulta "SELECT funint_seqos(:datsos)";
CREATE OR REPLACE FUNCTION funint_seqos(data date) RETURNS integer AS
$BODY$
DECLARE
new_day date;
BEGIN
IF (data IS NOT Null) THEN
new_day := data;
ELSE
new_day := CURRENT_DATE;
END IF;
-- Pega o último número seqüêncial no período informado a este acrescido de mais um...
RETURN 1 + COALESCE((SELECT MAX(os.codos) FROM os HAVING EXTRACT(MONTH FROM MAX(os.dataos)) = EXTRACT(MONTH FROM new_day) AND EXTRACT(YEAR FROM MAX(os.dataos)) = EXTRACT(YEAR FROM new_day)), 0);
-- O retono para valor não encontrado será no mínimo um...
END;
$BODY$
LANGUAGE plpgsql;
ALTER TABLE os ALTER COLUMN codos SET DEFAULT funint_seqos(CURRENT_DATE);
Quando for fazer uma inclusão a exemplo chame a função para passagem do parâmetro exemplo:
"codos = funint_seqos(datsos)"; ou na consulta "SELECT funint_seqos(:datsos)";
GOSTEI 0
Jair N.
25/11/2010
Ratificando a função correta seria:
CREATE OR REPLACE FUNCTION funint_seqos(data date) RETURNS integer AS
$BODY$
DECLARE
new_day date;
BEGIN
IF (data IS NOT Null) THEN
new_day := data;
ELSE
new_day := CURRENT_DATE;
END IF;
-- Pega o último número seqüêncial no período informado acrescido de mais um...
RETURN COALESCE((SELECT MAX(os.codos) + 1 FROM os WHERE EXTRACT(MONTH FROM os.dataos) = EXTRACT(MONTH FROM new_day) AND EXTRACT(YEAR FROM os.dataos) = EXTRACT(YEAR FROM new_day)), 1);
-- O retono para valor não encontrado será no mínimo um...
END;
$BODY$
LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION funint_seqos(data date) RETURNS integer AS
$BODY$
DECLARE
new_day date;
BEGIN
IF (data IS NOT Null) THEN
new_day := data;
ELSE
new_day := CURRENT_DATE;
END IF;
-- Pega o último número seqüêncial no período informado acrescido de mais um...
RETURN COALESCE((SELECT MAX(os.codos) + 1 FROM os WHERE EXTRACT(MONTH FROM os.dataos) = EXTRACT(MONTH FROM new_day) AND EXTRACT(YEAR FROM os.dataos) = EXTRACT(YEAR FROM new_day)), 1);
-- O retono para valor não encontrado será no mínimo um...
END;
$BODY$
LANGUAGE plpgsql;
GOSTEI 0