Confirmar a Integridade dos Indexes ao abrir o DBF??

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

evaldo
Usuário Nível 3
Usuário Nível 3
Mensagens: 113
Registrado em: 27 Out 2005 23:29

Mensagem por evaldo »

O que vc pode fazer e tratar o erro. Compile o arquivo ERRORSYS.PRG no seu sistema que o clipper, ja trata o erro que deu.

Código: Selecionar todos

/********************************************************
*  Errorsys.prg
*
*  Standard Clipper error handler
*
*  Copyright (c) 1990-1993, Computer Associates International, Inc.
*  All rights reserved.
*
*  Compile:  /m /n /w
*
*  Observa‡Æo: Return(.T.) = Retry   = Repetir
*              Return(.F.) = Default = PadrÆo
************************************************************/
//
#include "error.ch"
#command ?  <list,...>  =>  ?? Chr(13) + Chr(10) ; ?? <list>
#command ?? <list,...>  =>  OutErr(<list>)
#define NTRIM(n)            ( LTrim(Str(n)) )
//
/**************************************************************  ErrorSys()
*
*  Aten‡Æo:  Automaticamente Executado na Inicializacao
****************************************************************************/
proc ErrorSys()
     ErrorBlock( {|e| DefError(e)} )
return
*****************************************************************************
function DefError(e)
// qdo retorna .T. = Repetir a Operacao
// qdo retorna .F. = Pular o Erro
*************************************************************   //
   LOCAL i, cMessage, aOptions, nChoice, nOpc, nArea, nTent
   LOCAL cAlias, nOrder, nReg
   //
   // Tratamento do // Erro DBCMD/2001  Workarea not in use: ORDSETFOCU e
   // Tratamento do // Erro DBCMD/2001  Workarea not in use: DBGOTO
   //
   if e:genCode==EG_NOTABLE .and. e:Severity==ES_ERROR .and. e:subCode=2001
      if e:canDefault() // se deseja pular o erro
         return(.F.)    // default
      end
   end
   //
   // Tratamento de PRINTER ERROR
   if (e:genCode == EG_PRINT .and. e:Severity == ES_ERROR)
      if ChkPrn() // se deseja tentar de novo
         return(.T.)  // repetir
      else
         return(.F.)  // default
      end
   end
   //
   // Tratamento do // Erro DBFCDX/610  Bad index expression!:
   if (e:genCode == EG_OPEN .and. e:subcode == 610)
      Mensagem("Erro lendo arquivo " +ALIAS(),3,3)
      ALERT("Antes de usar o sistema Novamente,; " +;
         "Recrie os Öndices referente a este arquivo")
   end
   //
   // by PADRAO, indice corrompido
   //
   if ( e:genCode == EG_CORRUPTION ) .and. e:canDefault
      Mensagem("Arquivo "+ALIAS()+" com Indice CORROMPIDO. Favor Reindex -lo",5,3)
      return (.f.) // pula o erro
   end
   //
   // by PADRAO, DIFERENCA DE TAMANHO DO DADO
   if ( e:genCode == EG_DATAWIDTH ) .and. e:canDefault
      Mensagem("Arquivo com Problema no Tamanho de Campo",2,3)
      GravaErro(e)
      return (.f.) // pula o erro
   end
   //
   // by PADRAO, DIVISAO POR ZERO RETORNA 0
   //
   if ( e:genCode == EG_ZERODIV )
      return(0)
   end
   //
   // Erro abrindo arquivo em rede, set NETERR() and subsystem default
   // ERRO DOS 32 = Viola‡Æo de Compartilhamento
   // ERRO DOS 55 = Dispositivo de Rede nÆo Existe
   //
   if e:genCode == EG_OPEN .and. (e:osCode == 55 .OR. e:osCode == 32)
      if e:canDefault
         NetErr(.t.)  // Informa o Sistema Que houve um erro
         return(.f.)  // pula o erro
      end
   end
   //
   // ERRO DOS 03 = Path nao Encontrado
   //
   if e:genCode == EG_OPEN .and. (e:osCode == 03)
      if e:canDefault
         NetErr(.t.)  // Informa o Sistema Que houve um erro
         return(.f.)  // pula o erro
      end
   end
   //
   // APPEND BLANK, set NETERR() and subsystem default
   //
   if e:genCode == EG_APPENDLOCK .and. e:canDefault
      if e:canDefault
         NetErr(.t.)
         return(.f.)     // pula o erro
      end
   end
   //
   if e:genCode == EG_READ
      Mensagem("Erro lendo arquivo " +ALIAS()+ ". Tentanto Recriar os Indices")
      cAlias := ALIAS()
      nOrder := INDEXORD()
      nReg   := RECNO()
      FechaDbfNtx( {cALIAS} )
      AbreDbfNtx( {cALIAS}, Nil, .F. ) // Abre em modo exclusivo
      REINDEX EVAL Ind("Criando Indices do Arquivo "+ cAlias )
      FechaDbfNtx( {cALIAS} )
      AbreDbfNtx( {cALIAS}, Nil, .T. ) // Abre em modo compartilhado
      DBSELECTAREA(cAlias)
      SET ORDER TO nOrder
      GO nReg
      Return(.T.)  // repetir
   end
   //
   if (e:genCode == EG_NOFUNC .and. e:subcode == 1001)
      Return(.F.)  // default
   end
   //
   GravaErro(e)
   //
  return (.t.)
*************************************************************
OK
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

Cesar, apesar de toda discussão (saudável), minha opinião é a mesma, essas funções de se verificar integridade de indices não existem, a não ser funções criadas por terceiros, quartos....
O que mais uma vez recomendo, é reindexar logo na primeira execução, (index on yyy tag xxx to www).
E antes de qualquer coisa revise todo seu código-fonte, troque os comandos por funções, etc...
Com certeza vc vai ter exito
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Responder