Ajuda com Trigger de inclusão x Delphi 6

Firebird

13/12/2006

Olá pessoal, sou iniciante no banco interbase e estou tendo dificuldade na geração de incremento via trigger.. Estou querendo que um cliente, ao clicar no botão de inserir um novo registro em um cadastro, não haja violação de chave primária caso dois usuários incluam o registro ao mesmo tempo.
Estou usando o seguinte código:

No Interbase:
/* Generator para o cadastro do grupo que tem como chave primária o campo CODGRU char (3) */

Create generator Ger_Cod_Gru as char(3);

/* Criando uma Trigger para usar o Generator */
SET TERM ^! ;
CREATE TRIGGER NR_SEQ_GRU FOR GRUPOS
ACTIVE BEFORE INSERT POSTION 0 AS
BERGIN
NEW.CODGRU = GEN_ID(GER_COD_GRU,1);
END
^!
SET TERM ; ^!

:: Até aqui tudo bem, no delphi, qundo vou incluir:

No IbQuery faço o seguite:

/* Para Pegar o valor do Generator */
SELECT GEN_ID(GER_COD_GRU, 1) as CODIGO FROM RDB$DATABASE

Qundo executo isso no delphi, não gera na sequencia correta.. fica pulando de dois em dois, ou quando gera um número alto, tipo 200, 130, etc..

Alguem pode me ajudar por favor.. ficaria muito grato coma ajuda dos colegas

meu e-mail : cmtbravo@hotmail.com


Cmtbravo

Cmtbravo

Curtidas 0

Respostas

Marcos Fernando

Marcos Fernando

13/12/2006

Assim amigo:

se vc usa

/* Criando uma Trigger para usar o Generator */
SET TERM ^! ;
CREATE TRIGGER NR_SEQ_GRU FOR GRUPOS
ACTIVE BEFORE INSERT POSTION 0 AS
BERGIN
NEW.CODGRU = GEN_ID(GER_COD_GRU,1);
END
^!
SET TERM ; ^! 


a base vai add 1 certo?

ai vc depois manda fazer:
SELECT GEN_ID(GER_COD_GRU, 1) as CODIGO FROM RDB$DATABASE 


ele vai colocar mais 1
por isso pula de 2x2

usa
[list=]SELECT GEN_ID(GER_COD_GRU, 0) as CODIGO FROM RDB$DATABASE [/list]

thanks


GOSTEI 0
Cmtbravo

Cmtbravo

13/12/2006

Cara, deu certo, eu que pensava que o gen_id(ger_cod_gru,0) era ´1´ no lugar de ´0´. Mas tem um problema. Quando um usuário clica no iserir, é gerado o sequencial ´001´, se este usuario deixar a tabela no modo de inserçao e for tomar um café, se um outro usuário, em outra estação de trabalho clicar em inserir, será gerado o mesmo número ´001´, por que? Se fosse pra ser assim, num precisava de Generator ou Trigger. Como resolver isso?

Obrigado!!


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

13/12/2006

isso acontece porque a trigger não foi criada para ser usada na inclusão, e sim na gravação.
por conta disso muitos sistemas só informam o número no momento da gravação, com uma mensagem como ´Seu pedido foi gravado com o número XXXXX´


GOSTEI 0
Cmtbravo

Cmtbravo

13/12/2006

Quer dizer que:
1 - a trigger fica como ´BEFORE INSERT´;
2 - no botão incluir eu só do um insert;
3 - no botão gravar é eu gero o seguencial é ??


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

13/12/2006

no botão gravar você não gera nada, simplesmente grava. quem gera é o banco de dados.
trigger significa gatilho, e nos RDBMS esses gatilhos são/deveriam ser disparados automaticamente.

não sei como funciona o seu programa, portanto vou usar uma rotina minha como exemplo.
tenho os seguintes campos na tabela notafiscal:

----------------------
NOTAFISCAL
----------------------
IDNOTAFISCAL int (PK) (+)
IDCLIENTE int (FK)
NUMERO numeric(6)
CRIACAO date
EMISSAO datetime
VALOR numeric(10,2)
ICMS numeric(10,2)
etc....

os tipos são definidos por domains, mas os coloquei aqui para ilustrar melhor.

o campo [i:ea46fc6ee4]idnotafiscal[/i:ea46fc6ee4] nunca é visível pelo usuário. ele é um campo interno utilizado para relacionamento de tabelas e etc, somente o campo [i:ea46fc6ee4]numero[/i:ea46fc6ee4] é exibido

o que ocorre?
no momento da inclusão do registro (insert ou append):
o campo [i:ea46fc6ee4]numero[/i:ea46fc6ee4] fica vazio e o campo [i:ea46fc6ee4]idnotafiscal[/i:ea46fc6ee4] recebe o valor de GetTickCount(), que é a quantidade de segundos que o micro está ligado. esse valor é gerado simplesmente para poder fazer o relacionamento com a tabela-filha.

no momento da gravação (applyupdates):
o campo [i:ea46fc6ee4]numero[/i:ea46fc6ee4] continua vazio e o campo [i:ea46fc6ee4]idnotafiscal[/i:ea46fc6ee4] recebe o valor atribuído automaticamente pela trigger. de posse desse valor eu altero o valor do campo na tabela-filha e mando gravá-la, já com o valor correto.

no momento da impressão:
gero um novo número para a nota fiscal e preencho o campo [i:ea46fc6ee4]numero[/i:ea46fc6ee4].


GOSTEI 0
POSTAR