autoincremento Dando Erro em firebird 1.5?

Firebird

31/03/2006

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


Keliniciante

Keliniciante

Curtidas 0

Respostas

Vinicius2k

Vinicius2k

31/03/2006

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:
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.


GOSTEI 0
POSTAR