Buscar

Driblando problemas com campo auto-incremento.

Código

Para aquelas pessoas que já tentaram usar Automatismos (triggers) para criar campo de auto-incremento, e tiveram problemas por causa dos componentes de conexão do delphi (DBexpress por exemplo), aí vai uma dica de como fazer isto usando stored procedure:

Digamos que eu tenho uma tabela com chave primária no campo CodCli e um procedimento
Para gerar automaticamente o seu valor (stored procedure)
//veja como criar a tabela e a procedure:

  create table clientes(
    codCli   integer not null,
    nome     varchar (50),
    endereço varchar(50),
    contraint PK_Clientes primary key(codCli)
  );
  create generator auto_codCli;
  create procedure auto_codClientes
  returns (codigo integer) as
  begin
    codigo = GEN_ID(auto_codCli,1);
    suspend;
  end;

Agora basta vc criar a conexão através do delphi e  fazer o seguinte:

Incluir um componente TSQLStoredProc, e ligamos a propriedade StoredProcName à nossa procedure. Agora no evento AfterInsert de nosso ClientDataSet, fazemos nosso imenso bloco de código:

SQLStoredProc1.ExecProc;
ClientDataSet1.FieldByName('CodCli').AsInteger := SQLStoredProc1.Params[0].AsInteger;

No entanto, haverá um problema:

Ocorrerá falhas na numeração dos registros quando vc inserir um novo registro e não salvá-lo.

Para driblar esse problema basta vc, ao invés de usar o evento AfterInsert, usar o mesmo código no evento; BeforePost do clientDataset, pois assim quando você criar um novo registro, porém não salvá-lo (post), não será executado o incremento, evitando assim falhas na numeração.

Só que ainda existe um problema (grave). Imagine que vc resolva editar um registro! Então vc usa o edit, faz as alterações e quando vai salvar novamente, veja só: foi criado uma nova id para um registro antigo (bagunça tudo!):(

Porém nem tudo está perdido, basta vc acrescentar estas singelas linhas antes do código de costume:

// se o DBedit que mostra esse campo estiver vazio, aí sim será
//executado o procedimento, do contrário permanece o número existente.

if DBedit1.Text = '' then
   begin
// vem o código de costume
   SQLStoredProc1.ExecProc;
   ClientDataSet1.FieldByName('CodCli').AsInteger := SQLStoredProc1.Params[0].AsInteger;
   end;
end;


Existem ainda outros detalhes... como por exemplo se vc excluir permanentemente um registro, o número atribuído a ele não poderá ser usado como chave para outro através de autoincremento... e isto também gera falhas de numeração...

Bom por hoje é só!

Espero ter ajudado!!!  :).
Esta foi a minha primeira dica para este site, se acharem legal eu escrevei outras!

Publicidade

Vote na dica




Quantidade de votos: 0 votos
Aceitação: 0%


Detalhes da dica

Categoria: Banco de dados
Adicionada dia: 11/04/07
Por: Messias Henrique
Visualizada: 10223 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009