Ver Mensaje Individual
  #13  
Antiguo 06-08-2007
[basti] basti is offline
Miembro Premium
 
Registrado: ago 2004
Posts: 388
Reputación: 20
basti Va por buen camino
Este código es para reparar los campos Autonuméricos en paradox. El procedimiento ActualizarAutoInc es cortesía de Román.

Código Delphi [-]

procedure ResetAutoinc(Tabla: TTable);

  function HayAutoinc : string;
  var
    i : Integer;
  begin
    Result := '';
    i := 0;
    while (i < Tabla.FieldCount) and (Result = '')  do
    begin
      if Tabla.Fields[i].DataType = ftAutoinc then
        Result := Tabla.Fields[i].FieldName;
      i := i + 1;
    end;
  end;

  function ValorAutoinc(campo : string) : Integer;
  var
    q : TQuery;
  begin
    q := TQuery.Create(self);
    q.DatabaseName := Tabla.DatabaseName;
    q.SQL.Add(format('Select max(%s) as result from %s', [campo, Tabla.TableName]));
    q.Active := True;
    Result := q.FieldByName('result').AsInteger;
  end;

  procedure ActualizarAutoinc(valor : Integer);
  var
    mystream : tfilestream;
    AParams : TStringList;
    dir : string;
  begin
    AParams := TStringList.Create;
    AParams.Clear;
    Session.GetAliasParams(Tabla.DatabaseName, AParams);
    Dir := Copy(AParams.Strings[0],6,255);
    if dir[length(dir)] <> '\' then
      dir := dir + '\';
    AParams.Free;

    mystream := tfilestream.Create(dir + tabla.TableName,
                fmOpenWrite + fmShareExclusive);
    try
      mystream.Seek(73, soFromBeginning);
      mystream.Writebuffer(valor, SizeOf(valor));
    finally
      mystream.Free;
    end;
  end;

var
  valor : Integer;
  campo : string;
begin
  try
    Tabla.Active := True;
    campo := HayAutoinc;
    if campo <> '' then
    begin
      valor := ValorAutoinc(campo);
      Tabla.Active := False;
      ActualizarAutoinc(valor);
    end;
  finally
    if Tabla.Active then
      Tabla.Active := False;
  end;
end;
Responder Con Cita