Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Faccruz

Calcular Sequencia

Recommended Posts

Boa tarde,

Os dados dessa tabela são importados através de um arquivo texto, até aí tudo bem, está funcionando.

Imagem Postada

 

Porém o Campo sequencia está errado (estou retornando o maior + 1), mas o correto é a seguinte forma: (Chave Composta contendo Código, TipoPreco, Filial, Sequencia)

 

Código TipoPreco Sequencia Filial ValidadeFim

585880 1 1 999 null

585880 1 2 999 21/06/2010

585880 2 1 999 null

585880 2 2 999 null

585880 1 3 999 22/06/2010

585880 1 1 001 30/06/2010

585880 1 2 001 01/07/2010

 

Traduzindo em palavras

caso encontre algum valor (Codigo, TipoPreco, Filial) identico no banco, a sequencia vai ser sempre a proxima, porem se encontrar a ValidadeFim mais recente, a sequencia tem que ser a maior também.

 

espero ter conseguido me expressar bem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei o seu nível de conhecimento mas, pelo que entendi a melhor solução parace uma trigger de BEFORE INSERT que faça este cálculo da sequencia de forma automÁtica.

 

grosso modo

 

CREATE OR REPLACE TRIGGER TRG_TABELA BEFORE INSERT ON TABELA
DECLARE
  VN_SEQUENCIA NUMBER;
BEGIN
  BEGIN
    SELECT SEQUENCIA INTO  VN_SEQUENCIA 
    FROM TABELA
    WHERE Codigo ::NEW.CODIGO AND TipoPreco = NEW.TIPOPRECO AND FILIAL = :NEW.FILIAL;
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      VN_SEQUENCIA:=0;
  END;
  VN_SEQUENCIA:=VN_SEQUENCIA+1;
  NEW.SEQQUENCIA := VN_SEQUENCIA; 
END;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei o seu nível de conhecimento mas, pelo que entendi a melhor solução parace uma trigger de BEFORE INSERT que faça este cálculo da sequencia de forma automÁtica.

 

grosso modo

 

CREATE OR REPLACE TRIGGER TRG_TABELA BEFORE INSERT ON TABELA
DECLARE
  VN_SEQUENCIA NUMBER;
BEGIN
  BEGIN
    SELECT SEQUENCIA INTO  VN_SEQUENCIA 
    FROM TABELA
    WHERE Codigo ::NEW.CODIGO AND TipoPreco = NEW.TIPOPRECO AND FILIAL = :NEW.FILIAL;
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      VN_SEQUENCIA:=0;
  END;
  VN_SEQUENCIA:=VN_SEQUENCIA+1;
  NEW.SEQQUENCIA := VN_SEQUENCIA; 
END;

Fiz semelhante você me passou, mas não reconheceu esse New.Sequencia no final da Trigger

Compartilhar este post


Link para o post
Compartilhar em outros sites

A sintaxe correta é :

 

:NEW.<CAMPO>

 

Variável que tem o novo valor da coluna (<campo>, no caso do insert o próprio valor inserido.

 

Obs : A trigger deve ser do tipo FOR EACH ROW.

 

A síntaxe é

 

:new.<campo>

Compartilhar este post


Link para o post
Compartilhar em outros sites

A síntaxe é

 

:new.<campo>

 

muito obrigado! era praticamente isso que eu precisava, agora irei fazer mais alguns testes referentes as particularidades que me passaram.

 

 

A síntaxe é

 

:new.<campo>

 

muito obrigado! era praticamente isso que eu precisava, agora irei fazer mais alguns testes referentes as particularidades que me passaram.

 

 

Amigo, bom dia!

 

É quase isso que eu preciso! A unica coisa que me avisaram (hoje - 25/06/2010) é que quando a ValidadeFim estiver nula/branco tem que ter a sequencia maior.

 

Outra coisa, é preciso criar uma Trigger after update que faça a mesma coisa, ou seja, a data mais recente vai ter a maior sequencia. Posso utilizar a mesma idéia?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.