Vamos aprender como criar um campo auto incremento no firebird, ele não possui um campo auto incremento nativo, mas através de generator e trigger podemos montar.

 

Eu criei uma tabela que nos servirá de exemplo essa tabela terá os seguintes campos

Tabela Cliente

ID

Integer

NOME

Varchar(40)

ENDERECO

Varchar(60)

 

Coloque a tabela em estado de edição através do botão  e marque a opção AutoInc do campo ID, abrirá uma tela marque a opção Create Generator, na aba Trigger, marque Create Trigger e dê OK, clique no botão  Compile. Pronto nosso campo auto incremento já está criado, precisamos criar uma tabela com apenas um só campo para receber o generator temporariamente.

Crie uma nova tabela Chamada Codigo e coloque apenas um campo integer e adicione algum numero neste campo, como demonstra a figura a seguir:

 


 

 

 vamos fazer uso deste campo no Delphi.

 

 

Crie uma nova conexão e adicione um Sqldataset coloque a seguinte instrução SQL:

 

SELECT

GEN_ID(GEN_CLIENTE_ID,1) AS NOVOID

FROM CODIGO

 

A função GEN_ID nos retorna o valor do generator atribuído a ele. AS NOVOID é o nome do campo que desejamos. Dê OK e dê dois clique em nosso SqlDataSet e com o botão direito do mouse escolha add All Fields. Apareceu o nosso campo.

Adicione um novo SqlDataSet e mude as seguintes propriedades:

 

SqlDataSet

Name

sdsCliente

SqlConnection

Nome da sua conexão

CommadText

Select * from Cliente

 

 

DataSetProvider

Name

dspCliente

DataSet

sdsCliente

 

ClientDataSet

Name

cdsCliente

ProviderName

dspCliente

 

Selecione o componente cdsCliente e dê dois clique e adicione os campos no field Editor e arraste-os para o formulário, ainda com cdsCliente selecionado coloque o seguinte código no evento OnNewRecord:

 

procedure TForm3.cdsClienteNewRecord(DataSet: TDataSet);

begin

  With sdsAutoIncremento do

  begin

    Close;

    Open;

    cdsClienteID.AsInteger:=sdsAutoIncrementoNOVOID.AsInteger;

  end;

end;

 

Adicione um DBNavigator e ligue a propriedade DataSource em nosso DataSource de Cliente

 

Não esqueça de abrir o cdsCliente no evento OnShow.

Execute a aplicação.

 

Adicione o ID na gravação: Na maneira anterior, colocamos o ID antes de começarmos a incluir os dados, desta maneira perdemos alguns ID, porque o usuário poderá cancelar a digitação dos dados. Vamos aprender a adicionar o ID quando dermos um Post, para isso iremos usar o evento BeforeUpdateRedord.

 

Declare as seguintes variáveis:

 

private

    vNum:Integer;

    FNumConta:Integer;

 

No evento OnCreate do formulário coloque o seguinte código:

 

vNum:=0;

 

No evento OnNewRecord do cdsCliente coloque o seguinte código:

 

procedure TForm3.cdsClienteNewRecord(DataSet: TDataSet);

begin

   Dec(vNum);

  cdsCliente.FieldByName('ID').AsInteger:=vNum;

end;

 

Dec(vNum) Nesta linha estou decremento o valor, como no evento OnCreate do formulário dissemos que a variável vNum recebe (0), isso significa que a cada novo registro ele retornará um a novo negativo, que  será trocado pelo generator no evento BeforeUpdateRecord.

 

Coloque o seguinte código no evento BeforeUpdateRecord do DataSetProvider:

 

procedure TForm3.dspClienteBeforeUpdateRecord(Sender: TObject;

  SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind;

  var Applied: Boolean);

begin

     if UpdateKind = ukInsert then

  begin

    if SourceDs = sdsCliente then

    begin

      sdsAutoIncremento.Open;

      try

        FNumConta := sdsAutoIncremento.FieldByName('NOVOID').AsInteger;

      finally

        sdsAutoIncremento.Close;

      end;

      DeltaDs.FieldByName('ID').NewValue :=IntToStr(FNumConta);

    end;

  end;

end;

 

Na primeira linha verificamos se o DataSet está em estado de edição, caso esteja eu abro sdsAutoIncremento e adiciono o valor dele a variável FNumConta, depois fechamos sdsAutoIncremento e troco o valor Delta do SqlDataSet, aqui está o pulo do gato.

 

Fico por aqui até o próximo artigo.

 

Rubens Antunes

Autor do Livro: Delphi – Faça Uma Aplicação Comercial