Pegando o valor de uma trigger com generator.

Firebird

23/03/2004

Estou tentando pegar um valor de uma trigger apos ela ser inserida e não sei como ela se comporta new, old..., para que eu possa colocar na procedure NOVCONTA

DECLARE VARIABLE NOVCONTA INTEGER;
BEGIN
IF (NEW.INCD IS NULL) THEN BEGIN
NEW.INCD = GEN_ID(INTERNACAO_CONTA,1);
[b:645f386490] NOVCONTA = OLD.incd;[/b:645f386490]
EXECUTE PROCEDURE LEITOSAUA ([b:645f386490]NOVCONTA[/b:645f386490], NEW.INEN, NEW.INLT);
END

Alguem pode me dar uma mão :(


Sremulador

Sremulador

Curtidas 0

Respostas

Afarias

Afarias

23/03/2004

se a trigger é de INSERT sempre será NEW, se for DELETE será OLD e se for UPDATE vc usará NEW para os ´novos´ valores e OLD para os valores ´antigos´


T+


GOSTEI 0
Sremulador

Sremulador

23/03/2004

O que quero e pegar o valor do campo INCD apos eu ter colocado o cod do generator nele como no cod acima e depois passar para a procedure mas ele sempre esta dizendo que há um erro de chave estrangeira


GOSTEI 0
Afarias

Afarias

23/03/2004

Cara... posso te fazer uma crítica??

Vc precisa realmente se esforçar mais para fazer suas perguntas! Procure ser mais atento e completo... é muito difícil tentar ajudar quando vc realmente não posta nada-com-nada! Desculpe!

Por exemplo, vc AGORA diz q recebe um erro do chave estrangeira, mas no código q vc postou É IMPOSSÍVEL TER UM ERRO DESSES!!

Alguem tem q chutar q INCD possui uma chave estrangeira, mas ai vc NUNCA deveria estar jogando um valor de generator nele, ou por outro lado, o erro vem do procedimento o qual não se tem a mínima idéia do código -- muito difícil!!

Mais do q isso -- vc quer ajuda numa trigger q não INFORMA nem se é AFTER ou BEFORE, se é UPDATE, INSERT ou DELETE -- realmente, *muito* difícil.

Analize bem seu problema, veja QUAL O PROBLEMA, QUAL A MENSAGEM DE ERRO, QUAIS OS CÓDIGOS ENVOLVIDOS, e... DEPURE para estar o mais próximo possível do real problema -- então post uma questão q permita q outros possam conhecer e ajudar no problema

Isso vai poupar muito tempo seu e dos usuários q querem ajudar.


T+


GOSTEI 0
Sremulador

Sremulador

23/03/2004

Muito bem o que acontece e o seguinte eu quero que ao gravar a tabela com uma trigger automaticamente outra que esta relacionada a esta mesma receba o valor da chave INCD que vai para LTIN, mas pelo que eu percebi parece que o erro de chave estrageira se dar porque não tenho ainda nenhum registro gravado na tabela de onde eu deveria pegar este cod e adicionar a segunda, mudei meu cod ví que não precisava aprocedure,

before insert

DECLARE VARIABLE SITLEI INTEGER;
BEGIN
IF (NEW.INCD IS NULL) THEN
NEW.INCD = GEN_ID(INTERNACAO_CONTA,1);

SELECT LTSL FROM LEITOS WHERE LTEN = NEW.INEN AND LTLT = NEW.INLT
INTO SITLEI;

IF (SITLEI = 2) THEN BEGIN
[b:6ea9a597a0] UPDATE LEITOS SET LTIN= NEW.INCD, LTSL=1[/b:6ea9a597a0]
WHERE ((LTLT = NEW.INLT) AND (LTEN = NEW.INEN));
END ELSE EXCEPTION A001;

Como disse acima o erro parece ser porque não tenho o cod gravado na tabela [b:6ea9a597a0]INTERNACAO[/b:6ea9a597a0] para poder gravar na de [b:6ea9a597a0]LEITOS[/b:6ea9a597a0]

Criticas são sempre bem vinda pois ajudam o homem a ver seus erros !!!


GOSTEI 0
Afarias

Afarias

23/03/2004

Tá melhorando... ;)

...considerando q a trigger esteja na tabela de INTERNAÇÃO, mova o código de atualização da tabela de leitos para uma trigger AFTER INSERT .. assim, o registro já estará lá e vc não terá o erro de violação de chave.

Realmente no BEFORE INSERT o registro ainda não existe.


T+


GOSTEI 0
Sremulador

Sremulador

23/03/2004

mas se me acontecer algo na atualização da tabela de LEITOS toda transação será voltada ou não o da primeira tabela ficará gravada :?: :?: :?:


GOSTEI 0
Afarias

Afarias

23/03/2004

Se for realizado um ROLLBACK na transação TODA E QUALQUER operação realizada é desfeita!


T+


GOSTEI 0
POSTAR