Problema al cerrar una tabla que no se cierra

Tengo una aplicación que utiliza tablas libres de otra aplicación sólo de lectura y una tabla libre que es la que genera la mía. Se abren en el Prg que hace de Principal para estar disponibles en todas las opciones.
Estoy tratando de crear una rutina dentro del proyecto, para empaquetar y reindexar la tabla. Y lo que me pasa es lo siguiente:
SELECT ADICIONALES   && Esta es la tabla para reindexar
USE && la cierro para poder abrirla como EXCLUSIVE
USE peritajes_add.dbf in 0 ALIAS adicionales exclusive && la abro como exclusiva
Y en este momento me aparece el error: "El archivo está en uso"
Ya desesperada, añadí antes de reabrir la tabla:
Close tables all
Pero no se soluciona el problema. Sin embargo si lo mismo lo hago en la ventana de comandos, todo funciona perfectamente. ¿Sabes cuál es el problema?

1 Respuesta

Respuesta
1
El problema se debe a que no cierras la tabla peritajes_add pero como no conozco el programa te sugiero que trates con esto
Use in Adicionales
If !Used("peritajes_add") Then
  Use peritajes_add In 0 Alias Adicionales
  Else
     Use peritajes_add Again In 0 Alias Adicionales
Endif
Cualquier cosa me avisas.
Hola:
Ante todo muchas gracias por tu rápida respuesta.
He utilizado el código que me has dado, y alucino:
En la 3ª línea, en el primer USE, me da el error "el archivo ya está en uso", cuando ha entrado ahí porque no está abierta la tabla.
No se por donde tirar...
¿Qué te parece?
Un saludo,
Teresa
¿Podrías enviar a mi correo una copia del programa en el que tienes el inconveniente?
No encuentro cómo enviarte un correo, pero te pongo aquí el código que es cortito. Las líneas con asterisco son las que tenía antes de insertar las que tú me proporcionaste:
*SELECT adicionales
*USE IN (SELECT("adicionales"))
*CLOSE TABLES 
*CLOSE DATABASES 
*** aquí está el código que tú me pasaste
Use in Adicionales
If !Used("peritajes_add") Then
  Use peritajes_add In 0 Alias Adicionales excl
  Else
     Use peritajes_add Again In 0 Alias Adicionales excl
Endif
*USE (DISCORED)+(RUTARED)+'\peritajes_add.dbf' in o ALIAS adicionales exclusive
SELECT adicionales
PACK
SET ORDER TO 1
REINDEX
SET ORDER TO 2
REINDEX
USE
MESSAGEBOX("Proceso de Reindexación terminado. La aplicación se cerrará","Reindexación de los Datos", 0)
clear events
Y el código que abre las tablas en la aplicación, está en el procedimiento de un objeto de la clase del entorno:
USE (DISCORED)+(RUTARED)+'\peritajes_add.dbf' AGAIN IN 0 order numero ALIAS adicionales SHARED
= CURSORSETPROP('Buffering', 5, 'adicionales')  && Enable table buffering
USE (DISCORED)+(RUTAPERITA)+'\compania.dbf' AGAIN IN 0 ALIAS COMPANIA SHARED
USE (DISCORED)+(RUTAPERITA)+'\final.dbf' AGAIN IN 0 SHARED
OPEN DATABASE (DISCOLOCAL)+(RUTALOCAL)+'\vistas' SHARED NOUPDATE
Muchas gracias por todo
Exactamente qué es lo que hace el código ¿quitar registros eliminados y reindexar las tablas de una base de datos?
El programa lee tablas de otra aplicación, y crea una tabla libre en mi programa. Este código lo que pretendo que haga es eso, empaquetar la tabla y reindexarla. Para lo cual tengo que cerrala para poder abrirla EXCLUSIVE, que es como tiene que estar para dichos procesos.
El problema, repito, es que por más que hago para cerrarla, cuando hago el USE para abrirla EXCLUSIVE, siempre me da el error "el archivo ya está en uso".
Perdona la lata que te estoy dando.
Un saludo
Entonces asegúrate que la otra aplicación no esté utilizando la tabla peritajes_add que es la directamente afectada en el código que ejecutas, esa es otra posible causa del error que te presenta el sistema.
Es que el programa lo estoy haciendo y probando en monopuesto, y la tabla peritajes_add sólo la usa mi programa. No tengo ningún otro programa ni abierto, ni que la use.
En fin, creo que de momento no le voy a incluir la rutina a mi cliente, hasta que averigüe porque no funciona. Si tienen algún problema con la tabla peritajes_add, o tienen muchos registros borrados y necesito empaquetarla, de momento lo haré desde la línea de comandos.
Si no se te ocurre nada más, avísame y te puntúo y finalizo la pregunta.
Perdona por las molestias y gracias.
Teresa
El error se da porque en definitiva la tabla está siendo utilizada por otra función, otro programa u otra aplicación ya sea desde tu computador o desde otro computador que esté conectado a la red para buscar la causa del problema abre la ventana de sesión de datos de Visual FoxPro para ver qué tablas y vistas están abiertas y te darás cuenta si la tabla peritajes_add.dbf actualmente, luego pega las siguientes líneas de código en tu programa antes de todas las demás:
Debug
Suspend
Y luego sigue todo el otro código.
Las dos líneas anteriores abrirán el depurador de Visual FoxPro para que ejecutes el programa línea por línea Al momento de ejecutar Close Databases All se cerrará la tabla peritajes_add.dbf eso es seguro que sucederá, sigues ejecutando el código y a medida que lo vayas haciendo examina la ventana de sesión de datos para ver si la tabla peritajes_add.dbf sigue se abrió, si es así para y busca el procedimiento que hace que se abra la tabla si no es así, continúa ejecutando el programa y si al momento de abrir la tabla (ejecutar use peritajes In 0 Exclusive) te devuelve el error de que la tabla ya está en uso y en la ventana de sesión de datos no aparece como abierta, entonces el problema se debe a que otro usuario o programa desde otro computador está utilizando la tabla o bien estás utilizando la tabla en otra instancia abierta de Visual FoxPro cualquiera de las dos causas se está presentando, pues cuando la tabla ya está abierta ya sea en modo exclusivo o compartido y la intentas abrir otra vez en modo exclusivo Visual FoxPro te devuelve el mensaje de error que ya has mencionado.
Esto es en todo lo que te puedo ayudar.
Hola:
No te preocupes, ya te he molestado bastante. Ya he descubierto que si el mismo código lo ejecuto desde un .prg en lugar de dentro de un formulario, va todo perfectamente, con lo que ya se que el problema está en el formulario. Algo es algo.
Muchas gracias por todas las molestias que te has tomado.
Un saludo,
Teresa

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas