Clipper On Line • Ver Tópico - Como checar se arquivo de indices está corrompido?
Mudar para estilo Clássico
Discussão sobre a linguagem CA-Clipper.
Postar uma resposta

Como checar se arquivo de indices está corrompido?

21 Dez 2017 18:36

Prezados Colegas,

Existe alguma maneira de checar se um determinado arquivo de índices está corrompido? Se sim, como devo proceder?
Estou utilizando DBF/CDX.

Muitíssimo obrigado e aguardo qualquer orientação.

Como checar se arquivo de indices está corrompido?

22 Dez 2017 02:18

Amiguinhos,

aprendiz_ceMinha dica?

Simplemente apague o indices e recrie.

Indices são arquivos acessórios do seu .DBF portanto descartáveis. Só servem para organizar os dados. Poderiamos dizer que são ordenações temporárias fixas. Fixas porque criamos uma vez e usamos sempre. Ficaria demorado ter de recriar toda vez que o .DBF fosse acessado.

Como checar se arquivo de indices está corrompido?

23 Dez 2017 13:46

rochinha escreveu:Amiguinhos,

aprendiz_ceMinha dica?

Simplemente apague o indices e recrie.

Indices são arquivos acessórios do seu .DBF portanto descartáveis. Só servem para organizar os dados. Poderiamos dizer que são ordenações temporárias fixas. Fixas porque criamos uma vez e usamos sempre. Ficaria demorado ter de recriar toda vez que o .DBF fosse acessado.


Olá rochinha,

Eu não tenho nenhuma duvida com relação o que são indexes, e muito menos para que servem. A questão é que estou fazendo uma rotina
de intercâmbio de dados e isso seria muito útil para mim.

Grato pelo seu comentário.

Como checar se arquivo de indices está corrompido?

23 Dez 2017 15:02

Depois do seek, eu testo se o campo chave do registro achado é realmente o pesquisado...
Código:
sele carq
seek chave
if .not. eof()
   if campo-chave-de-carq#chave
      Msg("Indice invalido, reindexe")
     close all
     quit
  endif
endif


Infelizmente essa solução não serve para qdo o seek() não acha o registro desejado, porém ele existe mas a falha nos índices impede de localizá-lo. Vc até poderia usar o locate() nesse caso, mas ele é deveras lento

Como checar se arquivo de indices está corrompido?

24 Dez 2017 12:29

Amiguinhos,

aprendiz_ce
Olá rochinha,

Eu não tenho nenhuma duvida com relação o que são indexes, e muito menos para que servem. A questão é que estou fazendo uma rotina
de intercâmbio de dados e isso seria muito útil para mim.

Grato pelo seu comentário.


Então, dê mais detalhes:

- Está usando os mesmos DBFs com aplicativos xBase compatíveis rodando em paralelo?
- Está usando os mesmo motores nas duas aplicações. Só NDX ou só CDX?
- Está usando aplicativo VB ou/e Delphi com o aplicativo xBase compatível?
- Está usando StrZero() no lugar de Str() para compatibilizar as chaves?

Muito já se foi discutido aqui e a conclusão você poderá LER pro seus próprios olhos:

2006
2013

Outra dica:

Ante de fazer seek dê um dbGotop:
Código:
...
    dbGotop()
    dbSeek( m->procurar )
    if found()
       ...
    endif
...

Como checar se arquivo de indices está corrompido?

27 Dez 2017 09:56

Olá rochinha, bom dia!

Com relação aos seus questionamentos, posso te afirma que tudo está como deve ser.

O "problema" (se posso chamar assim) é somente verificar a integridade do arquivo de índices, somente isso. Esqueçamos
para o momento a finalidade. Simplificando: Como verifico isso com CLIPPER com índices CDX?. Só me interessa verificar
se o mesmo está INTEGRO no momento da abertura do mesmo.

Mais uma vez obrigado pela sua atenção.

Como checar se arquivo de indices está corrompido?

27 Dez 2017 15:53

Olá aprendiz_ce,

Não há em Harbour nem em Clipper nenhum recurso para isso.

Ao tentar abrir um indice se ele estiver corrompido o sistema retornará RTE (Run Time Error - Erro em tempo de execução) .

O que precisamos, é que você detalhe em quais situações isso ocorre. Não leve a mal, mas normalmente está relacionado a um erro de estrutura do aplicativo, e sempre relacionado a aplicativo que trabalha em rede, caso não seja em rede, o aplicativo tem um erro primário.

Acho que se você conseguir detalhar melhor quando ele ocorre, muitos colegas poderão ajudar.

NOTA: Não vejo (uso assim, mas após migrar para Harbour nunca mais tive esse problema**), outra forma de tratar esse problema no arquivo ERRORSYS.PRG, encaminhando para os devidos tratamentos. Isso não é simples, porque requer paralisar todas as máquinas da rede e tratar o problema, e depois se houve sucesso liberar a rede.

**Alterar ERRORSYS.PRG é algo que tem que ser feito com extremo cuidado.

Como checar se arquivo de indices está corrompido?

30 Dez 2017 04:23

no meio das minhas tranqueiras achei algo interessante possa ser que lhe ajude

OBS: não testei , apenas pelo cabeçario do .prg que acho que pode te ser útil

Código:
*   Program:  VALIDNTX.PRG
*   Authors:  Joseph D. Booth and Greg Lief
*
*                          EXT  Key  Size
*
STATIC   aOffset :=   { {".IDX", 17,  13},;
                        {".NDX", 25,  13},;
                        {".NTX", 23,  15},;
                        {".CDX",513,  13} }

#translate   OrgBagExt()    => ".NTX"

*  Function:  ValidNtx()
*   Purpose:  Validate an index appears ok and optionally recreate it
*    Syntax:  <numeric>  := VALIDNTX( cFile,cExpr,lCreate )
* Arguments:  cFile     - Index file name, with no extension
*             cExpr     - Expression file is indexed on
*             lCreate   - Can index be created if needed?
*
*   Returns:   0        - Everything ok
*             -1        - File is corrupt
*             -2        - File does not exist and can't be created
*             -3        - Index file is set to read only
*             >0        - A DOS error
*              2        - File not found
*              3        - Path not found
*              4        - Too many files open
*              5        - Access denied
*              6        - Invalid handle
*              8        - Insufficient memory
*             15        - Invalid drive specified
*             19        - Attempted to write to a write-protected
*             21        - Drive not ready
*             23        - Data CRC error
*             29        - Write fault
*             30        - Read fault
*             32        - Sharing violation
*             33        - Lock Violation
*
*
*     Notes:  This function examines an index file using the low
*             level file functions and makes a guess as to whether
*             or not the file is a valid NTX. The expression stored
*             is stored with the passed expression to see if they
*             matched.
*
*   Example:  if  ValidNTX("CUST1","upper(CUST_CODE)",.T.) <> 0
*                Alert("CUST1 is unavailable...")
*             endif
*
***********************************************************************

function ValidNTX(cFile,cExpr,lCreate)
LOCAL nReturn    := 0
LOCAL cFullName  := cFile +OrgBagExt()
LOCAL x
LOCAL nHandle
LOCAL nSize
LOCAL cFileExpr
LOCAL buf
LOCAL cExt := OrgBagExt()

lcreate := if(lCreate==NIL,.F.,lCreate)

if !file( cFullname )
   if lCreate
      dbclearind()
      index on &cExpr. to (cFIle)
      dbclearind()
      nreturn := 0
   else
      nReturn := -2
   endif
elseif "R" $ GetFattr( cFullname )
   nReturn := -3
else
   if !IndexCorrupt( cFile,OrgBagExt() )
      //
      nHandle := fopen( cFullname,64 )
      if nHandle = -1
         nReturn := Ferror()
      else
         x := ascan( aOffSet, { |zz| zz[1]=upper(cExt) } )
         if x > 0
            buf := space(1024)
            fread(nHandle,@buf,1024)
            fclose(nHandle)
            nSize     := bin2w(substr(buf,aOffset[x,3],2))
            cFileExpr := upper(cleanstr(substr(buf,aOffset[x,2],nSize)))
            if cFileExpr = cExpr
               nReturn := 0
            else
               nReturn := -1
               if lCreate
                  dbclearind()
                  index on &cExpr. to (cFIle)
                  dbclearind()
                  nreturn := 0
               endif
            endif
         else
            nReturn := -1
         endif
      endif

      //
   else
      nReturn := -1
   endif
endif
return nReturn


Como checar se arquivo de indices está corrompido?

30 Dez 2017 17:12

Bom dia, Nascimento
Sem as funções abaixo nem da pra testar...
dbclearind()
GetFattr( )
IndexCorrupt()


Feliz 2018 !!!

Como checar se arquivo de indices está corrompido?

30 Dez 2017 19:05

juro que nem reparei , com tempo vou procurar aqui o restante no baú do esquecimento

mais tem outra funçao aqui

Código:
function corrupto(indice,chave)
private isbad
isbad = .f.
if isbad = .f.
   return isbad
endif
v_chave = ''
set order to 0
go bott
/*if eof() .and. bof()
   return .f.
endif*/
v_chave = &chave
set index to &indice
seek v_chave
if !found() .and. valtype(&chave) # 'U'
   return .t.
endif
if v_chave # &chave
   isbad := .t.
endif

if isbad
   alerta5()
   ok_ind=confirma("Arquivo de indice danificado. Deseja Corrigir? ")
   if ok_ind = 2
      isbad := .f.
   endif
endif   
return isbad


mais achei a lib do codigo acima tudo indica que tem as funções que faltam
segue em anexo
BLNET.rar
possivelmente é a lib do arquivo acima , mais so em clipper ok
(30.49 KiB) Baixado 141 vezes


a função dbclearind() aparentemente é nato do clipper vi nesse link
Reference Item| Description
|
DBCLEARIND() | Close indexes
DBCREATEIND() | Create an index file
DBREINDEX() | Recreate all active indexes
DBSEEK() | Search for a key value
DBSETINDEX() | Open an index
DBSETORDER() | Set the controlling order
DESCEND() | Create a descending index key value
FOUND() | Determine if the previous search operation succeeded
INDEX | Create an index file
INDEXEXT() | Return the default index extension
INDEXKEY() | Return the key expression of a specified index
INDEXORD() | Return the order position of the controlling index
REINDEX | Rebuild open indexes in the current workarea
SET INDEX | Open index file(s) in the current work area
SET ORDER | Set a new controlling index
SET UNIQUE | Toggle the inclusion of nonunique keys into an index

Como checar se arquivo de indices está corrompido?

02 Jan 2018 11:20

Me Bateu uma curiosidade...
STATIC aOffset := { {".IDX", 17, 13},;
{".NDX", 25, 13},;
{".NTX", 23, 15},;
{".CDX",513, 13} }


os índices em harbour será que mantém o mesmo offset que no clipper?
ou não se não , será que alguem sabe os novos offsets?
de outro modo teria que saber com o VicKtor ou Prmzek?
o motivo é simples percebi que pode se portar pra harbour
mais para portar pra harbour tem que ter certeza se os offsets são iguais

Como checar se arquivo de indices está corrompido?

08 Jan 2018 11:31

Tente assim:

Código:
   SELECT...

   GO TOP

   IF ORDKEYCOUNT() # RECCOUNT()
      VERIFY_CDX( "CADNFE" )
   ENDIF
   

FUNCTION VERIFY_CDX( XNOMEARQ )

   ? "Problemas nos indices... Verifique!"

RETURN NIL

Como checar se arquivo de indices está corrompido?

11 Jan 2018 10:44

Jairo Maia escreveu:Não há em Harbour nem em Clipper nenhum recurso para isso.


Você já respondeu o que eu necessitava saber.

Obrigado pela sua atenção.

Como checar se arquivo de indices está corrompido?

11 Jan 2018 10:46

Kapiaba escreveu:Tente assim:

Código:
   SELECT...

   GO TOP

   IF ORDKEYCOUNT() # RECCOUNT()
      VERIFY_CDX( "CADNFE" )
   ENDIF
   

FUNCTION VERIFY_CDX( XNOMEARQ )

   ? "Problemas nos indices... Verifique!"

RETURN NIL


O código é somente esse mesmo? Se for, vou testa-lo.

Grato pela sua atenção.

Como checar se arquivo de indices está corrompido?

11 Jan 2018 10:48

Nascimento escreveu:no meio das minhas tranqueiras achei algo interessante possa ser que lhe ajude


Beleza!

Vou o ver o que consigo fazer com essa rotina.

Grato.
Postar uma resposta