Fórum O velho dilema: Generators com FB DBX #337183
02/02/2007
0
Eu sei q existem N tópicos com esse tema, mas há 2 dias me aconteceu uma coisa de arrancar os cabelos. Tenho um programa em fase de testes que utiliza FB + DBX + Delphi 7.
Para fazer a geração de códigos eu utilizo generators dentro do FB com triggers e gero eles no delphi da seguinte maneira básica:
selectselect GEN_ID (nome_gerador, 1) from RDB$DATABASE
Dessa forma ele gera um código no banco e me retorna.
Tudo bem. As trigger´s sao mais ou menos assim:
AS BEGIN IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(GEN_TABELA_ID,1); END
Continua tudo bem. Só q eu noto que o firebird gera um código na hora que eu peço (em run-time) e depois de dar o COMMIT ele gera mais um. Ou seja, se eu gerar 7 códigos em uma tabela detalhe, na verdade ele vai gastar 14. E de ontem pra cá está havendo um conflito de códigos entre usuários que gravam ao mesmo tempo, mesmo se cada um pegar seu códigio diferente do outro. O que serpa q está acontecendo?
PS.: Servidor: Windows XP - Estações: Carroças com Win98
Paulo Trajano
Curtir tópico
+ 0Posts
02/02/2007
Macario
Só uma ideia, será que este seu trigger não esta associado há algum outro evento? e por este movito a duplicidade na chamada.
[]´s
Gostei + 0
02/02/2007
Paulo Trajano
Gostei + 0
02/02/2007
Macario
Então, se o BD chama a trigger quando efetua um commit voce tem que identificar o ponto onde esta associado.
Não têm como você deixar a trigger ao cargo do banco.
Olha não faço uso de triggers por isso não posso lhe ajudar em muito.
[]´s
Gostei + 0
02/02/2007
Marcoslondrina
normalmente faço assim
AS
BEGIN
IF (NEW.ID IS NULL) or (NEW.ID = 0) THEN
NEW.ID = GEN_ID(GEN_TABELA_ID,1);
END
Gostei + 0
02/02/2007
Paulo Trajano
Isso é uma pergunta? :roll:
Gostei + 0
02/02/2007
Paulo Trajano
Gostei + 0
02/02/2007
Macario
Acredito que usar os recursos que cada SGBDR dispõe, é ideal se você não necessitar de outro banco, exemplo: você sempre ira usar FireBird ai acredito que bem planejado o uso, se consegue ter ganho de produtividade.
Aqui onde trabalho, optamos por deixar a aplicação flexivel, optamos por dbExpress. Hoje usamos como padrão MSSQL2000 e MSSQL2005, mas ja fiz ´teste´ com o mesmo sistema em Firebird, com exceção de algumas SP´s que tiveram de ser personalizadas.
[]´s
Gostei + 0
02/02/2007
Paulo Trajano
O problema é que eu achop que as trigger´s estão me prejudicando...
Gostei + 0
02/02/2007
Marcoslondrina
Gostei + 0
02/02/2007
Macario
Olá.
Bom pode até ser, se você conseguiu rir. :lol:
Mas assim estamos apenas expondo pontos de vista e ideias.
Compartilhe as suas com este forum.
[]´s 8)
Gostei + 0
05/02/2007
Paulo Trajano
kkk Piada? Agora eu que pergunto: Isso é uma piada?
Mas, vamos lá. Pessoal, problema resolvido:
Qdo eu estava começando a construir meu framework, vi uma dica interessante em uma revista clube delphi que falava sobre a propriedade [b:5344fcdeea]ProviderFlags[/b:5344fcdeea] do SqlDataSet. Nesse artigo, o autor aconselhava a desativar a opção pfUpdate, caso o campo fosse a chave primária, isso porque a chave primária não entraria na cláusula update em caso de atualizaçõa do DataSet. Correto, mas eu esqueci de me perguntar o que ele estava levando em conta qd aconselhou isso. No meu caso, uso a instrução
select gen_id...
1. Eu gerava a chave. O gerador incrementava + 1;
2. Gravava.
3. Como o gerador do FB era acompanhado de uma trigger, ao dar o applyupdates, a trigger disparava e gerava outro código. Issoa pq a trigger pergunta se [b:5344fcdeea]NEW.ID IS NULL[/b:5344fcdeea], e ele realmente era nulo pq a opção pfUpdate marcada como false impedia que o Delta recebesse esse ID gerado, entenderam?
Resultado: corria o grande risco de duas pessoas gerarem seus códigos e, ao gravarem o registrio mestre e também os detalhes, haver uma confusão de chaves primárias, e era o que realmente acontecia. Daí só um dos dois registros concorrentes eram gravados.
Desmarquei a opção pfUpdate da propriedade ProviderFlags de todos os meus campos ID (a chave primária) em todos os meus SQLDataSet´s e a confusão acabou.
Que isso sirva de ajuda a todos. Valeu!
Gostei + 0
05/02/2007
Paulo Trajano
Gostei + 0
05/02/2007
Jarabeucp
Não posso ajudar muito mais boa sorte.
Gostei + 0
05/02/2007
M@gnun
se vc cria um trigger no fb pra ser disparado no insert, e depois faz o select gen_id ... no projeto, vc vai incrementar 2 vz o valor msm.
Gostei + 0
06/02/2007
Paulo Trajano
se vc cria um trigger no fb pra ser disparado no insert, e depois faz o select gen_id ... no projeto, vc vai incrementar 2 vz o valor msm.[/quote:f485ca41ba]
Era realmente isso q estava acontecendo. Mas ja resolvi
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)