Anónimo
Tabla abierta en otro pc - error
Saludos, Deseo abrir en mi PC una tabla en modo exclusive y en otra pc esa misma tabla ya esta abierta, quisiera que me notificara que la tabla esta ocupada o etc. Como detecto y notifico este error. Gracias por la colaboración que me puedan prestar.
1 respuesta
Respuesta de tigrefox
1
1
tigrefox, Colaborador, Solidario y Amigo, Ingeniero de Sistemas,...
Debes usar el FLOCK()
Use tabla
DO WHILE .tT.
IF FLOCK()
haces lo que necesites hacer
EXIT
ELSE
* Mensaje tabla ocupada
ENDIF
Enddo
Vale la pena anotar que el flock se usa si el set exclusive esta en off, y ademas si se va a bloquear un archivo es porque se va a hacer un append blank sino no es necesario
AVISAME si te sirvió
Use tabla
DO WHILE .tT.
IF FLOCK()
haces lo que necesites hacer
EXIT
ELSE
* Mensaje tabla ocupada
ENDIF
Enddo
Vale la pena anotar que el flock se usa si el set exclusive esta en off, y ademas si se va a bloquear un archivo es porque se va a hacer un append blank sino no es necesario
AVISAME si te sirvió
Muy bien gracias. ¿Y para eliminar tablas auxiliares que solo utilizo para ordenar con SORT y no me de error al eliminarlas en caso de estar en uso en ese momento? Gracias por su respuesta
Deendiendo como hayas creado las tablas auxiliares, pues muy seguramente las usas mientras ordenas y las borras o quedan libres y no hay posibilidades de accesar la misma tabla dos veces. Pregunto por que usas Sort para ordenar, comentame pues si es para mantener la tabla ordenada eso no es lo m´s óptimo.
Disculpa la tardanza andaba de viaje! La tabla auxiliar la creo ordenándolo dependiendo la consulta que este haciendo, para que el informe me salga ordenado cuando utilizo REPORT FORM. Luego que la utilizo la quiero borrar.
La verdad cuando uso tablas auxiliares y como siempre empleo el mismo nombre, pienso que la idea es economizar espacio, entonces lo que hago es borrar la información de la tabla y con eso pienso es suficiente.
Éxitos
Éxitos
1.- Creo que no nos estamos entendiendo te explico mejor. Tengo una tabla A(principal) y B(principal), creo una tabla C(aux) con información de la A y B según la consulta que se requiera. La tabla C(aux) la ordeno, utilizando SORT el cual genera otra tabla DE, con la información ordenada. Después que genero el reporte con la tabla DE, esta la elimino.
2.- Con respecto a la primera respuesta que me diste usando el Flock(), me da error una vez que se ejecuta el USE tabla, si esta esta abierta en otro PC, sin dar chance de que con el ELSE diga esta ocupada.
2.- Con respecto a la primera respuesta que me diste usando el Flock(), me da error una vez que se ejecuta el USE tabla, si esta esta abierta en otro PC, sin dar chance de que con el ELSE diga esta ocupada.
Ok, el flock() se puede usar pero debes haber usada la clausula SET EXCLUSIVE OFF,
Lo otro de eliminar la tabla el proceso esta bien, creas tu auxiluiar y luego ordenas en tora y haces el informe cobre la última, lo que yo opino es que la puedes dejar así, no borrarla igual cuando la vuevas a usar la vuelves a crear.
Debes enfocarte en mirar como crear tu tabla auxiliar si la crear mediante sql puedes de una crearla ordenada y vas a ganar tiempo y no necesitar la cuarta tabla o simplemente si la screar con sql puedes crear un cursor y no usas espacio en disco.
Si la crear con append blank replace, puedes crear la tabla y de una ves el indice y cada ves que le introduces datos va quedando ordenada y así no tienes que crear la cuarta, pero así es otra forma de trabajarlo lo que etas haciendo es correcto, solo que se le puede dar un poco más de velocidad al proceso.
Éxitos
Lo otro de eliminar la tabla el proceso esta bien, creas tu auxiluiar y luego ordenas en tora y haces el informe cobre la última, lo que yo opino es que la puedes dejar así, no borrarla igual cuando la vuevas a usar la vuelves a crear.
Debes enfocarte en mirar como crear tu tabla auxiliar si la crear mediante sql puedes de una crearla ordenada y vas a ganar tiempo y no necesitar la cuarta tabla o simplemente si la screar con sql puedes crear un cursor y no usas espacio en disco.
Si la crear con append blank replace, puedes crear la tabla y de una ves el indice y cada ves que le introduces datos va quedando ordenada y así no tienes que crear la cuarta, pero así es otra forma de trabajarlo lo que etas haciendo es correcto, solo que se le puede dar un poco más de velocidad al proceso.
Éxitos
Excelente comentario con respecto a la optimización de las tablas.
Sigo teniendo problema con el uso del flock(), me da error al momento de usar USE. y coloque antes set exclusive off.
Sigo teniendo problema con el uso del flock(), me da error al momento de usar USE. y coloque antes set exclusive off.
No te preocupes que el problema lo resolvemos, vas a hacer esto:
Enviame copia del código donde genera el error, todo el código no solo la linea.
Enviame copia del código donde genera el error, todo el código no solo la linea.
SALUDOS, esta fue una prueba que hice, abrí primero la tabla en la otro PC y luego corrí este código en otra PC, y me salio el cuadro de error de acceso denegado, y no entro en el código de la opción del ELSE.
set exclusive off
Use motor
DO WHILE .T.
if FLOCK()
***** total equipos del cliente ****
store 0 to R
go top
COUNT ALL FOR .not. empty(CODIGO_CA) .AND. .not. empty(CODIGO_CB) TO R
else
messagebox("INTENTE NUEVAMENTE O MAS TARDE *** ARCHIVO EN ACTUALIZACION ***")
? 'MOTOR'
Endif
enddo
set exclusive off
Use motor
DO WHILE .T.
if FLOCK()
***** total equipos del cliente ****
store 0 to R
go top
COUNT ALL FOR .not. empty(CODIGO_CA) .AND. .not. empty(CODIGO_CB) TO R
else
messagebox("INTENTE NUEVAMENTE O MAS TARDE *** ARCHIVO EN ACTUALIZACION ***")
? 'MOTOR'
Endif
enddo
set exclusive off
use motor
DO WHILE .T.
if FLOCK()
***** total equipos del cliente ****
store 0 to R
go top
COUNT ALL FOR .not. empty(CODIGO_CA) .AND. .not. empty(CODIGO_CB) TO R
unlock()
exit
else
messagebox("INTENTE NUEVAMENTE O MAS TARDE *** ARCHIVO EN ACTUALIZACION ***")
? 'MOTOR'
Endif
Enddo
Este sería el código para que funcionara, pero para hacer un count no requieres darle flock a la tabla, solo para append blank o delete y rlock para actualizaciones,
verifica que el directorio este compartido y con permisos pues debe dejarlo leer.
Avisame
use motor
DO WHILE .T.
if FLOCK()
***** total equipos del cliente ****
store 0 to R
go top
COUNT ALL FOR .not. empty(CODIGO_CA) .AND. .not. empty(CODIGO_CB) TO R
unlock()
exit
else
messagebox("INTENTE NUEVAMENTE O MAS TARDE *** ARCHIVO EN ACTUALIZACION ***")
? 'MOTOR'
Endif
Enddo
Este sería el código para que funcionara, pero para hacer un count no requieres darle flock a la tabla, solo para append blank o delete y rlock para actualizaciones,
verifica que el directorio este compartido y con permisos pues debe dejarlo leer.
Avisame
Saludos, como te dije anteriormente es una prueba, el flock() no lo uso para un COUNT. Estoy programando en visual Foxpro 6.0. El UNLOCK() funciona pero sin los paréntesis, si coloco los paréntesis no reconoce el comando, lo coloco sin paréntesis y no me da error.
bueno añadi al programa UNLOCK y EXIT. Y continua dando el mismo error, no me muestra lo declarado en ELSE si la tabla esta abierta en la otro PC.
Y desde mi PC si puedo abrí una tabla de otra PC por lo que si tengo acceso! Por eso no hay problema.
Agradezco tu colaboración.
bueno añadi al programa UNLOCK y EXIT. Y continua dando el mismo error, no me muestra lo declarado en ELSE si la tabla esta abierta en la otro PC.
Y desde mi PC si puedo abrí una tabla de otra PC por lo que si tengo acceso! Por eso no hay problema.
Agradezco tu colaboración.
1- Como abres el archivo en el otro pc
2- Este es el código para el count
set exclusive off
Use motor
COUNT ALL FOR !empty(CODIGO_CA) .AND. ! Empty(CODIGO_CB) TO R
2- Este es el código para el count
set exclusive off
Use motor
COUNT ALL FOR !empty(CODIGO_CA) .AND. ! Empty(CODIGO_CB) TO R
En la otra PC se abre: use motor
Verifica que allí en la otra pc y en cualquiera que se esté abriendo se abra en modo no exclusivo, es decir, SET EXLUSIVE OFF, pues si se abre en modo exclusivo, por más que le digamos en otro lado ábrame la no exclusiva, ya esta cerrada la posibilidad. Verifica y me comentas.
Tienes razón, pruébalo así
Use motor
COUNT ALL FOR !empty(CODIGO_CA) .AND. !empty(CODIGO_CB) TO R
sin el set exlusive off
Avisame, estoy conectado, ahora, en la otra pc es la misma aplicación u otra,¿?
Sui es la misma, envíamela y yo la reviso.
Use motor
COUNT ALL FOR !empty(CODIGO_CA) .AND. !empty(CODIGO_CB) TO R
sin el set exlusive off
Avisame, estoy conectado, ahora, en la otra pc es la misma aplicación u otra,¿?
Sui es la misma, envíamela y yo la reviso.
Si en la otra PC se abre en modo exclusive, entonces cuando lo intente abrir en la otra PC por lo menos me debería dar el mensaje del ELSE.
Disculpa no tienes correo de hotmail mejor
- Compartir respuesta
- Anónimo
ahora mismo