Como reparar un archivo FPT

2,730 views
Skip to first unread message

PETACA

unread,
May 14, 2013, 9:10:08 AM5/14/13
to publice...@googlegroups.com
Hola a todos. Tengo una tabla con un campo memo. En un registro se me produjo un error y cuando paso por el me salta un error y se me cuelga el sistema.
Lo que hice es borrar el registro pero no me permite hacer un pack sobre la tabla.
Saludos y gracias

Fidel Charny

unread,
May 14, 2013, 9:20:00 AM5/14/13
to publice...@googlegroups.com
PACK es posible únicamente en modo exclusivo. Ahora bien, por qué dices que no te permite?

Ricardo Pina

unread,
May 14, 2013, 9:24:03 AM5/14/13
to Grupo VFP
otra
 
use tablarota exclusive
Sale * for !dele() from tablarota into cursor res
zap
appe from dbf("res")
 
Saludos
--
            

                   Ricardo Pina

Desarrollo y Servicios Informáticos

                  Profesionales
               www.dsip.com.ar

 

 

Fidel Charny

unread,
May 14, 2013, 9:30:26 AM5/14/13
to publice...@googlegroups.com
Ese Sale * no lo conocía. 
En alguna oportunidad tuve que hacer un par de procesos, porque ya desde el append o con un browse no podía saltar del registro malo al bueno siguiente. En cambio, con go nrecord podía pasar y ver los de abajo. Por lo que tuve que hacer dos tablas (copy Next) y dos append después del Zap.

Ricardo Pina

unread,
May 14, 2013, 9:36:30 AM5/14/13
to Grupo VFP
corrijo en el select la no se usa for es where
 
Sale * where !dele() from tablarota into cursor res
 
Saludos

Fernando D. Bozzo

unread,
May 14, 2013, 9:47:32 AM5/14/13
to publice...@googlegroups.com
Hola Petaca, te dejo un código que hice en su momento para que lo adaptes a ver si te sirve.


*-- 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




Ricardo Pina

unread,
May 14, 2013, 10:22:29 AM5/14/13
to Grupo VFP
Muy bueno Fernando
 
Gracias por el aporte
 
Saludos


2013/5/14 Fernando D. Bozzo <fdb...@gmail.com>
Reply all
Reply to author
Forward
0 new messages