Clipper On Line • Ver Tópico - Como checar se arquivo de indices está corrompido?

Como checar se arquivo de indices está corrompido?

Discussão sobre a linguagem CA-Clipper.

Moderador: Moderadores

 

Como checar se arquivo de indices está corrompido?

Mensagempor aprendiz_ce » 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.
Sucesso é a soma de pequenos esforços, repetidos o tempo todo.
Avatar de usuário

aprendiz_ce
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 147
Data de registro: 21 Jul 2011 10:05
Cidade/Estado: Fortaleza/CE
Curtiu: 0 vez
Mens.Curtidas: 7 vezes

Como checar se arquivo de indices está corrompido?

Mensagempor rochinha » 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.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

O cara pode até ser feio, mas se ele for honesto, cheiroso, trabalhador,... vai continuar feio, porque, ..., uma coisa não tem nada a ver com a outra.


Sou Corinthiano, mas também torço para São Paulo, Palmeiras, Santos em campeonatos internacionais, portanto, Corinthians no coração e Harbour na cabeça.

[color=#FFFFFF]
"...Feliz aquele que transfere o que sabe e aprende o que ensina. Cora Coralina..."
[color=#FFFFFF]"...Acharam que eu estava derrotado, quem achou estava errado, eu voltei, tô aqui, tô firmão, tô na correria, sô guerreiro, sô vaso ruim de quebrar, tô de volta pro mundão..."
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 3974
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 382 vezes
Mens.Curtidas: 154 vezes

Como checar se arquivo de indices está corrompido?

Mensagempor aprendiz_ce » 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.
Sucesso é a soma de pequenos esforços, repetidos o tempo todo.
Avatar de usuário

aprendiz_ce
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 147
Data de registro: 21 Jul 2011 10:05
Cidade/Estado: Fortaleza/CE
Curtiu: 0 vez
Mens.Curtidas: 7 vezes

Como checar se arquivo de indices está corrompido?

Mensagempor lugab » 23 Dez 2017 15:02

Depois do seek, eu testo se o campo chave do registro achado é realmente o pesquisado...
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
lugab
lugab
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 738
Data de registro: 19 Mai 2009 15:58
Curtiu: 80 vezes
Mens.Curtidas: 18 vezes

Como checar se arquivo de indices está corrompido?

Mensagempor rochinha » 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:
...
    dbGotop()
    dbSeek( m->procurar )
    if found()
       ...
    endif
...
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

O cara pode até ser feio, mas se ele for honesto, cheiroso, trabalhador,... vai continuar feio, porque, ..., uma coisa não tem nada a ver com a outra.


Sou Corinthiano, mas também torço para São Paulo, Palmeiras, Santos em campeonatos internacionais, portanto, Corinthians no coração e Harbour na cabeça.

[color=#FFFFFF]
"...Feliz aquele que transfere o que sabe e aprende o que ensina. Cora Coralina..."
[color=#FFFFFF]"...Acharam que eu estava derrotado, quem achou estava errado, eu voltei, tô aqui, tô firmão, tô na correria, sô guerreiro, sô vaso ruim de quebrar, tô de volta pro mundão..."
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 3974
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 382 vezes
Mens.Curtidas: 154 vezes

Como checar se arquivo de indices está corrompido?

Mensagempor aprendiz_ce » 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.
Sucesso é a soma de pequenos esforços, repetidos o tempo todo.
Avatar de usuário

aprendiz_ce
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 147
Data de registro: 21 Jul 2011 10:05
Cidade/Estado: Fortaleza/CE
Curtiu: 0 vez
Mens.Curtidas: 7 vezes

Como checar se arquivo de indices está corrompido?

Mensagempor Jairo Maia » 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.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2004
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 217 vezes
Mens.Curtidas: 195 vezes

Como checar se arquivo de indices está corrompido?

Mensagempor Nascimento » 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

*   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

A arte de programar é simplismente fazer seus penssamentos serem interpletados por uma maquina :) clipper 5.3 /harbour 3.2
skype jnf-games
Avatar de usuário

Nascimento
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 381
Data de registro: 19 Jul 2008 12:11
Cidade/Estado: OLINDA
Curtiu: 45 vezes
Mens.Curtidas: 32 vezes

Como checar se arquivo de indices está corrompido?

Mensagempor lugab » 30 Dez 2017 17:12

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


Feliz 2018 !!!
lugab
lugab
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 738
Data de registro: 19 Mai 2009 15:58
Curtiu: 80 vezes
Mens.Curtidas: 18 vezes

Como checar se arquivo de indices está corrompido?

Mensagempor Nascimento » 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

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

A arte de programar é simplismente fazer seus penssamentos serem interpletados por uma maquina :) clipper 5.3 /harbour 3.2
skype jnf-games
Avatar de usuário

Nascimento
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 381
Data de registro: 19 Jul 2008 12:11
Cidade/Estado: OLINDA
Curtiu: 45 vezes
Mens.Curtidas: 32 vezes

Como checar se arquivo de indices está corrompido?

Mensagempor Nascimento » 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
A arte de programar é simplismente fazer seus penssamentos serem interpletados por uma maquina :) clipper 5.3 /harbour 3.2
skype jnf-games
Avatar de usuário

Nascimento
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 381
Data de registro: 19 Jul 2008 12:11
Cidade/Estado: OLINDA
Curtiu: 45 vezes
Mens.Curtidas: 32 vezes

Como checar se arquivo de indices está corrompido?

Mensagempor Kapiaba » 08 Jan 2018 11:31

Tente assim:

   SELECT...

   GO TOP

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

FUNCTION VERIFY_CDX( XNOMEARQ )

   ? "Problemas nos indices... Verifique!"

RETURN NIL
Kapiaba
Colaborador

Colaborador
 
Mensagens: 1370
Data de registro: 07 Dez 2012 15:14
Cidade/Estado: São Paulo
Curtiu: 271 vezes
Mens.Curtidas: 84 vezes

Como checar se arquivo de indices está corrompido?

Mensagempor aprendiz_ce » 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.
Sucesso é a soma de pequenos esforços, repetidos o tempo todo.
Avatar de usuário

aprendiz_ce
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 147
Data de registro: 21 Jul 2011 10:05
Cidade/Estado: Fortaleza/CE
Curtiu: 0 vez
Mens.Curtidas: 7 vezes

Como checar se arquivo de indices está corrompido?

Mensagempor aprendiz_ce » 11 Jan 2018 10:46

Kapiaba escreveu:Tente assim:

   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.
Sucesso é a soma de pequenos esforços, repetidos o tempo todo.
Avatar de usuário

aprendiz_ce
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 147
Data de registro: 21 Jul 2011 10:05
Cidade/Estado: Fortaleza/CE
Curtiu: 0 vez
Mens.Curtidas: 7 vezes

Como checar se arquivo de indices está corrompido?

Mensagempor aprendiz_ce » 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.
Sucesso é a soma de pequenos esforços, repetidos o tempo todo.
Avatar de usuário

aprendiz_ce
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 147
Data de registro: 21 Jul 2011 10:05
Cidade/Estado: Fortaleza/CE
Curtiu: 0 vez
Mens.Curtidas: 7 vezes




Retornar para CA-Clipper

Quem está online

Usuários vendo este fórum: Google [Bot] e 1 visitante


Faça uma doação para o forum
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro