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