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; |