Como checar se arquivo de indices está corrompido?
Moderador: Moderadores
- aprendiz_ce
- Usuário Nível 3

- Mensagens: 147
- Registrado em: 21 Jul 2011 10:05
- Localização: Fortaleza/CE
Como checar se arquivo de indices está corrompido?
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.
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.
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Como checar se arquivo de indices está corrompido?
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.
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 [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
- aprendiz_ce
- Usuário Nível 3

- Mensagens: 147
- Registrado em: 21 Jul 2011 10:05
- Localização: Fortaleza/CE
Como checar se arquivo de indices está corrompido?
Olá rochinha,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.
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.
Como checar se arquivo de indices está corrompido?
Depois do seek, eu testo se o campo chave do registro achado é realmente o pesquisado...
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
Código: Selecionar todos
sele carq
seek chave
if .not. eof()
if campo-chave-de-carq#chave
Msg("Indice invalido, reindexe")
close all
quit
endif
endiflugab
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Como checar se arquivo de indices está corrompido?
Amiguinhos,
aprendiz_ce
- 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:
aprendiz_ce
Então, dê mais detalhes: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.
- 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: Selecionar todos
...
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 [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
- aprendiz_ce
- Usuário Nível 3

- Mensagens: 147
- Registrado em: 21 Jul 2011 10:05
- Localização: Fortaleza/CE
Como checar se arquivo de indices está corrompido?
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.
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.
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Como checar se arquivo de indices está corrompido?
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.
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)
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)
- Nascimento
- Usuário Nível 4

- Mensagens: 763
- Registrado em: 19 Jul 2008 12:11
- Localização: OLINDA-PE
Como checar se arquivo de indices está corrompido?
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
OBS: não testei , apenas pelo cabeçario do .prg que acho que pode te ser útil
Código: Selecionar todos
* 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
Como checar se arquivo de indices está corrompido?
Bom dia, Nascimento
Sem as funções abaixo nem da pra testar...
Sem as funções abaixo nem da pra testar...
Feliz 2018 !!!dbclearind()
GetFattr( )
IndexCorrupt()
lugab
- Nascimento
- Usuário Nível 4

- Mensagens: 763
- Registrado em: 19 Jul 2008 12:11
- Localização: OLINDA-PE
Como checar se arquivo de indices está corrompido?
juro que nem reparei , com tempo vou procurar aqui o restante no baú do esquecimento
mais tem outra funçao aqui
mais achei a lib do codigo acima tudo indica que tem as funções que faltam
segue em anexo a função dbclearind() aparentemente é nato do clipper vi nesse link
mais tem outra funçao aqui
Código: Selecionar todos
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 isbadmais achei a lib do codigo acima tudo indica que tem as funções que faltam
segue em anexo 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
- Nascimento
- Usuário Nível 4

- Mensagens: 763
- Registrado em: 19 Jul 2008 12:11
- Localização: OLINDA-PE
Como checar se arquivo de indices está corrompido?
Me Bateu uma curiosidade...
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
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
-
Kapiaba
- Colaborador

- Mensagens: 1908
- Registrado em: 07 Dez 2012 16:14
- Localização: São Paulo
- Contato:
Como checar se arquivo de indices está corrompido?
Tente assim:
Código: Selecionar todos
SELECT...
GO TOP
IF ORDKEYCOUNT() # RECCOUNT()
VERIFY_CDX( "CADNFE" )
ENDIF
FUNCTION VERIFY_CDX( XNOMEARQ )
? "Problemas nos indices... Verifique!"
RETURN NIL
- aprendiz_ce
- Usuário Nível 3

- Mensagens: 147
- Registrado em: 21 Jul 2011 10:05
- Localização: Fortaleza/CE
Como checar se arquivo de indices está corrompido?
Você já respondeu o que eu necessitava saber.Jairo Maia escreveu:Não há em Harbour nem em Clipper nenhum recurso para isso.
Obrigado pela sua atenção.
Sucesso é a soma de pequenos esforços, repetidos o tempo todo.
- aprendiz_ce
- Usuário Nível 3

- Mensagens: 147
- Registrado em: 21 Jul 2011 10:05
- Localização: Fortaleza/CE
Como checar se arquivo de indices está corrompido?
O código é somente esse mesmo? Se for, vou testa-lo.Kapiaba escreveu:Tente assim:
Código: Selecionar todos
SELECT... GO TOP IF ORDKEYCOUNT() # RECCOUNT() VERIFY_CDX( "CADNFE" ) ENDIF FUNCTION VERIFY_CDX( XNOMEARQ ) ? "Problemas nos indices... Verifique!" RETURN NIL
Grato pela sua atenção.
Sucesso é a soma de pequenos esforços, repetidos o tempo todo.
- aprendiz_ce
- Usuário Nível 3

- Mensagens: 147
- Registrado em: 21 Jul 2011 10:05
- Localização: Fortaleza/CE
Como checar se arquivo de indices está corrompido?
Beleza!Nascimento escreveu:no meio das minhas tranqueiras achei algo interessante possa ser que lhe ajude
Vou o ver o que consigo fazer com essa rotina.
Grato.
Sucesso é a soma de pequenos esforços, repetidos o tempo todo.