GARANTIR DESCONTO

Fórum simulando autoincremento ... #313631

20/02/2006

0

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

Responder

Posts

20/02/2006

Paullsoftware

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!


Responder

Gostei + 0

20/02/2006

Rafael Gomes

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


Responder

Gostei + 0

21/02/2006

Rjun

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.


Responder

Gostei + 0

21/02/2006

Rafael Gomes

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

[]ss


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar