GARANTIR DESCONTO

Fórum O velho dilema: Generators com FB DBX #337183

02/02/2007

0

Olá pessoal!

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

Paulo Trajano

Responder

Posts

02/02/2007

Macario

Olá.

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


Responder

Gostei + 0

02/02/2007

Paulo Trajano

Macario, aparentemente não. Até pq o BD só chama essa trigger na hora de commitar os dados. Ou será que ele chama duas vezes, quando eu gero o código em run-time e qdo ele mesmo executa a trigger?


Responder

Gostei + 0

02/02/2007

Macario

Olá, Paulo.

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


Responder

Gostei + 0

02/02/2007

Marcoslondrina

O ID não pode estar indo para o banco com valor ´Zero´

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


Responder

Gostei + 0

02/02/2007

Paulo Trajano

O ID não pode estar indo para o banco com valor ´Zero´


Isso é uma pergunta? :roll:


Responder

Gostei + 0

02/02/2007

Paulo Trajano

Depois de muito tempo (1 ano e meio de desenvovimento desse atual sistema e 5 de programação em Delphi) estou começando a achar que as trigger´s não me ajudam muito, já que eu mesmo chamo o generator na mão em run-time. O que acham?


Responder

Gostei + 0

02/02/2007

Macario

Olá, Paulo.

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


Responder

Gostei + 0

02/02/2007

Paulo Trajano

Olá, Paulo. 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. []´s


O problema é que eu achop que as trigger´s estão me prejudicando...


Responder

Gostei + 0

02/02/2007

Marcoslondrina

isso é uma piada ?


Responder

Gostei + 0

02/02/2007

Macario

isso é uma piada ?



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)


Responder

Gostei + 0

05/02/2007

Paulo Trajano

isso é uma piada ?


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...
para gerar a chave primária. O que acontecia?

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!


Responder

Gostei + 0

05/02/2007

Paulo Trajano

Vale lembrar que a seguinte pergunta do colega marcoslondrina me fez repensar sobre o assunto, mas de outra forma. Obrigado marcos

O ID não pode estar indo para o banco com valor ´Zero´



Responder

Gostei + 0

05/02/2007

Jarabeucp

Amigo eu não usso trigger´s para meu autro incremento, tive uma grande dor de cabeça com sem nehum resultado, vim aki no forum e niguem resolveu meu problema em relação a isso, por isso uso Procedures e não trigger´s, obtive melhor resultado.


Não posso ajudar muito mais boa sorte.


Responder

Gostei + 0

05/02/2007

M@gnun

cara, nem sei se entendi direito mas ...

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.


Responder

Gostei + 0

06/02/2007

Paulo Trajano

[quote:f485ca41ba=´m@gnun´]cara, nem sei se entendi direito mas ...

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


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar