Me parece un problema que no se pueda abrir la tabla.
Las tablas de Visual Fox están en la página 1252.
Si son tablas generadas con sistemas en DOS, seguramente estarán en 437.
Hay un programa de conversión llamado Cpzero.prg.
* Remove the code page from MYFILE.DBF and specify 437
* as the new code page.
*
DO Cpzero WITH 'MYFILE.DBF',437
Este programa está en la carpeta Visual FoxPro... Tools\Cpzero.
La tabla debe estar cerrada (y no usada por nadie) para correr este programa.
Ahora bien, si se intenta abrir una dbf generada con un DOS (fox ó clipper) desde Visual Fox, generalmente presenta un cuadro de diálogo para determinar en qué página de códigos está la tabla. En ningún momento dice que no puede abrirse.
En Visual Fox, la función CPDBF([nWorkArea | cTableAlias]) te dice en qué página de códigos está la tabla.
Para el caso en que el mensaje de Visual Fox sea "El archivo no es una tabla", se ha escrito la siguiente rutina (Portal Fox) que utiliza bajo nivel para reparar el encabezado de la tabla.
:
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.
Saludos.