Resetar Sequence todo mês

PostgreSQL

25/11/2010

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.
Jardel Gugel

Jardel Gugel

Curtidas 0

Respostas

Jair N.

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"?

GOSTEI 0
Jair N.

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)
GOSTEI 0
Jardel Gugel

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
GOSTEI 0
Jair N.

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)";



GOSTEI 0
Jair N.

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;

GOSTEI 0
POSTAR