- Code: Select all Expand view
/*-------------------------------------------------------------------------------------------------*/
PROCEDURE Reorganizar()
LOCAL cTabla
LOCAL aTablas
LOCAL lContinuar
LOCAL oError, cError, n:=0
IF !MsgNoYes( "Para realizar este proceso, ningun usuario debe estar conectado al programa, desea continuar?" )
RETURN
ENDIF
IF !ADSRunSQL( "TABLAS", "SELECT * FROM SYSTEM.TABLES" )
RETURN
ELSE
aTablas := {}
TABLAS->( DBEval( {|| AAdd( aTablas, RTrim( FIELD->NAME ) ) } ), DBCloseArea() )
IF Len( aTablas ) = 0
TABLA->( DBCloseArea() )
RETURN
ENDIF
ENDIF
WaitOn( "Cerrando tablas..." )
DBCloseAll()
WaitOff()
WaitOn( "Reorganizando datos..." )
CursorWait()
SELECT 1
SET( _SET_EXCLUSIVE, TRUE )
FOR EACH cTabla IN aTablas
USE (cTabla) ALIAS TEMP
?cTabla, Alias(), OrdCount()
IF !NetErr()
IF TEMP->( OrdCount() ) > 0
REINDEX
ENDIF
ELSE
MsgAlert( "Error en reindexado de " + cTabla + FINL + AdsGetLastError() )
ENDIF
TEMP->( DBCloseArea() )
NEXT
SET( _SET_EXCLUSIVE, FALSE )
CursorArrow()
WaitOff()
MsgRun( "Espere un momento, abriendo nuevamente tablas de datos.", "CREDICOM", {|| Conectar_AbrirTablas( TRUE, TRUE ) } )
RETURN
es un modulo de reindexado, el cual primero extrae con una sentencia sql una lista de las tablas contenidas en un diccionario ads,
luego esa lista de tablas es pasada a un arreglo unidimencional, el arreglo es recorrido en el bloque for..next en donde cada tabla es abierta, se verifica que no hay falla en la apertura, se consulta si tiene tag que puedan ser reindexado, y si tiene entonces se reindexa la tabla.
anteriormente esto funcionaba correctamente, pero he actualziado tanto xharbour y harbour con el last cvs y se me presenta la falla,
que la primer tabla es procesada correctamente, pero la segunda tabla, si bien es abierta, al llegar a la instruccion ordcount se dispara un fallo indicando que la tabla no esta indexada, es mas si a esa tabla le pido el alias() este me retorna un valor vacio. esto ultimo es rarisimo.
esto es asi, siempre y cuando la instrccion set exclusive on este activa, pero si set exclusive esta en off todo regresa a la normalidad pero realmente el proceso de indexado no se realiza ya que como sabemos para reindexa una tabla esta debio ser abierta exclusivamente.
podria alguen con conocimiento en ads ver por que este fallo en la aperura de la tabla en modo exlusivo, y por que alias no regresa valor, es como si la tabla no fuera abierta e un area de trabajo.
les agardesco su ayuda.
cabe aclarar que esto falla en xharbour y harbour por igual.
salu2
carlos vargas