Trigger, é possível?

Firebird

03/08/2004

Tem, jeito de fazer um select, que retorna apenas um valor, numa tabela diferente da que o trigger está vinculado, e atribuir este valor a uma variável e usá-lo?

Tentei fazer isto mas não consegui.

Obrigado,

Roberto


Tenil

Tenil

Curtidas 0

Respostas

Afarias

Afarias

03/08/2004

sim... ex::

create trigger {...} 
as
  declare variable temp_value integer;
begin
   
  select campo_tal from alguma_tabela where codigo=new.codigo
  into :temp_value;

  new.algum_campo = temp_value;

end^



GOSTEI 0
Tenil

Tenil

03/08/2004

AFARIAS, olha só como ficou o código:

SET TERM ^ ;

CREATE TRIGGER "CRIAR_PRESTACOES" FOR "CARNE"
ACTIVE AFTER INSERT POSITION 0
AS
   DECLARE VARIABLE contador SMALLINT;
BEGIN
   SELECT NU_PRESTACOES FROM CARNE_TPO WHERE ID_TIPO_CARNE=NEW.ID_TIPO_CARNE INTO:contador;

   WHILE (contador > 0) DO
   BEGIN
      INSERT INTO CARNE_PRESTACOES
      (ID_CARNE, DT_PAGAMENTO, NU_VALOR_PAGO, NU_PRESTACAO, IN_PAGO)
      VALUES (new.ID_CARNE, NULL, NULL, contador, 0);
      contador = contador - 1;
   END
END ^
COMMIT WORK ^
SET TERM ; ^


Ao meu ver este código está correto, mas quando mando executar ocorre o seguinte erro:
SQL erro code= -204 Table unknown CARNE_TIPO

Estou usando o IB 6.5.

Obrigado


GOSTEI 0
Afarias

Afarias

03/08/2004

|mas quando mando executar ocorre o seguinte erro:
|SQL erro code= -204 Table unknown CARNE_TIPO

é pq a tabela CARNE_TIPO não existe! (e se vc reparar está escrito é CARNE_TPO e não CARNE_TIPO)

se vc usou aspas-duplas no nome da tabela na criação, deve sempre fazer referência a tabela usando as aspas-duplas, e respeitando maiúsculas e minúsculas! ex: select campo_tal from ´CARNE_TIPO´


no mais o código está OK


T+


GOSTEI 0
Suporte_denisfr

Suporte_denisfr

03/08/2004

Tem sim, basta você fazer um select comum, fazendo referencia a tabela:

Select tb_cliente.cli_cod, tb_cliente.cli_nome
from tb_cliente
where tb_cliente.cli_id = (tabela_do_triger).cli_id;


GOSTEI 0
Tenil

Tenil

03/08/2004

:oops: :oops: :oops: :oops: :oops: :oops:

Tisk, tisk, tisk...

Desculpe a vergonha que passei...

Li o código 1 milhão de vezes e não vi que a palavra estava errada.

Só que, infelizmente, ainda não funcionou.

Esta parte do código está correta?

SELECT NU_PRESTACOES FROM CARNE_TIPO WHERE ID_TIPO_CARNE=NEW.ID_TIPO_CARNE INTO:contador;


É assim mesmo que se atribui o valor à variável?


GOSTEI 0
Tenil

Tenil

03/08/2004

[b:4718945093]suporte_denisfr[/b:4718945093], valeu pela dica, só que o problema é o seguinte, preciso usar o valor para vazer o loop.

Não estou conseguindo atribuir o valor retornado à variável.

Tô ficando meio que DESESPERADO, saka?


GOSTEI 0
Afarias

Afarias

03/08/2004

|Esta parte do código está correta?

o código está correto, mas vc tem q dizer o q não está dando certo para tentarmos chegar na solução



T+


GOSTEI 0
Tenil

Tenil

03/08/2004

Mano, vou transcrever o erro, ok?

SET TERM ^ ;
CREATE TRIGGER "CRIAR_PRESTACOES" FOR "CARNE"
ACTIVE AFTER INSERT POSITION 0
AS
DECLARE VARIABLE contador SMALLINT;
BEGIN
SELECT NU_PRESTACOES FROM CARNE_TIPO WHERE ID_TIPO_CARNE=NEW.ID_TIPO_CARNE INTO:contador;
WHILE (contador > 0) DO
BEGIN
INSERT INTO CARNE_PRESTACOES
(ID_CARNE, DT_PAGAMENTO, NU_VALOR_PAGO, NU_PRESTACAO, IN_PAGO)
VALUES (new.ID_CARNE, NULL, NULL, contador, 0);
contador = contador - 1;
END
END ^
COMMIT WORK ^
SET TERM ; ^

Error at line 2 - Dynamic SQL Error SQL error code = -206 Column unknown CONTADOR



GOSTEI 0
Afarias

Afarias

03/08/2004

|Mano, vou transcrever o erro, ok?

importante!

veja... quando um parâmetro ou variável é utilizado em um comando SQL ele deve vir precedido por dois-pontos ( : )

sendo assim, altere seu código para::


INSERT INTO CARNE_PRESTACOES
(ID_CARNE, DT_PAGAMENTO, NU_VALOR_PAGO,
NU_PRESTACAO, IN_PAGO)
VALUES (new.ID_CARNE, NULL, NULL, [b:f12deee296][color=red:f12deee296]:[/color:f12deee296]contador[/b:f12deee296], 0);


T+


GOSTEI 0
Tenil

Tenil

03/08/2004

Funcionou!

[b:4455c8b9dc]afarias[/b:4455c8b9dc], mais uma vez vc salvou a minha pele.

Espero um dia poder retribuir a ajuda.

Abraços,

Roberto


GOSTEI 0
POSTAR