Ajuda com Trigger de inclusão x Delphi 6
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
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
Curtidas 0
Respostas
Marcos Fernando
13/12/2006
Assim amigo:
se vc usa
a base vai add 1 certo?
ai vc depois manda fazer:
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
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
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!!
Obrigado!!
GOSTEI 0
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´
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
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 é ??
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
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].
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