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