FoxPro/Visual FoxPro - Reparar Tablas - File not a table

   
Vista:
Imágen de perfil de Mauricio

Reparar Tablas - File not a table

Publicado por Mauricio (1368 intervenciones) el 31/07/2009 15:10:08
*
El error que Visual Foxpro regresa cuando se corrompe el encabezado de una tabla y no podemos abrirla.
*
La siguiente rutina calcula el número de registros que contiene la tabla y los compara con el contenido del encabezado de la misma y de ser necesario, lo repara.
*-----------------
*- Reparar tabla -
*-----------------
FUNCTION _ReparaEncabezado(cTabla)

LOCAL nArea,nTamañoTabla,nRegistros,nTamañoencabezado,;
nTamañoRegistro,nRegistrosCalculados

nArea=FOPEN(cTabla,12)
nTamañoTabla=FSEEK(nArea,0,2)

nRegistros=_Lee(nArea, 4,4)
nTamañoEncabezado=_Lee(nArea, 8,2)
nTamañoRegistro=_Lee(nArea,10,2)

nRegistrosCalculados=FLOOR((nTamañoTabla-nTamañoEncabezado)/;
nTamañoRegistro)
IF nRegistrosCalculados#nRegistros
_Escribe(nArea,4,4,nRegistrosCalculados)
ENDIF

=FCLOSE(nArea)

ENDFUNC

*------------------
*- Lee encabezado -
*------------------
FUNCTION _Lee(nArea,nPosicion,nTamaño)

LOCAL cCadena,nValor,nSubInd

=FSEEK(nArea,nPosicion,0)
cCadena=FREAD(nArea, nTamaño)
nValor = 0
FOR nSubInd=0 TO nTamaño-1
nValor=nValor+ASC(SUBSTR(cCadena,nSubInd+1))*256^nSubInd
ENDFOR

RETURN INT(nValor)

ENDFUNC

*------------------------
*- Reescribe encabezado -
*------------------------
FUNCTION _Escribe(nArea,nPosicion,nTamaño,nNumero)

LOCAL cCadena,nSubInd

cCadena=''
FOR nSubInd=0 TO nTamaño-1
cCadena=cCadena+CHR(nNumero/256^nSubInd%256)
ENDFOR

=FSEEK(nArea, nPosicion,0)

RETURN FWRITE(nArea,cCadena)

ENDFUNC
Es recomendable que en las rutinas de mantenimiento de archivos se elimine primero el indice (CDX), se revise el encabezado con la rutina anterior y posteriormente se generen los indices de nuevo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Reparar Tablas - File not a table

Publicado por Danilo Monroy C (1 intervención) el 01/10/2009 11:51:50
Mauricio:
Excelente trabajo !
Gracias por este importantisimo aporte.
Lo use con exito en un caso donde con cmrepair no fue posible reparar la tabla.
Sus resultados : exito en la reparacion.
Gracias de nuevo por su valiosa ayuda !

Danilo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar