FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour problema con ads (reindex con tabla en exclusivo)
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
problema con ads (reindex con tabla en exclusivo)
Posted: Thu Jun 28, 2012 04:47 PM
Estimado, este codigo me esta fallando.

Code (fw): Select all Collapse
/*-------------------------------------------------------------------------------------------------*/

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
Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 1074
Joined: Fri Oct 07, 2005 01:56 PM
Re: problema con ads (reindex con tabla en exclusivo)
Posted: Thu Jun 28, 2012 05:37 PM
Hola Carlos

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

Code (fw): Select all Collapse
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()
Saludos
Patricio

__________________________________________________________________
Version: Harbour 3.2.0dev (r1307082134),Compiler: Borland C++ 5.8.2 (32-bit)
PCode version: 0.3, FWH 13.2
http://www.sialm.cl
Posts: 1303
Joined: Tue Jul 21, 2009 08:12 AM
Re: problema con ads (reindex con tabla en exclusivo)
Posted: Thu Jun 28, 2012 06:06 PM

Hola Carlos:

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

Muchas gracias. Many thanks.



Un saludo, Best regards,



Harbour 3.2.0dev, Borland C++ 5.82 y FWH 13.06 [producción]



Implementando MSVC 2010, FWH64 y ADO.



Abandonando uso xHarbour y SQLRDD.
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: problema con ads (reindex con tabla en exclusivo)
Posted: Thu Jun 28, 2012 07:56 PM

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

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 1303
Joined: Tue Jul 21, 2009 08:12 AM
Re: problema con ads (reindex con tabla en exclusivo)
Posted: Thu Jun 28, 2012 08:33 PM

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

Muchas gracias. Many thanks.



Un saludo, Best regards,



Harbour 3.2.0dev, Borland C++ 5.82 y FWH 13.06 [producción]



Implementando MSVC 2010, FWH64 y ADO.



Abandonando uso xHarbour y SQLRDD.
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: problema con ads (reindex con tabla en exclusivo)
Posted: Thu Jun 28, 2012 09:09 PM
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 (fw): Select all Collapse
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
Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: problema con ads (reindex con tabla en exclusivo)
Posted: Thu Jun 28, 2012 09:14 PM

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

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 1303
Joined: Tue Jul 21, 2009 08:12 AM
Re: problema con ads (reindex con tabla en exclusivo)
Posted: Thu Jun 28, 2012 09:26 PM

Carlos,

Yo uso el Harbour suministrado por Fivetech.

En principio no he detectado problemas.

¿Por qué no pruebas con Harbour?.

Muchas gracias. Many thanks.



Un saludo, Best regards,



Harbour 3.2.0dev, Borland C++ 5.82 y FWH 13.06 [producción]



Implementando MSVC 2010, FWH64 y ADO.



Abandonando uso xHarbour y SQLRDD.
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: problema con ads (reindex con tabla en exclusivo)
Posted: Thu Jun 28, 2012 09:33 PM
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
---------------------------
Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 1074
Joined: Fri Oct 07, 2005 01:56 PM
Re: problema con ads (reindex con tabla en exclusivo)
Posted: Thu Jun 28, 2012 09:37 PM

Hola

A veces puede ser problema del mismo diccionario de datos

prueba sacar la tabla del diccionario y luego ingresarla..

Saludos
Patricio

__________________________________________________________________
Version: Harbour 3.2.0dev (r1307082134),Compiler: Borland C++ 5.8.2 (32-bit)
PCode version: 0.3, FWH 13.2
http://www.sialm.cl
Posts: 211
Joined: Wed Jul 16, 2008 12:59 PM
Re: problema con ads (reindex con tabla en exclusivo)
Posted: Fri Jun 29, 2012 01:53 AM

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

Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: problema con ads (reindex con tabla en exclusivo)
Posted: Fri Jun 29, 2012 03:42 AM
si cierro la consulta
Code (fw): Select all Collapse
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
Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 694
Joined: Fri Oct 07, 2005 06:58 AM
Re: problema con ads (reindex con tabla en exclusivo)
Posted: Fri Jun 29, 2012 06:51 AM
¿Usas ADS Server?

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

Fernando González Diez

ALSIS Sistemas Informáticos
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: problema con ads (reindex con tabla en exclusivo)
Posted: Sun Jul 01, 2012 01:21 AM

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. :-(

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)

Continue the discussion