Reparar Tablas - File not a table
Publicado por Mauricio (1541 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.
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


0