alguem poderia me dar uma força com um trigger
é um trigger pro insert…o nome da tabela e destinatario…
preciso de uma trigger para inserir um dado na tabela destinatario na hora em que eu estiver inserindo um dado nela
como isos ficaria??
alguem poderia me dar uma força com um trigger
é um trigger pro insert…o nome da tabela e destinatario…
preciso de uma trigger para inserir um dado na tabela destinatario na hora em que eu estiver inserindo um dado nela
como isos ficaria??
quero fazer a inserçao o primeiro if
fiz assim mas da erro no select, isso esta certo??
AS
declare
contId integer;
begin
IF (INSERTING) THEN
contid = select max(id_destinatario) from destinatario where old.id_empresa = new.id_empresa;
INSERT INTO destinatario (new.id_fantasia) values (contid+1) ;
INSERT INTO log (TABELA, DATA, DESCRICAO, ACAO) VALUES ('DESTINATARIO', current_timestamp, 'COD:' || new.id_destinatario || ' NOME: ' || new.nome_fantasia, 0);
ELSE
IF (UPDATING) THEN
INSERT INTO log (TABELA, DATA, DESCRICAO, ACAO) VALUES ('DESTINATARIO', current_timestamp, 'COD:' || new.id_destinatario || ' NOME: ' || new.nome_fantasia, 1);
ELSE
IF (DELETING) THEN BEGIN
INSERT INTO log (TABELA, DATA, DESCRICAO, ACAO) VALUES ('DESTINATARIO', current_timestamp, 'COD:' || old.id_destinatario || ' NOME: ' || old.nome_fantasia, 2);
END
end
Se for Firebird voce deve utilizar dessa forma
AS
BEGIN
IF (INSERTING) THEN
contid = select coalesce(max(id_destinatario),0)+1 from destinatario where old.id_empresa = new.id_empresa into new.id_fantasia;
INSERT INTO log (TABELA, DATA, DESCRICAO, ACAO) VALUES ('DESTINATARIO', current_timestamp, 'COD:' || new.id_destinatario || ' NOME: ' || new.nome_fantasia, 0);
ELSE
IF (UPDATING) THEN
INSERT INTO log (TABELA, DATA, DESCRICAO, ACAO) VALUES ('DESTINATARIO', current_timestamp, 'COD:' || new.id_destinatario || ' NOME: ' || new.nome_fantasia, 1);
ELSE
IF (DELETING) THEN BEGIN
INSERT INTO log (TABELA, DATA, DESCRICAO, ACAO) VALUES ('DESTINATARIO', current_timestamp, 'COD:' || old.id_destinatario || ' NOME: ' || old.nome_fantasia, 2);
END
end
to usando firebird 2.1 e mesmo assimc continua com esse erro
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 10, column 17.
select
a trigger ficou assim
AS
declare
contId integer;
begin
IF (INSERTING) THEN
contid = select coalesce(max(id_destinatario),0)+1 from destinatario where old.id_empresa = new.id_empresa;
INSERT INTO destinatario (new.id_fantasia) values (contid+1) ;
INSERT INTO log (TABELA, DATA, DESCRICAO, ACAO) VALUES ('DESTINATARIO', current_timestamp, 'COD:' || new.id_destinatario || ' NOME: ' || new.nome_fantasia, 0);
ELSE
IF (UPDATING) THEN
INSERT INTO log (TABELA, DATA, DESCRICAO, ACAO) VALUES ('DESTINATARIO', current_timestamp, 'COD:' || new.id_destinatario || ' NOME: ' || new.nome_fantasia, 1);
ELSE
IF (DELETING) THEN BEGIN
INSERT INTO log (TABELA, DATA, DESCRICAO, ACAO) VALUES ('DESTINATARIO', current_timestamp, 'COD:' || old.id_destinatario || ' NOME: ' || old.nome_fantasia, 2);
END
end
Substitua as linhas
contid = select coalesce(max(id_destinatario),0)+1 from destinatario where old.id_empresa = new.id_empresa;
INSERT INTO destinatario (new.id_fantasia) values (contid+1) ;
pela linha abaixo
select coalesce(max(id_destinatario),0)+1 from destinatario where old.id_empresa = new.id_empresa into new.id_fantasia;
pois a tabela da trigues é a propria onde o campo new.id_fantasia pelo que voce colocou quando precisar colocar o resutado de uma sql em um campo utilizando triguer procure fazer da seguinte forma Select Campo_Origem from Tabela Condicao into new.Campo_Destino
eu fiz que nem vc postou no exemplo mas esta dando ume erro no else, e quando tiro a linha de insert ele compila perfeitamente, sera o q pode ser?
Coloque cada bloco de instrução dentro de um begin end
quase deu…
mas acho q nem alguma coisa errada na logica:
select coalesce(max(old.id_fantasia),0)+10 from destinatario where old.id_empresa = new.id_empresa into new.id_fantasia;
pq ele deveria pegar o maior do campo id_fantasia… mas ele grava no banco o valor 10 como se tivesse somando 0+10
select coalesce(max(old.id_fantasia),0)+10 from destinatario where old.id_empresa = new.id_empresa into new.id_fantasia;
o problema está aki como você está fazendo um select não exite OLD no campos do select.
select coalesce(max(id_fantasia),0)+1 from destinatario where old.id_empresa = new.id_empresa into new.id_fantasia;
o mesmo ira pegar o maior valor do campo ID_FANTASIA se somar 1 caso não existe nenhum valor o campo seja null em todos os registros ou a tabela eseja vazia o coalesce faz com que ele retorno 0 ai 0+1 = 1 e o seu tratamento ficara correto.