Integridad de índices

Integridad de índices

Postby surGom » Fri Feb 08, 2008 11:58 am

Hola, quisiera saber como puedo saber si un índice no está corrupto cuando abro una base de datos. estoy utilizando fh26 y xharbour 0.99.61

Gracias
surGom
 
Posts: 640
Joined: Wed Oct 19, 2005 12:03 pm

Postby Carlos Mora » Fri Feb 08, 2008 12:26 pm

Si no lo sabe el RDD cuando lo abre, es un poco dificil. Lo que haría sería ir al último registro y buscarlo, si no lo encuentro es que se actualizó la dbf sin el índice abierto, pero no me garantiza que una actualización de alguna clave de 'las del medio' no se haya hecho.
Lo que pides me parece que no es algo sencillo.

Saludos
Carlos Mora
 
Posts: 989
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Postby surGom » Fri Feb 08, 2008 12:44 pm

Lo que deseo es que cuando abro la base de datos, existiendo los índices,si está la base desindexada hacer un aviso para reindexar, y no se como hacerlo

Gracias
surGom
 
Posts: 640
Joined: Wed Oct 19, 2005 12:03 pm

Postby karinha » Fri Feb 08, 2008 2:29 pm

Code: Select all  Expand view  RUN
   IF !FILE( "MIINDICE.CDX" )
         ? [ es necesario... ]
         REINDEXA()
         RETURN NIL
   ENDIF


Ó

crie una function para verificar se un determinado dato esta en el DBF y NO en el CDX.

Best regards.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7859
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Postby surGom » Fri Feb 08, 2008 2:48 pm

Gracias Karihna pero no es que si el índice no está creado lo haga sino que si el mismo está corrupto me avise para reindexar

Luis
surGom
 
Posts: 640
Joined: Wed Oct 19, 2005 12:03 pm

Postby karinha » Fri Feb 08, 2008 3:00 pm

surGom wrote:Gracias Karihna pero no es que si el índice no está creado lo haga sino que si el mismo está corrupto me avise para reindexar

Luis


Caro amigo, esto nos es posible.

El mejor que puede hacer, és muestrar el contenido del indice en un LISTBOX, y se los datos nos estejan de acuerdo con el que deberia ser, reindexa.

Mas se el el CDX retorna corrupto, és porque el DBF tanbién esta, asi, no tiene salida, tu DBF tiene que ser recriado.

La mejor solucion, és que tu cliente siempre tenga un NO BREAK en uso, para que esto no succeda.

desculpe, mi portunhol. jeje.

Best regards
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7859
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Integridad de índices

Postby mmercado » Fri Feb 08, 2008 4:04 pm

surGom wrote:Hola, quisiera saber como puedo saber si un índice no está corrupto cuando abro una base de datos. estoy utilizando fh26 y xharbour 0.99.61


Code: Select all  Expand view  RUN
Begin Sequence
   Set Index To.......
Recover
   MsgWait( "Reindexando", "Indice corrupto o Inexistente" )
   Index On ......
End Sequence

Saludos

Manuel Mercado
User avatar
mmercado
 
Posts: 782
Joined: Wed Dec 19, 2007 7:50 am
Location: Salamanca, Gto., México

Postby surGom » Mon Feb 11, 2008 1:34 pm

Gracias Karinha pero me ha pasado que se corrompe el índice si hay un corte de corriente y al reanudar me tira error al buscar algún dato, por eso es que quiero saber al abrir la base de datos si el índice esta desordenado que me avise.

Manuel probé con tu solución pero no me resultó ó no la entiendo bien, hice lo siguiente

use Detemb
DATABASE oDetemb
begin Sequence
oDetemb:setorder(3)
recover
? "Base desordenada" // la idea es llamar a una funcion que indexe
End Sequence


Un abrazo
surGom
 
Posts: 640
Joined: Wed Oct 19, 2005 12:03 pm

Postby mmercado » Mon Feb 11, 2008 2:44 pm

surGom wrote:Manuel probé con tu solución pero no me resultó ó no la entiendo bien, hice lo siguiente

use Detemb
DATABASE oDetemb
begin Sequence
oDetemb:setorder(3)
recover
? "Base desordenada" // la idea es llamar a una funcion que indexe
End Sequence
Recover recibe el control cuando se genera un error y con el código que muestras no se produce ninguno ya que no estás abriendo ningún índice.
oDetemb:setorder(3) no genera ningún error, simplemente no hace nada.

Saludos.
Manuel Mercado
User avatar
mmercado
 
Posts: 782
Joined: Wed Dec 19, 2007 7:50 am
Location: Salamanca, Gto., México

Postby karinha » Mon Feb 11, 2008 3:13 pm

surGom wrote:Gracias Karinha pero me ha pasado que se corrompe el índice si hay un corte de corriente y al reanudar me tira error al buscar algún dato, por eso es que quiero saber al abrir la base de datos si el índice esta desordenado que me avise.

Manuel probé con tu solución pero no me resultó ó no la entiendo bien, hice lo siguiente

use Detemb
DATABASE oDetemb
begin Sequence
oDetemb:setorder(3)
recover
? "Base desordenada" // la idea es llamar a una funcion que indexe
End Sequence


Un abrazo


No voy contestar el maestro Manoel Mercado, mas creo que en este caso, no hay indice corrupto.

El que debes hacer, és crear un FLAG en un BANCO DE DATOS, y al adentrar en el programa principal, PONER .F. en el dicho FLAG.

Al salir, ponga .T., todas las veces que adentre al programa, checar se és .T. el FLAG, si no, envia una MENSAGERIA al usuario, para REINDEXAR los BANCOS DE DATOS.

compreendes?

best regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7859
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Postby Francisco Horta » Tue Feb 12, 2008 6:04 am

Precisamente como te lo explica karinha , asi lo hago yo y me va bien, esto por si el sistema no tuvo una salida normal..
salu2
Paco
Francisco Horta
 
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Postby surGom » Tue Feb 12, 2008 12:10 pm

Pensé que había alguna forma simple para hacerlo. Utilizo el dbwide (excelente manejador de bases dbf creado por Daniel Andrade), en el cual cuando selecciono abrir el índice (cdx en mi caso), y está desindexado me aparece un aviso informandome de ello. Hice la prueba dentro del mismo de borrar registros estando el índice cerrado y cuando lo abría saltaba el mensaje error de índice. Por eso mi consulta, si está hecho pensaba que la solución era algún algoritmo que yo no podía resolver, e indudablemente es así.

Gracias por responderme.
surGom
 
Posts: 640
Joined: Wed Oct 19, 2005 12:03 pm

Postby karinha » Tue Feb 12, 2008 1:12 pm

//-> Mira este ejemplo... espero ayude:
Code: Select all  Expand view  RUN

REQUEST OrdKeyNo, OrdKeyCount, OrdKeyGoto

FUNCTION MAIN()

    SELECT( NOMBREBANCO )
    SET ORDER TO MIINDICE
    GO TOP

    If OrdkeyCount() # RecCount()

        MIRACDX("NOMBREBANCO")

    Endif

RETURN NIL
//
Static Function MIRACDX( XARCHIVO )

    SndPlaySound( "Erro.Wav" )

    MsgInfo(oemtoansi("ATEN€ÇO !!! O Sistema Detectou Que Um dos Öndices do Arquivo: "+XARCHIVO+".DBF"  )+CRLF+;
            oemtoansi("            Est  Corrompido ou Desatualizado. Isto Ocorre as Vezes Por Queda"    )+CRLF+;
            oemtoansi("            de Energia ou Desligamento Incorreto do Computador. Ser  Preciso"    )+CRLF+;
            oemtoansi("            Corrigir o Problema Para Evitar Erros na Opera‡Æo do Sistema."       )+CRLF+;
            oemtoansi("            O Programa Ser  Agora Conduzido Para a Rotina de Indexa‡Æo de Dados.")+CRLF+;
            oemtoansi("            Apenas Confirme a Op‡Æo de Indexa‡Æo. Tecle Enter..."),;
            oemtoansi("Reorganiza‡Æo Obrigat¢ria dos Dados"))

    DbCLoseAll()

    Reindexa(0)  //-> Indexador

    __Quit()

Return Nil
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7859
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Postby surGom » Wed Feb 13, 2008 11:23 am

Gracias Karinha, me parece que esa es la soluciòn al problema, lo voy a probar y te comento

Luis
surGom
 
Posts: 640
Joined: Wed Oct 19, 2005 12:03 pm

Postby surGom » Sun Feb 17, 2008 12:36 pm

Gracias Karinha así funciona muy bien, gracias

Luis
surGom
 
Posts: 640
Joined: Wed Oct 19, 2005 12:03 pm

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: groiss and 75 guests