Fórum autoincremento Dando Erro em firebird 1.5? #55675
31/03/2006
0
boa noite pessoal
sou novato em banco de dados tipo servidor pois so mexia com paradox e estou efretando um seguinte problema:
estou na Aba do Interbase com seguintes componentes:IbTable, IbDatadase,Datasource, ibTransaction,IbQuery
dentro da String do IbQuery tenho a comando abaixo:
Select Gen_Id(GEN_NEW_TABLE_ID, 1 ) from RDB$GENERATORS where RDB$GENERATOR_NAME = ´ GEN_NEW_TABLE_ID´
e no BeforePost do IbTable tenho o seguinte comando:
if IbTable1.State= dsinsert then
ibquery1.Active:= true;
IbTable1Codigo.Value:= Ibquery1GEN_ID.AsInteger;
IbQuery1.Active:= False;
tudo isso para criar um autoincremento pois estou usando IBExpert crio o Automatismo o autoincremento pelo ibexpert mas nao funciona....
pois quando vou executar o delphi ele liga as tabela tudo direitinho mas
quando vo cadastrar o Segundo ou terceiro cliente ele Da este Erro abaixo:
Debuggger Exception Notification
Project Teste.exe Raised Exception class EIBInterBaseError with message ´violation of PRIMARY or UNIQUE KEY constraint ´PK_NEW_TABLE´ on table ´NEW_TABLE´. process stopped. Use Step or Run to continue
Grato a qualquer Resposta
sou novato em banco de dados tipo servidor pois so mexia com paradox e estou efretando um seguinte problema:
estou na Aba do Interbase com seguintes componentes:IbTable, IbDatadase,Datasource, ibTransaction,IbQuery
dentro da String do IbQuery tenho a comando abaixo:
Select Gen_Id(GEN_NEW_TABLE_ID, 1 ) from RDB$GENERATORS where RDB$GENERATOR_NAME = ´ GEN_NEW_TABLE_ID´
e no BeforePost do IbTable tenho o seguinte comando:
if IbTable1.State= dsinsert then
ibquery1.Active:= true;
IbTable1Codigo.Value:= Ibquery1GEN_ID.AsInteger;
IbQuery1.Active:= False;
tudo isso para criar um autoincremento pois estou usando IBExpert crio o Automatismo o autoincremento pelo ibexpert mas nao funciona....
pois quando vou executar o delphi ele liga as tabela tudo direitinho mas
quando vo cadastrar o Segundo ou terceiro cliente ele Da este Erro abaixo:
Debuggger Exception Notification
Project Teste.exe Raised Exception class EIBInterBaseError with message ´violation of PRIMARY or UNIQUE KEY constraint ´PK_NEW_TABLE´ on table ´NEW_TABLE´. process stopped. Use Step or Run to continue
Grato a qualquer Resposta
Keliniciante
Curtir tópico
+ 0
Responder
Posts
31/03/2006
Vinicius2k
Colega,
A primeira coisa que devo lhe sugerir é que não use TIBTable. As classes TxxxTables não são projetadas para ambiente cliente/servidor e prejudicam muito a performance da aplicação. Como você está migrando agora, deve dedicar algum tempo ao estudo desta questão e, se possível, alterar a forma como trabalha os dados.
Em segundo lugar a técnica utilizada para recuperar o valor do generator não está correta. Você deveria utilizar:
Apenas isso...
E por último, porém não menos importante, é que seu autoicremento gerado pelo IBExpert, se estiver baseado em um Generator + Trigger, certamente deveria funcionar. Porém, por padrão, a Trigger é gerada com a seguinte condição:
Isto faz com ela -- a trigger -- só dispare a função GEN_ID quando o valor para o campo for nulo. Por isso, dentro da aplicação, você não deve atribuir nenhum valor ao campo que será incrementado.
A primeira coisa que devo lhe sugerir é que não use TIBTable. As classes TxxxTables não são projetadas para ambiente cliente/servidor e prejudicam muito a performance da aplicação. Como você está migrando agora, deve dedicar algum tempo ao estudo desta questão e, se possível, alterar a forma como trabalha os dados.
Em segundo lugar a técnica utilizada para recuperar o valor do generator não está correta. Você deveria utilizar:
select GEN_ID(NOME_DO_GENERATOR, 1) from RDB$DATABASE
Apenas isso...
E por último, porém não menos importante, é que seu autoicremento gerado pelo IBExpert, se estiver baseado em um Generator + Trigger, certamente deveria funcionar. Porém, por padrão, a Trigger é gerada com a seguinte condição:
if NEW.CAMPO_AUTOINC is null then
Isto faz com ela -- a trigger -- só dispare a função GEN_ID quando o valor para o campo for nulo. Por isso, dentro da aplicação, você não deve atribuir nenhum valor ao campo que será incrementado.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)