Erro o criar trigger no Ib

17/12/2003

1

Fiz um Generator de nome Cod_Pac, então incremento um com esta trigger:
Set Term!!;
Create trigger ´Tr_Pac´ for ´TbPac´ before insert position 0
as begin
new.id = gen.id(cod_pac,1);
end;
set term;!!
Já tirei as aspas, já retirei os pontos-e-vírgulas, porem ainda não consegui fazer funcionar a trigger. Em cada situação, um erro diferente.
Oura coisa, qdo crio uma tabela, ela está vazia, certo?Só q qdo eu habilito o generator field, na propriedade da query no form do delphi, ela não incrementa 1. Às vezes tenho que colocar um manualmente e depois ela incremanta. Algumas tabelas minhas dão erro de violação de integridade(chave primária sendo duplicada). Como ter um banco IB sem problemas como esse? O que devo fazer?


Responder

Posts

17/12/2003

Edison_br

Primeiro: Esse não eh o forum de ib e sim de DELPHI
Segundo:De uma olhada na documentação do ib pb não eh
gen.id(cod_pac,1); o correto seria gen_id(cod_pac,1);

>> Em cada situação, um erro diferente.
Se vc dizer qual erro tem um monte de gente que podera lhe ajudar.

>>ela não incrementa 1.
Se vc precisa mostrar o código qdo vc está cadastrando vc deve utilizar uma Stored Procedure nâo Trigger.


Responder

17/12/2003

Paulo

1º - Apesar de não ser o forum de IB, eu uso IB com Delphi, logo não há como desmembrar, senão se eu levar uma dúvida para lá de IB com Delphi, vc vai me dizer, que este não é um forum de Delphi.
2º - O generatorfield das querys deveriam fazer isso(incrementar), sem a necessidade de SP ou Trigger´s, certo?mas não fazem. Não que eu precise mostrar o código, é que ele é uma chave primária e tem que ter valores distinto, senão dá erro de integridade, valeu?!


Responder

17/12/2003

Goncalves

Set Term^;
Create trigger Tr_Pac for TbPac before insert position 0
as begin
new.id = gen_id(cod_pac,1);
end;
^
set term;^

onde:
=> Tr_Pac : Nome que vc escolhe para a trigger;
=> TbPac: Nome tabela ao qual o campo será incrementado;
=> new.id : Esta descrição ´id´, é o seu nome de coluna na tabela TbPac? Se não, o correto seria new.nomedocampodatabela.

Não é necessário habilitar o generator field na propriedade da query no form. Para que o código a ser gerado já seja mostrado antes de vc salver o registro, faça o seguinte:

Cria uma query com o seguinte comando no SQL:

select gen_id(teste,0) from RDB$Database
// Isso trará o último número cherado.

No evento AfterInsert vc coloca o seguinte:

Query.open;
CampodoForm.Text := IntToStr(QueryGen_id.Value);
// Gen_id será o field da Query

No evento AfterPost vc coloca o seguinte:
Query.Close


Cara, qualquer dúvida me contate!

Abraços!


Responder

17/12/2003

Goncalves

Retificando:

Cherado não, gerado!

select gen_id([b:fecd2a2863]nomedogenerator[/b:fecd2a2863],0) ....

Valeu!


Responder