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 : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4547
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 806 vezes
Mens.Curtidas: 246 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
Colaborador

Colaborador
 
Mensagens: 843
Data de registro: 19 Mai 2009 15:58
Curtiu: 126 vezes
Mens.Curtidas: 38 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 : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4547
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 806 vezes
Mens.Curtidas: 246 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
(Não respondo dúvidas por MP ou E-mail. 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: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 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 é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Avatar de usuário

Nascimento
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 711
Data de registro: 19 Jul 2008 12:11
Cidade/Estado: OLINDA-PE
Curtiu: 110 vezes
Mens.Curtidas: 76 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
Colaborador

Colaborador
 
Mensagens: 843
Data de registro: 19 Mai 2009 15:58
Curtiu: 126 vezes
Mens.Curtidas: 38 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 142 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 é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Avatar de usuário

Nascimento
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 711
Data de registro: 19 Jul 2008 12:11
Cidade/Estado: OLINDA-PE
Curtiu: 110 vezes
Mens.Curtidas: 76 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 é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Avatar de usuário

Nascimento
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 711
Data de registro: 19 Jul 2008 12:11
Cidade/Estado: OLINDA-PE
Curtiu: 110 vezes
Mens.Curtidas: 76 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: 1766
Data de registro: 07 Dez 2012 15:14
Cidade/Estado: São Paulo
Curtiu: 311 vezes
Mens.Curtidas: 119 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: Nenhum usuário registrado online e 3 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro