Corrigir Erros de campo AutoIncremento

Esta procedure corrige erro em campos auto incremento (ftAutoInc), quando ocorre o key violation provocado pela perda do sequencial do campo.



Procedure AcertaAutoInc(NomeAlias : String);
Var ParamAlias, AliasTab: Tstrings;
  contador, I : integer;
  VlrAutoInc,VLRregAutInc : Longint;
  AutoIncOK, EAutoInc : Boolean;
  Tabela: TTable;
  arqteste, CampoAutoInc, PathAlias: String;
begin
  EAutoInc := false;
  ParamAlias := TStringList.create;
  AliasTab := TStringList.create;
  Session.GetTableNames(NomeAlias,'*.db',true, true, AliasTab);
  contador := 0;
  Session.GetAliasParams(NomeAlias,ParamAlias);
  PathAlias := ParamAlias.Values[ 'PATH' ];
  if copy(PathAlias,length(PathAlias),1) = '\' then
  PathAlias := copy(PathAlias,1,length(PathAlias)-1);
  while contador <> AliasTab.Count do
  begin
  with TFileStream.Create( PathAlias +'\'+AliasTab.Strings[contador], fmOpenReadWrite) do
  begin
  AutoIncOK := (Seek($49, soFromBeginning) = $49) and (Read(VlrAutoInc, 4) = 4);
  free;
  end;
  if AutoIncOK then
  begin
  with TTable.Create(Application) do
  try
  DatabaseName := NomeAlias;
  TableName := AliasTab.Strings[contador];
  with FieldDefs do
  begin
  Update;
  for I := 0 to Count -1 do
  begin
  if Items[i].DataType = ftAutoInc then
  begin
  CampoAutoInc := (Items[I].Name);
  EAutoInc := true;
  end;
  end;
  end;
  finally
  Free;
  end;
  end
  else
  begin
  Application.MessageBox('Erro na recuperação do campo Auto-Incremento.','Atenção',MB_OK);
  Exit;
  end;
  if EAutoInc then
  begin
  Tabela := TTable.create(Application);
  Tabela.DatabaseName := NomeAlias;
  Tabela.TableName := AliasTab.Strings[Contador];
  Tabela.open;
  if Tabela.RecordCount > 0 then
  begin
  Tabela.Last;
  VLRregAutInc := Tabela.FieldByName(CampoAutoInc).Value;
  end;
  Tabela.close;
  if VlrAutoInc < VLRregAutInc then
  begin
  with TFileStream.Create(PathAlias +'\'+ AliasTab.Strings[contador], fmOpenReadWrite) do
  begin
  AutoIncOK := (Seek($49, soFromBeginning) = $49) and (Write(VLRregAutInc , 4) = 4);
  free;
  end;
  end;
  if AutoIncOK = false then
  Application.MessageBox('Erro na recuperação do campo Auto-Incremento.','Atenção',MB_OK);
  end;
  EAutoInc := false;
  contador := contador + 1;
  end;
  ParamAlias.Free;
  AliasTab.Free;
end;

{Dica enviada por:Jasoni Corrêa}

Nenhum comentário:

Postar um comentário