Paradox - resolvendo index out of date

Top  Previous  Next

 

{Apesar de quase todos os meus sistemas já estarem migrando para o Interbase,

esta semana tive que me deparar com esta msg horrível. Como eu trabalho com minha

versão cliente/servidor para não ter trafego na rede, tudo estava mil

maravilhas até o "Piradox" enviar esta mensagem. Primeiro observei que quase todo ou 99%

dos erro de "Index of date" são as chaves primária do banco de dados. Como

resolver este problema sem ter que utilizar diversas ferramentas - que na maioria das

vezes danificam a integridade referêncial das tabelas. Segue  abaixo a procedure que corrige o erro ( client / server ) sem a

necessidade dos usuários sairem do sistema.

}

// WaitStart é uma procedure para enviar msg em runtime.

 

//Sintaxe:

//Antes te abrir a tabela:

 

Check_Table('Clientes.DB','Nome''NomeCliente');

 

//Caso a sua tabela não tenha índice, pode utilizar tambem:

 

Check_Table('Clientes.DB','''NomeCliente');

 

procedure Check_Table( const pTabela: ShortString;

                       const pIndice: ShortString;

                       const pCampo : ShortString);

var 

 tb : TTable;

begin

  Screen.Cursor := crAppStart;

  tb := TTable.Create(Application);

  tb.DatabaseName := appApplicationAlias;

  tb.TableName := pTabela;

  tb.TableType := ttParadox;

  if not tb.Active then 

  begin

    try

    //Tento abrir a tabela com qualquer indice para gerar a msg "Index of Date"

      tb.Open;

      tb.IndexName := pIndice;

    except

      try

        //Fecho a tabelas para abrir em mode exclusivo;

        tb.Close;

        tb.Exclusive := True;

        WaitStart(Application, 'Atualizando o arquivo PX.');

        try

           //Tento apagar o arquivo de indice .PX

          DeleteFile(PChar(GetAliasPath(appApplicationAlias) +

                     Copy(pTabela,1,Length(pTabela) - 3) + '.PX'));

        except

        end;

         WaitSetMsg('Por favor, feche a tabela ' + pTabela + ' para a'+

                     'manutenção do banco de dados...');

         //Forço a abertura da tabela me mode exclusivo.

         while not tb.Active do 

          begin

           tb.Open;

         end;

         

          WaitSetMsg('Aguarde... Compilando o banco de dados...');

         //Crio novamente o indice primário

         tb.AddIndex('',pCampo, [ixPrimary, ixUnique]);

         tb.Close;

         tb.Free;

         Screen.Cursor := crDefault;

       except

         tb.Free;

         WaitEnd;

         Screen.Cursor := crDefault;

       end;

       if _wait_form <> nil then WaitEnd;

    end;

  end;

end;