simulando autoincremento ...

Delphi

20/02/2006

pessoal é o seguinte, por questoes que nao irei detalhar aqui preciso gerar as chaves primarias a partir do meu executavel ...

entao me sugeriram o seguinte esquema ....

no evento OnNewRecord de minha tabela colocaria o seguinte codigo:

ADODataset1.FieldByName(´codigo´).Value:= adotable1.fieldbyname(´reg´).Value + 1;


e no evento BeforePost o seguinte codigo:

procedure TForm1.ADODataSet1BeforePost(DataSet: TDataSet);
begin
  if not (DataSet.State = DsEdit) then
    begin
      adotable1.Edit;
      adotable1.FieldByName(´reg´).Value:= adotable1.fieldbyname(´reg´).Value + 1;
      adotable1.Post;
    end;
end;


bom, tenho minhas tabelas e uma adicional para contar os registros que foram inseridos em cada uma ... gostaria de saber se alguem ja fez isso, se é uma pratica comum , enfim se voces recomendam!!!!

grande abraço!!
:D


Rafael Gomes

Rafael Gomes

Curtidas 0

Respostas

Paullsoftware

Paullsoftware

20/02/2006

não sei como vc está fazendo a soma dos registros, mais se estiver usando RecordCount, pode ter problemas, não funciona...
ADODataset1.FieldByName(´codigo´).Value:= adotable1.fieldbyname(´reg´).Value + 1;


pois o RecorCount conta o total de registros incluidos e acrescenta mais um certo! e se algum registro pelo meio da tabela for excluido? por exemplo, vc tem uma tabela com 100 registros o proximos seria 101 mais se 51,52,11,01,91 forem excluidos como fica?

tente assim:
//Gera o codigo automatico das tabelas
procedure Incrementa(Nome_Tabela: String; Chave_Primaria: TField);
var
Qry:TadoDataSet;
 begin
 if Chave_Primaria.DataSet.State<>dsInsert then Exit;
  Qry := TADODataSet.Create(nil);
   Try
    Qry.Connection := DM_BANCO.CONN;
    Qry.CommandText := ´Select Max(´+chave_primaria.FieldName+´) From ´+nome_tabela;
    Qry.Open;
     if Qry.Fields[0].IsNull then chave_primaria.AsInteger := 1
     else
     chave_primaria.AsInteger := Qry.Fields[0].AsInteger+1;
    finally
    FreeAndNil(Qry);
    end
  end;

modo de usar:
Incrementa(´CLIENTES´,CLIENTESCODIGO);
//onde CLIENTES É O NOME DA TABELA E CLIENTESCODIGO O CAMPO A SER INCREMENTADO...

espero ter ajudado!


GOSTEI 0
Rafael Gomes

Rafael Gomes

20/02/2006

acho que noa ficou muito claro ... ai no caso eu tenho minhas tabelas e uma adicional chamada tbregistros essa tabela tem a seguinte estrutura:


nmtabela reg
===========================
tbclientes 10
tbregistros 20
tbusuarios 20
===========================


to utilizando os valores da coluna [b:0d94357f38]REG[/b:0d94357f38] para incrementar os codigos ... assim dessa forma nao terei problemas se forem deletados alguns registros no meio da tabela ...

esse select que vc utilizou retorna o que?? a quantidade de registros que foram inseridos contando com aqueles que foram deletados???
[]sss


GOSTEI 0
Rjun

Rjun

20/02/2006

Bom, o ideal seria se o BD fizesse isso. Mas já que você não prentede usar o autoincremento do BD utilize uma tabela com a seguinte estrutura:

Nome Varchar 100 - Guarda o nome da tabela
NextID int - Salva o valor do proximo ID

Nessa tabela você coloca o nome de todas as tabelas que você queira controlar o código. E no evento OnNewRecord você obtem a o novo código lendo da tabela.


GOSTEI 0
Rafael Gomes

Rafael Gomes

20/02/2006

bom amigos, ficauma duvida?? o que exatamente select max(campo) from tabela me retorna????

[]ss


GOSTEI 0
POSTAR