Corrupcion Indices CDX

Post Reply
derpipu
Posts: 93
Joined: Tue Mar 28, 2006 4:09 pm
Location: Tequila, Jalisco Mexico
Contact:

Corrupcion Indices CDX

Post by derpipu »

Hola a todos, este post es para ver si no le pasa a alguien mas lo que me pasa a mi, tengo un sistema que esta enorme, es un sistema que maneja modulos de Control de nominas, Bancos, Facturas, etc, y tengo los siguientes problemas:

1 - Los indices se corrompen, aunque integre una rutina que todos los dias al primer acceso al sistema regenera todos los indices del sistema.
2 - existen ocasiones en que los registros se duplican completamente, o sea lineas completas de la base de datos se repiten, y en el sistema no existe ningun proceso que haga algo parecido.
3 - existen ocasiones en que los registros de _ se eliminan, aunque tengo validaciones que impiden que un cliente que tenga movimientos pueda ser eliminado, de repente los registros desaparecen.
4 - continuamente existe corrupcion de indices y me arroja los mensajes de CDX Corruption Detected, pero lo peor es que a diario se actualizan los indices en las mañanas.

Actualmente uso el Build de xHarbour de Fivetech, el cual dice "xHarbour Compiler build 1.1.0 (Simplex) (Rev. 6195)"

Anexo el codigo del proceso de regeneracion de indices:

Code: Select all

function f_Indexar( pcBaseDatos, paDatos, plCatalogo, pcRuta )
  local x := 0
  local bSentencia := { | oMeter, oText, oDlg, lEnd | BuildIndex( oMeter, oText, oDlg, @lEnd, paDatos[x,1], paDatos[x,2] ) }
  local cAlias     := cFileNoExt(pcBaseDatos)

  default plCatalogo := .F., pcRuta := ".\"

  if ! plCatalogo
    FErase( pcruta + cFileNoExt(pcBaseDatos) + ".cdx" )

    if ! net_use( pcBaseDatos, .T., cAlias, pcRuta )
      dbCloseAll(); return(nil)
    endif

    if (cAlias)->(fLock())
      MsgRun("Compactando: " + upper(alltrim(pcRuta + pcBaseDatos)) + if( empty( cFileExt( pcBaseDatos ) ), ".DBF", "" ), oApp:cEmpresa, { || (cAlias)->(dbPack()) } )
      (cAlias)->(dbUnlock())
    endif
  endif

  for x := 1 to len(paDatos)
    MsgProgress( bSentencia, "INDEXANDO: " + upper(alltrim(pcRuta + pcBaseDatos)) + if( empty( cFileExt( pcBaseDatos ) ), ".DBF", "" ) + " EN: " + alltrim(paDatos[x,2]) + " CON LLAVE: " + alltrim(paDatos[x,1])  )
  next

  if ! plCatalogo
    (cAlias)->(dbCloseArea())
  else
    MsgAlert( "El mantenimiento a: " + NomCatalogos(upper(pcBaseDatos)) + CRLF + " En: " + lower(pcRuta + pcBaseDatos) + if( empty( cFileExt( pcBaseDatos ) ), ".dbf", "" ) + ", se finalizo satisfactoriamente...", oApp:cEmpresa )
  endif
return(nil)

function MsgProgress( bAction, cMsg, cTitle )
   local oDlg, oMeter, oText, oBtn, oFont
   local lEnd := .f., lCancel := .f.
   local nVal := 0

   DEFAULT bAction := { || nil },;
           cMsg := "Procesando...", cTitle := "Espere por favor..."

   DEFINE DIALOG oDlg FROM 5, 5 TO 14, 45 TITLE oApp:cEmpresa FONT oApp:fNormal
    @ 0.2, 0.5  SAY oText VAR cMsg SIZE 130, 30 OF oDlg
    oMeter = TProgress():New( 02.00, 01.00,,,,,,,150 )

    @  03.00,  10.4  BUTTON oBtn PROMPT "&Cancelar" OF oDlg ACTION ( lEnd:= .t., lCancel:= .t. ) SIZE 32, 11
    oBtn:cToolTip := "Presione para Cancelar"

    // This block gets evaluated only the first time the DialogBox is painted !!!
    oDlg:bStart = { || Eval( bAction, oMeter, oText, oDlg, @lEnd, oBtn ), lEnd := .t., oDlg:End() }
   ACTIVATE DIALOG oDlg CENTERED VALID lEnd
return lCancel

// es parte escencial de reord
function BuildIndex( poMeter, poText, poDlg, plEnd , pcCampo, pcBolsa)
  Local nContador := 0, nTotal := 0
  Local cBaseDatos := alias()

  nTotal := (cBaseDatos)->(LastRec())

  poMeter:SetRange(0, nTotal)
  (cBaseDatos)->(OrdSetFocus(0))
  INDEX ON &(pcCampo)  ;
        TAG &(pcBolsa) ;
        EVAL ( poMeter:SetPos( (cBaseDatos)->(recno()) ), SysRefresh(), ! plEnd )
  poMeter:SetPos( nTotal )
return ( nil )
el codigo para abrir mis bases de datos es el siguiente:

Code: Select all

function net_use( pcBaseDatos, plExclusivo, pcAlias, pcRuta, plOkDbf )
  Local lContinuar := .F.
  local oError

  local nInicio := seconds()

  default pcAlias := cFileNoExt(pcBaseDatos), plExclusivo := .F., pcRuta := "", plOkDbf := .F.//, pcBaseDatos := cFileNoExt(pcBaseDatos)

  if plOkDbf
    if ! lOkDbf( pcRuta + pcBaseDatos ); return(lContinuar); endif
  endif

  if plExclusivo
      use (pcRuta + pcBaseDatos) alias (pcAlias) exclusive new
  else
      use (pcRuta + pcBaseDatos) alias (pcAlias) shared new
  endif

  if ! netErr()
    lContinuar := .T.
    (pcAlias)->(ordSetFocus(1))
  else
    MsgStop("La base de datos: " + Upper(pcBaseDatos) + ".DBF, no puede ser procesada" + CRLF +;
            "llame a su asesor de Informatica..." , oApp:cEmpresa)
  endif

return(lContinuar)
Espero que alguien me pueda dar un norte acerca de que esta pasando con los indices CDX, como comentario adicional los usuarios me increpan diciendo que cuando habian archivitos NTX en el sistema, nunca les pasaba nada de eso, asi que ya comprenderan como me traen..

Bueno no los interrumpo mas, espero sus amables aportaciones...

Luis Fernando Rubio Rubio
Luis Fernando Rubio Rubio
User avatar
ADBLANCO
Posts: 299
Joined: Mon Oct 22, 2007 3:03 pm
Location: Valencia - Venezuela

Re: Corrupcion Indices CDX

Post by ADBLANCO »

1) Es recomendable borrar el .cdx antes de generarlo.
2) Es recomendable que los archivos indices se llamen igual a los .dbf
3) Si tienes varias claves de busqueda utiliza los 'tags' de forma que al abrir una tabla también lo hagas con su respectivo indice (y todas las claves)
4) Prueba referirte a _ como _field->campo

Pejm.
Si el indice es codedo+Codciu:
index on _field->codedo+_field->codciu tag codigo to Ciudades

Yo tengo Varios sistemas que manejan una cantidad de registros Gigantescos y no están perdiendo el indice tan facilmente
Espero que te sirva.
Saludos

Angel, Valencia, Venezuela

xH .997 - FW 7.9 - BCC55 - WorkShop - MySql
User avatar
ADBLANCO
Posts: 299
Joined: Mon Oct 22, 2007 3:03 pm
Location: Valencia - Venezuela

Re: Corrupcion Indices CDX

Post by ADBLANCO »

Además de definir la 'via'
use ciudades index ciudades via 'dbfcdx' new shared

es solo un ejemplo

también no debes olvidarte de las sentencias:

Request DBFCDX, DBFFPT
RddSetDefault( "DBFCDX" )
al inicio del prg principal
Saludos

Angel, Valencia, Venezuela

xH .997 - FW 7.9 - BCC55 - WorkShop - MySql
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Corrupcion Indices CDX

Post by FranciscoA »

Luis Fernando:
Me parece que deberías asegurarte primero, el uso exclusivo de la dbf, y luego borrar sus indices.
El siguiente es tu codigo, y si por algún motivo no puedes abrir la dbf, retornas, pero ya sin sus indices:

if ! plCatalogo
FErase( pcruta + cFileNoExt(pcBaseDatos) + ".cdx" )

if ! net_use( pcBaseDatos, .T., cAlias, pcRuta )
dbCloseAll(); return(nil)
endif
...
...

Dime si me equivoco.

Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Corrupcion Indices CDX

Post by Antonio Linares »

Luis Fenando,

Cuantos usuarios usan tu aplicacion simultaneamente ?
Si son muchos, es muy recomendable que uses ADS, pues al ser cliente-servidor solucionara la mayoria de errores que comentas.

En aplicaciones con pocos usuarios, estos errores no suelen aparecer. Un error de esos puede generarse por apagar un ordenador indebidamente, por un pico de tension en la corriente electrica, por un fallo de transmision en la red, etc. A mas usuarios, la probabilidad de que ocurran esas situaciones aumentan. Al usar ADS los datos solo los modifica el servidor, por lo que aumenta mucho la seguridad y la integridad de los datos.

Todos los usuarios usan la misma version de Windows ? Que version ? Que Windows usas como servidor ? Estan todos los service packs instalados ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
derpipu
Posts: 93
Joined: Tue Mar 28, 2006 4:09 pm
Location: Tequila, Jalisco Mexico
Contact:

Re: Corrupcion Indices CDX

Post by derpipu »

Hola a todos, les agradezco mucho sus comentarios, en el caso de cuando hago Net_use si me regresa un .f., entonces no dejo continuar el proceso, cierro las bases de datos que haya dejado abiertas y me regreso a la ventana principal, obviamente previo mensaje que indica que hubo algun detalle en X base de datos, ahora en referencia a las preguntas de Antonio, todos usan Windows XP SP2, no creo que todos tengan aun SP3, pero bueno, y fijate que cayendo en conclusion, hay plazas en que tengo a 15 usuarios concurrentes en diferentes procesos y ahora que lo comentas el detalle no pasa en todas mis oficinas, solo en dos o tres de ellas de 15 que utilizan el sistema, y seria interesante ver los detalles que las hacen diferentes a las demas...

dejenme hacer unas verificaciones y ya les estare diciendo, incluso una de las oficinas que son los que me decian que antes con los NTX no tenian ese tipo de problemas fueron cambiados a unas instalaciones nuevas y podria haber algun problema electrico o con la red, pero eso seria cosa de verificarlo..

De antemano agradezco sus atenciones a mi post..

Luis Fernando
Luis Fernando Rubio Rubio
Post Reply