Acceso a base de datos compartida
Disculpa, porque muchas veces cuando abrimos una base de datos con shared para que sea compartida sale, ¿acceso denegado a la base de datos dbc?
Después cambiando o quizás volviendo a poner lo mismo ese error desaparece y se ejecuta bien.. ¿cuál es la manera para abrir la base de datos en forma compartida una sola vez y que no salgan esos errores de acceso denegado a la base?
Después cambiando o quizás volviendo a poner lo mismo ese error desaparece y se ejecuta bien.. ¿cuál es la manera para abrir la base de datos en forma compartida una sola vez y que no salgan esos errores de acceso denegado a la base?
1 Respuesta
Respuesta de Alonso Jarrín Solís
1
1
Ese error sale cuando tienes abierta la base de datos previamente en modo exclusivo, antes de abrirla en modo compartido debes asegurarte de que la base de datos no esté abierta en modo exclusivo, esto suele suceder muy menudo cuando la pase de datos está incluida en un proyecto y cuando abres un proyecto, este mismo abre la base de datos en modo exclusivo verifica que nada de esto esté sucediendo.
Gracias, disculpa yo puse un programita como principal. Donde tengo el read events y la llamada al formulario principal. ¿Siempre debo probar la ejecución desde ese programita?
Ose si anda bien ahí, ¿todo va bien?
Ose si anda bien ahí, ¿todo va bien?
Claro desde ese programa se debe hacer prácticamente toda la configuración del sistema y obviamente debes comprobar que funcione perfectamente porque de no ser así se desencadenarán cualquier cantidad de errores en los demás programas.
Disculpa, así abro mi base de datos y mis tablas en el formulario principal.
SET DEFAULT TO "\\Progreso1\gestionsip\base"
OPEN DATABASE basesip SHARED
SET EXCLUSIVE OFF
USE recibos AGAIN IN 0
SET EXCLUSIVE OFF
USE clientes AGAIN IN 0
Nota: progreso1 es la pc servidor y basesip el nombre de la base de datos
Nota2: es la única vez en todos los formularios donde abro la base y las tablas
Cuando lo ejecuto anda bien, pero cuando quiero generar un ejecutable me sale el siguiente cuadro:
Denegado \\Progreso1\gestionsip\base\basesip.dbc al acceso al archivo
q estoy haciendo mal? muchas gracias
SET DEFAULT TO "\\Progreso1\gestionsip\base"
OPEN DATABASE basesip SHARED
SET EXCLUSIVE OFF
USE recibos AGAIN IN 0
SET EXCLUSIVE OFF
USE clientes AGAIN IN 0
Nota: progreso1 es la pc servidor y basesip el nombre de la base de datos
Nota2: es la única vez en todos los formularios donde abro la base y las tablas
Cuando lo ejecuto anda bien, pero cuando quiero generar un ejecutable me sale el siguiente cuadro:
Denegado \\Progreso1\gestionsip\base\basesip.dbc al acceso al archivo
q estoy haciendo mal? muchas gracias
Estás haciendo mal varias cosas primero estás estableciendo Set Exclusive en varias veces y la base de datos previamente abierta, cuando generas el ejecutable, no debes tener la base de datos incluida al proyecto ni abierta en otra instancia de Visual FoxPro en Modo Exclusivo y por último la base de datos debes compartirla en una unidad de red para evitar esos inconvenientes y no utilizar la ruta del servidor.
Para compartir la base de datos haz clic derecho sobre la carpeta donde está guardada la base de datos, luego selecciona compartir y seguridad... marca las casillas compartir esta carpeta en la red y permitir que los usuarios de la red cambien mis archivos y haz clic en aceptar.
Después de lo anterior en el explorador de Windows haz clic derecho en mis sitios de red y selecciona conectar a unidad de red, en la lista unidad selecciona una letra para compartir la unidad de red por ejemplo Z, luego haz clic en el botón examinar y busca la carpeta de la base de datos y seleccionala y luego haz clic en aceptar.
Listo ya queda para utilizar quedando la ruta como por ejemplo z:\base (este método es para sistemas operativos no servidores, pero para un computador que ve a utilizarse como servidor es obviamente es recomendable utilizar un sistema operativo servirdor).
En base a lo anterior el código que deberías utilizar es el siguiente:
Set Multilocks On
Set Deleted On
Set Exclusive Off
Use "z:\base\BasesIp" Shared
If !Used("Recibos")
Use Recibos In 0
Endif
If !Used("Clientes")
Use Clientes In 0
Endif
Y seleccionas la tabla que vayas a utilizar por ejemplo en el caso de que sea la tabla clientes:
Select Clientes
Eso debería solucionar el problema.
Para compartir la base de datos haz clic derecho sobre la carpeta donde está guardada la base de datos, luego selecciona compartir y seguridad... marca las casillas compartir esta carpeta en la red y permitir que los usuarios de la red cambien mis archivos y haz clic en aceptar.
Después de lo anterior en el explorador de Windows haz clic derecho en mis sitios de red y selecciona conectar a unidad de red, en la lista unidad selecciona una letra para compartir la unidad de red por ejemplo Z, luego haz clic en el botón examinar y busca la carpeta de la base de datos y seleccionala y luego haz clic en aceptar.
Listo ya queda para utilizar quedando la ruta como por ejemplo z:\base (este método es para sistemas operativos no servidores, pero para un computador que ve a utilizarse como servidor es obviamente es recomendable utilizar un sistema operativo servirdor).
En base a lo anterior el código que deberías utilizar es el siguiente:
Set Multilocks On
Set Deleted On
Set Exclusive Off
Use "z:\base\BasesIp" Shared
If !Used("Recibos")
Use Recibos In 0
Endif
If !Used("Clientes")
Use Clientes In 0
Endif
Y seleccionas la tabla que vayas a utilizar por ejemplo en el caso de que sea la tabla clientes:
Select Clientes
Eso debería solucionar el problema.
Estuvo muy bueno lo que m pasaste:
Set Multilocks On
Set Deleted On
Set Exclusive Off
Use "z:\base\BasesIp" Shared
If !Used("Recibos")
Use Recibos In 0
Endif
If !Used("Clientes")
Use Clientes In 0
Endif
Nota: basesip es el nombre de la base de datos osea basesip.dbc, ¿se puede abrir con el USE? Me salio que ya esta en uso, entonces probé de esta manera y anduvo:
Set Multilocks On
Set Deleted On
Set Exclusive Off
OPEN DATABASE "z:\basesip" Shared
SET DEFAULT TO "z:\"
If !Used("Recibos")
Use Recibos In 0
Endif
If !Used("Clientes")
Use Clientes In 0
Endif
Nota2: segui los pasos q me pasaste par acompartir, me genero el ejecutable pero cuando lo abro en dos partes me salia "denegado el arhivos Z:\.....dbc" q paso?
Una consulta más donde puedo colocar el READ EVENTS para que no m parpadee el programita y luego se cierre.
Si lo coloco en l init del formulario principal cuando lo ejecuto solo parpadea. Muchísimas gracias
Set Multilocks On
Set Deleted On
Set Exclusive Off
Use "z:\base\BasesIp" Shared
If !Used("Recibos")
Use Recibos In 0
Endif
If !Used("Clientes")
Use Clientes In 0
Endif
Nota: basesip es el nombre de la base de datos osea basesip.dbc, ¿se puede abrir con el USE? Me salio que ya esta en uso, entonces probé de esta manera y anduvo:
Set Multilocks On
Set Deleted On
Set Exclusive Off
OPEN DATABASE "z:\basesip" Shared
SET DEFAULT TO "z:\"
If !Used("Recibos")
Use Recibos In 0
Endif
If !Used("Clientes")
Use Clientes In 0
Endif
Nota2: segui los pasos q me pasaste par acompartir, me genero el ejecutable pero cuando lo abro en dos partes me salia "denegado el arhivos Z:\.....dbc" q paso?
Una consulta más donde puedo colocar el READ EVENTS para que no m parpadee el programita y luego se cierre.
Si lo coloco en l init del formulario principal cuando lo ejecuto solo parpadea. Muchísimas gracias
En cuanto a lo de use ese fue error mío, mil disculpas, es exactamente como tú lo escribiste:
Open Database "z:\basesip" Shared
En cuanto a lo segundo, eso sucede porque la base de datos está abierta previamente en modo exclusivo en otra instancia, debes cerrar la base de datos antes de utilizarla, trata con esto:
Close All
Set Multilocks On
Set Deleted On
Set Exclusive Off
Use "z:\base\BasesIp" Shared
If !Used("Recibos")
Use Recibos In 0
Endif
If !Used("Clientes")
Use Clientes In 0
Endif
Nota: basesip es el nombre de la base de datos osea basesip. Dbc, ¿se puede abrir con el USE? Me salio que ya esta en uso, entonces probé de esta manera y anduvo:
Set Multilocks On
Set Deleted On
Set Exclusive Off
OPEN DATABASE "z:\basesip" Shared
SET DEFAULT TO "z:\"
If !Used("Recibos")
Use Recibos In 0
Endif
If !Used("Clientes")
Use Clientes In 0
Endif
Open Database "z:\basesip" Shared
En cuanto a lo segundo, eso sucede porque la base de datos está abierta previamente en modo exclusivo en otra instancia, debes cerrar la base de datos antes de utilizarla, trata con esto:
Close All
Set Multilocks On
Set Deleted On
Set Exclusive Off
Use "z:\base\BasesIp" Shared
If !Used("Recibos")
Use Recibos In 0
Endif
If !Used("Clientes")
Use Clientes In 0
Endif
Nota: basesip es el nombre de la base de datos osea basesip. Dbc, ¿se puede abrir con el USE? Me salio que ya esta en uso, entonces probé de esta manera y anduvo:
Set Multilocks On
Set Deleted On
Set Exclusive Off
OPEN DATABASE "z:\basesip" Shared
SET DEFAULT TO "z:\"
If !Used("Recibos")
Use Recibos In 0
Endif
If !Used("Clientes")
Use Clientes In 0
Endif
Muchas gracias por tu interés, todo me esta sirviendo. Ahora m anda bien acá en mi pc. Lo ejecuto desde fox y desde el ejecutable y andan bien.
Hago el instalador con el installshield. Lo instalo en otra pc, lo instala y cuando lo ejecuto sale:
File 'z:\basesip.dbc' does not exist.'
q pasó?
Hago el instalador con el installshield. Lo instalo en otra pc, lo instala y cuando lo ejecuto sale:
File 'z:\basesip.dbc' does not exist.'
q pasó?
Bueno eso sucede cuando el sistema detecta que la ruta a la base de datos no es válida ya sea por una falla en la conexión o se ha cambiado la ruta de la base de datos en este caso en el programa principal de tu proyecto debes crear una rutina algo parecida a esta:
En equipos clientes la mejor forma de solucionar esto es guardar la ruta de la base de datos en una tabla o archivo *.ini, de esta manera obtenemos la ruta y la enviamos como parámetro a un procedimiento que abrirá la base de datos y si falla cierre muestre el cuadro de diálogo abrir para que el usuario busque la base de datos y en caso de no seleccionarla o no encontrarla cierre el sistema:
Local lcRuta
lcRuta = NombreTabla.Ruta && En el caso de una tabla se sugiere guardar la ruta en un campo de tipo memo.
If !AbrirBasededatos(lcRuta)
Return .F.
Endif
Procedure AbrirBasedeDatos
Parameters pRuta
If !File(pRuta)
If Messagebox("La ruta a la base de datos no es válida." + chr(13);
+ "¿Desea buscar la base de datos?", 32, "Abrir base de datos") = 6 Then && Sí
pRuta = GetFile("Dbc")
If Empty(pRuta)
=Messagebox("No seleccionó la base de datos.")
Return .F.
Endif
Endif
Endif
Open Database (pRuta) Shared
Return .T.
Endproc
Esto es efectivo cuando el sistema no encuentra la base de datos esa es una posible solución al problema.
En equipos clientes la mejor forma de solucionar esto es guardar la ruta de la base de datos en una tabla o archivo *.ini, de esta manera obtenemos la ruta y la enviamos como parámetro a un procedimiento que abrirá la base de datos y si falla cierre muestre el cuadro de diálogo abrir para que el usuario busque la base de datos y en caso de no seleccionarla o no encontrarla cierre el sistema:
Local lcRuta
lcRuta = NombreTabla.Ruta && En el caso de una tabla se sugiere guardar la ruta en un campo de tipo memo.
If !AbrirBasededatos(lcRuta)
Return .F.
Endif
Procedure AbrirBasedeDatos
Parameters pRuta
If !File(pRuta)
If Messagebox("La ruta a la base de datos no es válida." + chr(13);
+ "¿Desea buscar la base de datos?", 32, "Abrir base de datos") = 6 Then && Sí
pRuta = GetFile("Dbc")
If Empty(pRuta)
=Messagebox("No seleccionó la base de datos.")
Return .F.
Endif
Endif
Endif
Open Database (pRuta) Shared
Return .T.
Endproc
Esto es efectivo cuando el sistema no encuentra la base de datos esa es una posible solución al problema.
Disculpa, ¿dónde guardo esa tabla con el campo de la ruta? Mi base de datos esta en Z:\ como m habías recomendado. ¿Dónde genero o guardo esta nueva tabla?
Ya esta, lo hice, quedo bien. Pero que pasa. Cuando lo abro de acá todo bien, cuando lo abro de otra pc también...- pero cuando acá esta abierto e intento abrirlo también en la otra pc me sale:
Denegaco z:\recibos.dbf al acceso al archivo
..y asi cn las demas tablas..
no m sale el acceso denegado a la base pero si a las tablas.. q esta pasando?
Denegaco z:\recibos.dbf al acceso al archivo
..y asi cn las demas tablas..
no m sale el acceso denegado a la base pero si a las tablas.. q esta pasando?
No debes tener abiertas las tablas en modo exclusivo, ni tampoco abrirlas con el administrador de proyectos, y revisa las configuraciones del equipo servidor para el acceso de los equipos cliente para que puedan realizar cambios en la base de datos.
Así es como coloco mi programa principal:
close databases
SET PATH TO "\\Progreso1\formularios"
DO FORM recibos
READ EVENTS
_screen.visible=.F.
SET DEFAULT TO "\\Progreso1\gestionsip"
USE ruta AGAIN IN 0
SELECT ruta
Local lcRuta
lcRuta = ruta.Ruta
If !AbrirBasededatos(lcRuta)
Return .F.
Endif
Procedure AbrirBasedeDatos
Parameters pRuta
If !File(pRuta)
If Messagebox("La ruta a la base de datos no es válida." + chr(13);
+ "¿Desea buscar la base de datos?", 32, "Abrir base de datos") = 6 Then && Sí
pRuta = GetFile("Dbc")
If Empty(pRuta)
=Messagebox("No seleccionó la base de datos.")
Return .F.
Endif
Endif
Endif
Set Multilocks On
Set Deleted On
SET EXCLUSIVE OFF
OPEN DATABASE (pRuta) SHARED
Return .T.
Endproc
y en el form q llamo, recibos:
en el init abro las tablas:
SET DEFAULT TO "z:\"
If !Used("Recibos")
Use Recibos IN 0
Endif
If !Used("Clientes")
Use Clientes In 0
Endif
.. eso es lo que hago, hice lo de la unidad Z en las pc andan bien, la aplicación cuando se ejecuta en cada pc andan bien pero las dos juntas sale:
Denegado z:\recibos.dbf al acceso al archivo
Estoy intentando pero todavía no puedo lograrlo...
close databases
SET PATH TO "\\Progreso1\formularios"
DO FORM recibos
READ EVENTS
_screen.visible=.F.
SET DEFAULT TO "\\Progreso1\gestionsip"
USE ruta AGAIN IN 0
SELECT ruta
Local lcRuta
lcRuta = ruta.Ruta
If !AbrirBasededatos(lcRuta)
Return .F.
Endif
Procedure AbrirBasedeDatos
Parameters pRuta
If !File(pRuta)
If Messagebox("La ruta a la base de datos no es válida." + chr(13);
+ "¿Desea buscar la base de datos?", 32, "Abrir base de datos") = 6 Then && Sí
pRuta = GetFile("Dbc")
If Empty(pRuta)
=Messagebox("No seleccionó la base de datos.")
Return .F.
Endif
Endif
Endif
Set Multilocks On
Set Deleted On
SET EXCLUSIVE OFF
OPEN DATABASE (pRuta) SHARED
Return .T.
Endproc
y en el form q llamo, recibos:
en el init abro las tablas:
SET DEFAULT TO "z:\"
If !Used("Recibos")
Use Recibos IN 0
Endif
If !Used("Clientes")
Use Clientes In 0
Endif
.. eso es lo que hago, hice lo de la unidad Z en las pc andan bien, la aplicación cuando se ejecuta en cada pc andan bien pero las dos juntas sale:
Denegado z:\recibos.dbf al acceso al archivo
Estoy intentando pero todavía no puedo lograrlo...
- Compartir respuesta
- Anónimo
ahora mismo