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 )
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)
Bueno no los interrumpo mas, espero sus amables aportaciones...
Luis Fernando Rubio Rubio