Problemas com Generator e Trigger.... codigo auto increment

Firebird

10/08/2004

Eu criei o seguinte Generator:

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

Marfred

Curtidas 0

Respostas

Afarias

Afarias

10/08/2004

|eu acho q o meu programa naum tah pegando o valos correto do
|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
Marfred

Marfred

10/08/2004

entaum...

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
Marfred

Marfred

10/08/2004

sobe...


GOSTEI 0
Vinicius2k

Vinicius2k

10/08/2004

tem problemas / tem como eu usar o generator para incrementar sem utilizar a trigger ?


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
Afarias

Afarias

10/08/2004

|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 ?!

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
Vinicius2k

Vinicius2k

10/08/2004

|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!


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
Marfred

Marfred

10/08/2004

Legal moçada !!!

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
Afarias

Afarias

10/08/2004

|Eu disse que era uma visão pessimista...

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
Vinicius2k

Vinicius2k

10/08/2004

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.

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
POSTAR