Resultado da Stored Procedure na Trigger

Firebird

11/10/2007

Pessoal,
Bom dia!

Tenho uma rotina para cadastro de Orçamentos que envolve as seguintes
tabelas: [ORCAMENTO ORCAMENTO_PRODUTO
ORCAMENTO_SERVICO] então eu fiz uma Procedure que me retorna o valor total dos (PRODUTOS + ORÇAMENTOS) para que eu possa atualizar na tabela ORCAMENTO o campo que guarda o VALOR_TOTAL do orçamento.

ALTER PROCEDURE ORCAMENTO_VALOR_TOTAL (
    ID_ORCAMENTO INTEGER)
RETURNS (
    NOVO_VALOR_TOTAL NUMERIC(15,2))
AS
DECLARE VARIABLE VALOR_PRODUTO NUMERIC(15,2);
DECLARE VARIABLE VALOR_SERVICO NUMERIC(15,2);
begin

  select coalesce( SUM(QUANTIDADE * VALOR), 0 )
    from ORCAMENTO_ITENS_PRODUTO
   where ID_ORCAMENTO = :ID_ORCAMENTO
    into :VALOR_PRODUTO;

  select coalesce( SUM(QUANTIDADE * VALOR), 0 )
    from ORCAMENTO_ITENS_SERVICO
   where ID_ORCAMENTO = :ID_ORCAMENTO
    into :VALOR_SERVICO;

  NOVO_VALOR_TOTAL = (:VALOR_PRODUTO + :VALOR_SERVICO);

   suspend;
end



Eu gostaria de executar esta Procedure através de uma Trigger que ia disparar sempre que a tabela ORCAMENTO recebesse um UPDATE pois como no sistema existe um relacionamento eu aplico a atualização nesta tabela. Seria algo mais ou menos assim que eu estava pensando:

ALTER TRIGGER ORCAMENTO_VALOR_TOTAL
ACTIVE BEFORE UPDATE POSITION 0
AS
begin
  /* ATUALIZAR O VALOR TOTAL DO ORÇAMENTO */
  NEW.VALOR_TOTAL = (select * ORCAMENTO_VALOR_TOTAL(NEW.ID_ORCAMENTO));
end


Este codigo acima é so para ilustrar pois esta totalmente errado.

É possível fazer isso que eu descrevi? Ou teria uma maneira mais simples para fazer?

Fico no aguardo.

Abraços!


Mmoreira

Mmoreira

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

11/10/2007

tente assim:
ALTER TRIGGER ORCAMENTO_VALOR_TOTAL
ACTIVE BEFORE UPDATE POSITION 0
AS
declare VALOR_TOTAL NUMERIC(15,2)) 
begin
  /* executa a SP e obtém o valor total na variável VALOR_TOTAL */
  Select NOVO_VALOR_TOTAL
  From ORCAMENTO_VALOR_TOTAL(NEW.ID_ORCAMENTO)
  into :VALOR_TOTAL;

  /* ATUALIZAR O VALOR TOTAL DO ORÇAMENTO */
  NEW.VALOR_TOTAL = :VALOR_TOTAL;
end



GOSTEI 0
Mmoreira

Mmoreira

11/10/2007

Emerson,
Era isso mesmo que eu estava precisando, testei aqui e funcionou perfeitamente.
Muito obrigado pela atenção.
Abraços!


GOSTEI 0
POSTAR