Código
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!
Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009