Page 1 of 1

prevenir corrupción

PostPosted: Tue Oct 14, 2008 12:40 pm
by rolando
Buen día,

Tengo intención de que, al iniciar una aplicación, "revise" las .DBF, los .CDX y los .FPT y, si hay algún error en las .CDX, inicie un proceso de reindexado. Aunque no me ha pasado con las CDX, tengo entendido que los índices son lo que presentan problemas.

¿Que puedo usar para comprobar el estado de estos archivos?. Gracias.

Rolando :D

FWH 2.7 + xHarbour

PostPosted: Tue Oct 14, 2008 3:02 pm
by karinha
Code: Select all  Expand view
#Include "Fivewin.Ch"

REQUEST OrdKeyNo, OrdKeyCount, OrdKeyGoto

FUNCTION VENTAS()

    LOCAL DbClientes

    IF NetUse( "CLIENTES", .T. )
        OrdListAdd( "Clientes", "CODIGO" )
        DATABASE DbClientes
        DbClientes:Load()
        DbClientes:SetBuffer( .T. )
     ELSE
        MsgStop( "Banco de Dados Bloqueado", "Cuidado!" )
        RETURN NIL
    ENDIF

    IF ORDKEYCOUNT() != RECCOUNT()

       VERIFY_CDX( "Clientes" ) //-> Banco de datos: CLIENTES.DBF

    Endif

    ...
    ...

RETURN NIL
//
STATIC FUNCTION VERIFY_CDX( XARCHIVO )

    MsgStop( ( "Tu mensageria aqui... " ), "avisa personas" )

    DbCLoseAll()
    REINDEXAR() //-> Funcion de indexacion...
    DbCLoseAll()

    QUIT

RETURN NIL


Saludos

PostPosted: Tue Oct 14, 2008 9:51 pm
by rolando
Gracias João,

No conzco algunas funciones pero imagino lo que hacen y lo voy a poner en práctica.

Saludos.

Rolando :D

PostPosted: Wed Oct 15, 2008 1:53 pm
by Carlos Mora
Hola Rolando,

La función OrdKeyCount() solo verifica que haya tantas claves como registros haya en la tabla. Esa condición no se cumple en los casos en que tienes alguna condición FOR para el índice, por ejemplo FOR !Deleted().

Tampoco te avisará si, por ejemplo, alguien cambia alguno de los campos claves sin abrir el índice.

Hasta donde sé, no existe una forma práctica de verificar la integridad, ya que para estar seguro habría que regenerar todas las claves y ver de que estén correctamente indexadas, lo que sería más pesado que reindexar de nuevo.

Te recomiendo que sigas los consejos del manual de Clipper para Redes: SIEMPRE, pero SIEMPRE, un COMMIT antes de UNLOCK.

Asegurarte de que los usuarios salen correctamente del programa, y deja alguna señal para detectar una salida anómala.
En caso de detectar que un programa abortó, sugiere al usuario reindexar como medida preventiva.

Con eso te puedo decir que no tengo problemas importantes.

Un saludo,

Carlos.

PostPosted: Wed Oct 15, 2008 2:54 pm
by karinha
Carlos, puedes probar la clave tanbien:
Code: Select all  Expand view
    SET ORDER TO 4

    IF INDEXKEY() # "COD+DTOC(EMISION)" .AND. LEFT(xARCHIVO,8) = "CLIENTES"
        REINDEXAR()
    ENDIF


Una idea

Saludos

PostPosted: Wed Oct 15, 2008 4:43 pm
by Carlos Mora
Joao,

como comentaba antes, lo que se verifica es muy superficial, y estamos atacando el problema cuando ya ha sucedido. Por eso le recomendaba al compañero que toma algunos recaudos que son de carácter preventivo, que son más efectivos que tratar de intuir cuando estan bien o nó los datos, lo que es prácticamente imposible hacerlo con un alto grado de seguridad.

Un saludo,

Carlos.

PostPosted: Wed Oct 15, 2008 5:23 pm
by karinha
Carlos Mora wrote:Joao,

como comentaba antes, lo que se verifica es muy superficial, y estamos atacando el problema cuando ya ha sucedido. Por eso le recomendaba al compañero que toma algunos recaudos que son de carácter preventivo, que son más efectivos que tratar de intuir cuando estan bien o nó los datos, lo que es prácticamente imposible hacerlo con un alto grado de seguridad.

Un saludo,

Carlos.


Carlos, como haces entonces??

Cual és tu sugerencia via codigo??

Tiene algo escrito, por favor? Ideas nuevas, és siempre bienvenidas.

Gracias,

Regards, saludos.

PostPosted: Wed Oct 15, 2008 6:16 pm
by Carlos Mora
Joao,

Lee mi primer post. Mis sugerencias estan ahí, yo no verifico la integridad de los índices, no hay formas prácticas de asegurar que un índice esta desactualizado, y las verificaciones que tu haces cubren muy pocas de las muchas posibilidades de corrupción o desincronización. NO PONGO CODIGO porque como te reitero ESE CODIGO NO EXISTE.

imagina un indice de una base de 1000 registros (pequeña). ¿Como puedes asegurar que todas las claves del índice se corresponden con su registro? Solo yendo registro por registro, generando la clave y comparándola. Eso es más costoso que reconstruir el indice, por lo tanto NO TIENE SENTIDO.

Mejor que eso es prevenir, eliminando los orígenes de las posibles corrupciones, con las dos recomendaciones que ya hice. El código esta en el manual del Clipper 5.2, y creeme, funciona.

Carlos.

PostPosted: Wed Oct 15, 2008 6:54 pm
by karinha
Carlos Mora wrote:Joao,

Lee mi primer post. Mis sugerencias estan ahí, yo no verifico la integridad de los índices, no hay formas prácticas de asegurar que un índice esta desactualizado, y las verificaciones que tu haces cubren muy pocas de las muchas posibilidades de corrupción o desincronización. NO PONGO CODIGO porque como te reitero ESE CODIGO NO EXISTE.

imagina un indice de una base de 1000 registros (pequeña). ¿Como puedes asegurar que todas las claves del índice se corresponden con su registro? Solo yendo registro por registro, generando la clave y comparándola. Eso es más costoso que reconstruir el indice, por lo tanto NO TIENE SENTIDO.

Mejor que eso es prevenir, eliminando los orígenes de las posibles corrupciones, con las dos recomendaciones que ya hice. El código esta en el manual del Clipper 5.2, y creeme, funciona.

Carlos.


Gracias, Carlos.

Saludos.

PostPosted: Wed Oct 15, 2008 9:00 pm
by rolando
Gracias por los aportes.

Saludos

Rolando :D