Fórum Problemas com Generator e Trigger.... codigo auto increment #45932
10/08/2004
0
CREATE GENERATOR GEN_CP02NOTA;
e criei a seguinte trigger:
CREATE TRIGGER CP02NOTA_AUTOINC FOR CP02NOTA
ACTIVE BEFORE INSERT POSITION 0
as
begin
new.CP_CODIGO=gen_id(GEN_CP02NOTA, 1);
end
até aí eu creio estar tudo certo.... a inserção dos dados funciona perfeitamente pélo IBExpert, mas pelo meu programa pelo dbgrid dah pau !
Essa é uma tabela de item de nota, q é preenchida atraves de um dbgrid... usando a inserção direta ...
quando o usuario volta os registro do dbgrid para alterar algum dado, na hora de postar dah o seguinte erro.... ´Update Failed´..
estou usando MDO, uso MDOQuery e MDOUpdateSQL....
eu acho q o meu programa naum tah pegando o valos correto do generator.... ou os valores soh entrarão depois de um commit ?!!
sei lah...
como proceder para eu utilizar corretamente essa trigger ?
a trigger tah certa ?
o q fazer?!
Marfred
Curtir tópico
+ 0Posts
10/08/2004
Afarias
|generator.... ou os valores soh entrarão depois de um commit ?!!
exetamente! como vc está gerando os valores no banco, vc só saberá dos valores gerados quando re-executar a consulta (fechar e abrir a query) -- por isso, em muitos casos usar triggers para gerar os valores auto-incremento não é a melhor solução.
T+
Gostei + 0
10/08/2004
Marfred
qual seria a melhor solucao para este meu caso ?!
o esquema é mestre/detalhe... como eu faco na tabela detalhe ?
gerar o auto incremento na mao ?!
tem problemas / tem como eu usar o generator para incrementar sem utilizar a trigger ?
...
Gostei + 0
10/08/2004
Marfred
Gostei + 0
10/08/2004
Vinicius2k
marfred, se vc observar o código de uma trigger para auto incremento ela dispara a função GEN_ID...
vc pode usar uma query auxiliar para com a instrução : SELECT GEN_ID(´NOME_DO_GENERATOR´,0) apenas para buscar o valor do generator ou SELECT GEN_ID(´NOME_DO_GENERATOR´, 1) para buscar o valor e já incrementar o generator... vai depender do seu caso qual a melhor postura a adotar...
vc pode, por exemplo, manter a trigger e após o commit do mestre, e usar o select sem incremento para trazer o valor para utilizar nos detalhes... seria mais rápido do que fechar, abrir e reposicionar o cursor na metre e pegar o ID para usar nos detalhes...
ou vc pode deixar de usar a trigger e usar o select com incremento no momento do post do mestre... esta opção eu não gosto muito, pois, [b:bbaaee4b22]numa visão pessimista[/b:bbaaee4b22], pode acontecer de dois posts de estações de diferentes no mesmo milésimo de segundo, então vc teria erro de violação de chave...
T+
Gostei + 0
10/08/2004
Afarias
|o esquema é mestre/detalhe... como eu faco na tabela detalhe ?
|gerar o auto incremento na mao ?!
gerar ´na mão´ (na aplicação) é uma boa pedida... no BeforePost ou OnNewRecord dos DataSets.... (sempre com generators, claro!) -- pelo menos da mestre!
|tem problemas / tem como eu usar o generator para incrementar sem
|utilizar a trigger ?
NÃO tem problema e SIM tem como usar (na verdade é uma opção bem melhor q triggers na maioria dos casos -- minha opnião)
|ou vc pode deixar de usar a trigger e usar o select com incremento no
|momento do post do mestre... esta opção eu não gosto muito, pois,
|numa visão pessimista, pode acontecer de dois posts de estações de
|diferentes no mesmo milésimo de segundo, então vc teria erro de
|violação de chave...
Usando ou não TRIGGERs, GENERATORs são sempre seguros. A chance de pegar 2 valores iguais com triggers ou com um select na aplicação é a mesma -- que se nào é zero, é praticamente!
T+
Gostei + 0
10/08/2004
Vinicius2k
Eu disse que era uma visão pessimista... :D
Só quiz exemplificar as formas que o colega teria para tratar isso... eu não sou a favor de Triggers nem contra Triggers... cada caso é um caso... até pouco tempo nem mesmo Generators eu utilizava (eu tinha lá minha tabela auxiliar de controle de IDs e essa sim era ´dor de cabeça´ na certa)...
T+
Gostei + 0
10/08/2004
Marfred
Valew pelas dicas !!
Resolveram meu problema !!!
Fiz o seguinte:
Em uma outra query eu busco o valor do generator e coloco em BeforePost atribuindo ao campo referido....
Falow moçada !!!
Gostei + 0
10/08/2004
Afarias
Saquei... mas...
O q eu quis dizer é q não há essa ´visão pessimista´ aqui. Acessando o generator por uma trigger ou um SQL na aplicação é a mesma coisa.
:)
T+
Gostei + 0
10/08/2004
Vinicius2k
blz. :wink:
percebo, olhando com mais cuidado, que não há fundamento realmente... digamos q foi uma ´visão terrorista´ então... :D
T+
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)