*-- REPARACIÓN DE ARCHIVOS DBF
*-- Autor: Fernando D. Bozzo
*-- 07/10/2009 08:55
LPARAMETERS tcTabla
#DEFINE CRLF CHR(13) + CHR(10)
LOCAL lnBadRecs, loReg, lcLog, lnCopiados, lnNoPudoBorrar, llNoPudoPackear, lcTablaRecover ;
, loException as Exception
SET SAFETY OFF
SET OPTIMIZE OFF
IF EMPTY(tcTabla)
tcTabla = "C:\_Test\TablasCorrompidas\BARBASTRO 251\gct00100.DBF"
ENDIF
lcLog = FORCEEXT(tcTabla, "LOG")
lcTablaRecover = ADDBS(JUSTPATH(tcTabla)) + JUSTSTEM(tcTabla) + "_REP"
USE IN (SELECT(JUSTSTEM(tcTabla)))
*-- Aqui debería hacer el backup de la tabla y archivos relacionados.
STRTOFILE("Inicio de reparación de la tabla " + JUSTFNAME(tcTabla) + REPLICATE("-", 20) + CRLF, lcLog, 1)
USE (tcTabla) EXCLUSIVE ALIAS T_TABLA
COPY STRUCTURE EXTENDED TO C:\T_STRU
SELECT * FROM C:\T_STRU INTO ARRAY a_Stru
USE IN (SELECT("T_STRU"))
TRY
ERASE "C:\T_STRU.DBF"
CATCH
ENDTRY
CREATE TABLE (lcTablaRecover) FROM ARRAY a_Stru
USE IN (SELECT(JUSTSTEM(lcTablaRecover)))
USE (lcTablaRecover) ALIAS T_REPARADA EXCLUSIVE IN 0
SELECT T_TABLA
lnBadRecs = 0
lnNoPudoBorrar = 0
lnCopiados = 0
SCAN FOR NOT DELETED() NOOPTIMIZE
TRY
SCATTER MEMO NAME loReg
INSERT INTO T_REPARADA FROM NAME loReg
lnCopiados = lnCopiados + 1
CATCH TO loException WHEN .T.
lnBadRecs = lnBadRecs + 1
*MESSAGEBOX(loException.Message + CHR(13) + "Registro actual: " + TRANSFORM(RECNO()))
STRTOFILE("El registro " + TRANSFORM(RECNO()) + " está dañado." + CRLF, lcLog, 1)
ENDTRY
*TRY
* DELETE
*CATCH TO loException WHEN .T.
* *MESSAGEBOX(loException.Message + CHR(13) + "Registro actual: " + TRANSFORM(RECNO()))
* STRTOFILE("No se pudo marcar para eliminar registro: " + TRANSFORM(RECNO()) + CRLF, lcLog, 1)
* lnNoPudoBorrar = lnNoPudoBorrar + 1
*ENDTRY
ENDSCAN
IF lnNoPudoBorrar > 0
TRY
PACK
CATCH TO loException WHEN .T.
*MESSAGEBOX(loException.Message)
STRTOFILE("No se pudo empaquetar la tabla" + CRLF, lcLog, 1)
llNoPudoPackear = .T.
ENDTRY
ENDIF
IF lnCopiados > 0
STRTOFILE("Se han podido copiar " + TRANSFORM(lnCopiados) + " registros." + CRLF, lcLog, 1)
ENDIF
USE IN (SELECT(JUSTSTEM(tcTabla)))
*MESSAGEBOX("Se han encontrado " + TRANSFORM(lnBadRecs) + " registros corrompidos.")
STRTOFILE("RESÚMEN: Se han encontrado " + TRANSFORM(lnBadRecs) + " registros dañados." + CRLF, lcLog, 1)
IF lnNoPudoBorrar > 0
STRTOFILE("ATENCIÓN!!: No se han podido marcar para eliminar " + TRANSFORM(lnNoPudoBorrar) + " registros dañados." + CRLF, lcLog, 1)
ENDIF
*IF llNoPudoPackear
* STRTOFILE("RECUPERACIÓN FALLIDA!: No se ha podido empaquetar la tabla - Sigue con errores." + CRLF, lcLog, 1)
*ELSE
* STRTOFILE("RECUPERACIÓN OK: Se ha podido empaquetar la tabla." + CRLF, lcLog, 1)
*ENDIF
STRTOFILE("Fin de reparación de la tabla " + JUSTFNAME(tcTabla) + REPLICATE("-", 20) + CRLF + CRLF, lcLog, 1)
MODIFY FILE (lcLog) NOEDIT NOWAIT
RETURN