Incides corruptos

virus b
29 de Diciembre del 2003
Hola a todos:
Mi problema es que ya hice varios programas en VFP y en la mayor铆a de los lugares que los hice, me vuelven loco con que el programa se les rompio.
El problema es que cuando hay un corte de luz, los indices de las tablas se rompen y me sale el error 114 (y varios mas). Yo les hice un PRG que vuelve a generarlos, pero no hay caso.
¿Habr谩 alguna rutina ya creada por Uds. para que no de este error y pueda iniciar mi programa?
Desde ya muchas gracias

Luisen98
29 de Diciembre del 2003
Mira virus b, el primer paso a dar es hacer que los clientes adquieran UPS llamados tambien NO-BREAKs, que son soportes para que no tengas este tipo de eventualidades.
Ahora bien, no indicaste si trabajas en anbiente multiusuario o monousuario. Me ha tocado ver software que genera sus indices al Ingresar a este (cosa que no se puede hacer en multiusuarios, facilmente). Y pues un consejo mas, usa DELETE TAG/INDEX ON, en vez de REINDEX. Feliz A帽o 2004.



Marcelo
29 de Diciembre del 2003
Hola Pablo:

Bueno, te comendo que si vas a trabajar con FOX, es inevitable que los indices de las DBF se rompan ante un corte o apagon de la PC. Este problema se presenta normalmente, cuando realizar una APPEND en una base de datos y justo se apaga la PC. En este caso, la informaci贸n, queda grabada en el archivo, y no se logr贸 actualizar la "etiqueta" o cabecera del mismo.
Para solucionar este problema, en los sistemas, uno tiene dos opciones:

1.- Correr un programa corrector de las base de datos, cada vez que se ingrese al sistema o rutina.
(Lo que se hace pesado).

2.- Reparar la base de datos cuando este rota y se pretenda usar. (recomendado).

Para eso, se debe incluir una rutina ON ERROR que te permita realizar un an谩lisis del error ocurrido durante el transcurso de la ejecuci贸n del programa.
Por ejemplo:
ON ERROR DO errhand WITH ;
ERROR( ), MESSAGE( ), MESSAGE(1), PROGRAM( ), LINENO( )
*** LA SIGUIENTE LINEA DEBER脥A CAUSAR UN ERROR ***
USE nodatabase
ON ERROR && Desactiva la rutina de control de errores

PROCEDURE errhand
PARAMETER merror, mess, mess1, mprog, mlineno
CLEAR
? Numero de Error: ' + LTRIM(STR(merror))
? 'Mensaje del Error: ' + mess
? 'Linea que causo el error: ' + mess1
? 'Numero de linea del error: ' + LTRIM(STR(mlineno))
? 'Programa en el que se origin贸 el error: ' + mprog

Ahora, cuando uno trata de abrir una base de datos que esta corrupta te puede informar un error:
P.ej.
114 - Index does not match the table. Delete the index file and re-create the index.
o
15 - No a table

En este caso, se disviar谩 el flujo del programa hacia TU rutina de control de errores y si es "salvable" (como en el caso de rotura de 铆ndices), simplemente se "AVISA" al usuario esta condici贸n, se repara la base rota y se retorna al programa, o se reinicia el sistema.
No importa en realidad si estamos en un ambiente multiusuario, por que si no la puede abrir el terminal en cuesti贸n, quiere decir que NO hay otro usuario en la red que la este usando.

Para poder reparar las bases de datos, yo utilizo un programita que escrib铆 yo en "C" que repara las cabeceras de las mismas.
Si queres, me haces un e-mail y te lo paso.
o podes utilizar rutinas de Norton o hay algunos en la web.

Este repara el error "NO A TABLE" o "NOT A DATABASE FILE"
Una vez reparada, se deben eliminar los 铆ndices estructurales (cdx) si existen, y reindexar la base de datos.

Te paso una rutina para hacerlo.

FUNCTION rmv_cdx
PARAMETER dbfname
PRIV hnd, s
hnd = FOPEN(dbfname+'.dbf', 12)
IF hnd<0
RETURN
ENDIF
= FSEEK(hnd, 28)
s = CHR(0)
= FWRITE(hnd, s, 1)
= FCLOSE(hnd)
DELE FILE dbfname+'.cdx'
RETU

Espero, te sirva, Suerte !!!