Page 1 of 1

problema con ads (reindex con tabla en exclusivo)

PostPosted: Thu Jun 28, 2012 4:47 pm
by carlos vargas
Estimado, este codigo me esta fallando.

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

Re: problema con ads (reindex con tabla en exclusivo)

PostPosted: Thu Jun 28, 2012 5:37 pm
by Patricio Avalos Aguirre
Hola Carlos

Puedes probar este a ver si te arroja error!, es el que yo utilizo..

Code: Select all  Expand view

dbCloseAll()
aIndex := AdsDirectory()
for i := 1 to len( aIndex )
    cDbf := Left( aIndex[i], len( aIndex[i] )-1 )   
        SELE 0 ; USE (cDbf)  VIA "ADS" EXCLUSIVE NEW
    if ADSGETNUMINDEXES() > 0
        if !AdsReindex()
            MsgInfo( AdsGetLastError(), "Usuario" )
        endif
    endif
    USE
next i
dbCloseAll()

Re: problema con ads (reindex con tabla en exclusivo)

PostPosted: Thu Jun 28, 2012 6:06 pm
by lucasdebeltran
Hola Carlos:

¿Y por que no usas además AdsReindex()?.

Re: problema con ads (reindex con tabla en exclusivo)

PostPosted: Thu Jun 28, 2012 7:56 pm
by carlos vargas
casualmente ese era el codigo que usaba anteriormente, usando la funcion adsreindex
incluso ya lo habia posteado hace un tiempo

ese codigo fallaba, lo he hecho mas simple a lo que mostre.

luego lo he modificado a lo que tengo y mostre pero ni asi. :-(

pero como dicen a la mejor mona se le cae el zapote, lo intentare y te comento en breve.

salu2

Re: problema con ads (reindex con tabla en exclusivo)

PostPosted: Thu Jun 28, 2012 8:33 pm
by lucasdebeltran
Carlos:

Prueba así a ver si hay suerte:

SET AUTOPEN OFF

FOR EACH cTabla IN aTablas

USE (cTabla) EXCLUSIVE NEW 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

Re: problema con ads (reindex con tabla en exclusivo)

PostPosted: Thu Jun 28, 2012 9:09 pm
by carlos vargas
el ads indica error

---------------------------
tablas:zonas
---------------------------
Error 5063: The command specified is illegal within a transaction. Cannot Reindex.
---------------------------
Aceptar
---------------------------

y el oError:description indica error en apertura de archivo.

salu2
carlos vargas

Code: Select all  Expand view

PROCEDURE Reorganizar()
   LOCAL cTabla
   LOCAL aTablas
   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
         RETURN
      ENDIF
   ENDIF

   WaitOn( "Cerrando tablas..." )
   DBCloseAll()
   WaitOff()

   WaitOn( "Reorganizando datos..." )
   CursorWait()

   SET( _SET_EXCLUSIVE, TRUE )
   Set autopen off

   FOR EACH cTabla IN aTablas

      TRY
         USE (cTabla) EXCLUSIVE NEW ALIAS TEMP VIA "ADS"
         IF ADSGETNUMINDEXES() > 0
            IF !AdsReindex()
               AdsGetLastError( @cError )
               MsgInfo( cError, "tablas:" + cTabla )
            ENDIF
         ENDIF
         TEMP->( DBCloseArea() )
      CATCH oError
         DBCloseAll()
         MsgAlert( oError:description )
      END

   NEXT

   SET( _SET_EXCLUSIVE, FALSE )

   CursorArrow()
   WaitOff()

   MsgRun( "Espere un momento, abriendo nuevamente tablas de datos.", "CREDICOM", {|| Conectar_AbrirTablas( TRUE, TRUE ) } )

RETURN
 

Re: problema con ads (reindex con tabla en exclusivo)

PostPosted: Thu Jun 28, 2012 9:14 pm
by carlos vargas
Lucas, si a ti te funciona bien tu codigo, podriamos intentar usar tu xharbour para ver si pasa
podrias comprimir tu xharbour y subirlo a algunsito, solo lo basico del compilador.

que yo nunca mantego una version previa.
estoy seguro que esto funcionaba muy bien hace unos dos meses, creo que era la version 1.21 rev 9244
o algo asi.

salu2
carlos vargas

Re: problema con ads (reindex con tabla en exclusivo)

PostPosted: Thu Jun 28, 2012 9:26 pm
by lucasdebeltran
Carlos,

Yo uso el Harbour suministrado por Fivetech.

En principio no he detectado problemas.

¿Por qué no pruebas con Harbour?.

Re: problema con ads (reindex con tabla en exclusivo)

PostPosted: Thu Jun 28, 2012 9:33 pm
by carlos vargas
eh bajado el xharbour de xharbour.org el oficial.

eh cambiado el codigo a:
PROCEDURE Reorganizar()
LOCAL cTabla, 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
RETURN
ENDIF
ENDIF

WaitOn( "Cerrando tablas..." )
DBCloseAll()
WaitOff()

WaitOn( "Reorganizando datos..." )
CursorWait()

SET( _SET_EXCLUSIVE, TRUE )

lContinuar := TRUE

FOR EACH cTabla IN aTablas

IF !lContinuar
EXIT
ENDIF

TRY
USE (cTabla) EXCLUSIVE NEW ALIAS TEMP VIA "ADS"
IF AdsGetNumIndexes() > 0
IF !AdsReindex()
AdsGetLastError( @cError )
ENDIF
ENDIF
TEMP->( DBCloseArea() )
CATCH oError
lContinuar := FALSE
MsgAlert( oError:description + FINL + cError, "Error en tabla:" + cTabla )
DBCloseAll()
END

NEXT

SET( _SET_EXCLUSIVE, FALSE )

CursorArrow()
WaitOff()

MsgRun( "Espere un momento, abriendo nuevamente tablas de datos.", "CREDICOM", {|| Conectar_AbrirTablas( TRUE, TRUE ) } )

RETURN


me da el error

---------------------------
Error en tabla:usuarios
---------------------------
Error de apertura

Error 5063: The command specified is illegal within a transaction. Cannot Reindex.
---------------------------
Aceptar
---------------------------

Re: problema con ads (reindex con tabla en exclusivo)

PostPosted: Thu Jun 28, 2012 9:37 pm
by Patricio Avalos Aguirre
Hola

A veces puede ser problema del mismo diccionario de datos

prueba sacar la tabla del diccionario y luego ingresarla..

Re: problema con ads (reindex con tabla en exclusivo)

PostPosted: Fri Jun 29, 2012 1:53 am
by RSalazarU
Carlos:

Creo que deberias cerrar la primera consulta (donde obtienes los nombres de las tablas), y luego recien reindexar.

Tb, verifica que no exista alguna consulta abierta ( a veces uno hace consultas y no las cierra) y se produce este tipo de errores. A mi me sucede con frecuencia.

Atentamente

Rolando

Cochabamba, Bolivia

Re: problema con ads (reindex con tabla en exclusivo)

PostPosted: Fri Jun 29, 2012 3:42 am
by carlos vargas
si cierro la consulta
Code: Select all  Expand view
TABLAS->( DBEval( {|| AAdd( aTablas, RTrim( FIELD->NAME ) ) } ), DBCloseArea() )


es mas, mas adelante tengo un dbcloseall()

tambien he probado con harbour.

lo que probare es sacar la tabla y luego ingresarla de nuevo, no vayan por ahi los tiros, que el dd este corrupto.

lo hare y les comento.

saludos

Re: problema con ads (reindex con tabla en exclusivo)

PostPosted: Fri Jun 29, 2012 6:51 am
by fgondi
¿Usas ADS Server?

Si es así también puedes utilizar la siguiente sentencia SQL:
Code: Select all  Expand view
EXECUTE PROCEDURE sp_Reindex( 'Nombre_de_la_tabla', 0 );

Re: problema con ads (reindex con tabla en exclusivo)

PostPosted: Sun Jul 01, 2012 1:21 am
by carlos vargas
pues he probado el codigo en modo cliente servidor (remoto e internet) y ahi si funciona sin ningun problema.
el problema lo da en forma local. :-(