[RESUELTO] Conexión y Des-Conexión de Bases Registradas

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Responder
Avatar de Usuario
jpiriarte
Mensajes: 13
Registrado: Sab Oct 25, 2014 4:59 pm
Ubicación: Bogotá, Colombia

[RESUELTO] Conexión y Des-Conexión de Bases Registradas

Mensaje por jpiriarte »

Un cordial saludo para todos especialmente a Mauricio (de quien he podido aprender bastante por medio de su libro que considero excelente..), Fornelasa, RGM, RGB-es, SLV-es y en fin muchos otros de los que con sus respuestas y colaboraciones han contribuido mucho en mi proceso de aprendizaje, soy nuevo en el uso de las herramientas y espero me disculpen las torpezas...

Mi pregunta es sobre las bases registradas, tengo unas tablas DBF que provienen de un programa hecho en VisualFoxPro, como las utilizo para realizar consultas, las he copiado en una carpeta y creo una conexión a estas tablas la cual está registrada por Opciones -> LibreOffice Base -> Bases de Datos y todo funciona muy bien (gracias a la ayuda de ustedes), el problema es que necesito actualizar las tablas con alguna frecuencia, es decir volver a copiar las tablas DBF desde el origen a la ubicación de la bese de datos registrada pero al tratar de hacer la copia genera error porque el archivo se encuentra abierto por LibreOffice.

Tratando de solucionarlo me encontré un hilo (https://forum.openoffice.org/es/forum/v ... =50&t=7644) en el que Fornelasa propone "des-registrar" la base para liberarla y luego volver a "registrarla" código que funciona perfectamente pero el archivo sigue estando activo, luego no permite hacer la actualización (copia) de la tabla DBF y en el mismo hilo Mauricio sugiere cerrar las conexiones con "objConnection.dispose()" con lo que se libera el archivo y se puede actualizar pero se pierden (cierran) las conexiones con las bases de datos registradas y por tanto no se puede seguir trabajando con ellas hasta no reiniciar el programa, al utilizar "F4" no muestra las bases de datos registradas.

Mi pregunta es como restablecer las conexiones con las bases de datos registradas, es decir el paso inverso a "objConnection.dispose()", puesto que al tratar de hacer nuevamente una consulta muestra el siguiente error:

Error de ejecución de BASIC.
Se ha producido una excepción
Type: com.sun.star.lang.DisposedException
Message: .

al ejecutar las lineas:

oDBC = createUnoService("com.sun.star.sdb.DatabaseContext")
oBD = oDBC.getByName(sBaseDatos)

Error que se presenta en la última linea, que creo que se debe a que la conexión con las bases de datos fue cerrada.

Espero haber sido claro en mi planteamiento y de antemano les agradezco su ayuda y colaboración.

Cordialmente,
Juan Pablo Iriarte
Última edición por mauricio el Dom Oct 18, 2015 5:23 pm, editado 4 veces en total.
Razón: Marcar icono de resuelto
Juan P Iriarte - Libreoffice Ver 4.2.5.2 en Ubuntu y en Windows
Avatar de Usuario
SLV-es
Mensajes: 4894
Registrado: Jue Ago 26, 2010 1:25 am
Ubicación: España
Contactar:

Re: Conexión y Des-Conexión de Bases Registradas

Mensaje por SLV-es »

Bueno, igual digo una burrada, pero si no se pueden copiar las bases de datos DBF nuevas por estar abiertas, igual habrá que implementar un proceso de "eliminar datos, importar nuevos datos" a las bases de datos abiertas.
Por cierto, seguro que las bases de datos siguen abiertas cuando sales de LibO? No será que tenemos abierto el inicio rápido de LibreOffice? Si es el caso, has probado a cerrarlo antes?
+info en la web "no oficial" dedicada a OpenOffice en Español
AOO 4.1.2 y LibO 4.4.6 en W10 y en Lliurex
No respondo mensajes privados sobre AOO, por favor, utiliza el foro para tus preguntas
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Conexión y Des-Conexión de Bases Registradas

Mensaje por fornelasa »

Hola, tambien:
jpiriarte escribió:en el que se propone "des-registrar" la base para liberarla y luego volver a "registrarla" código que funciona perfectamente pero el archivo sigue estando activo,
Una pregunta, ¿que debemos entender por "el archivo sigue estando activo"?.

Saludos, Federico.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
jpiriarte
Mensajes: 13
Registrado: Sab Oct 25, 2014 4:59 pm
Ubicación: Bogotá, Colombia

Re: Conexión y Des-Conexión de Bases Registradas

Mensaje por jpiriarte »

Primero que todo gracias por las prontas respuestas, luego en relación con lo que comentas (SLV-es), si cierro todo el LibreOffice y vuelvo a abrirlo, permite hacer la copia sin ningún problema desde código, pero si antes de hacer la copia he realizado alguna consulta y al tratar de copiar (sobre-escribir el archivo DBF) produce error, con esto quiero decir que (tratando de contestar la pregunta de Fornelasa) que antes de hacer cualquier consulta el archivo DBF permite ser copiado (o en mi caso actualizado sobre-escribiéndolo) pero si después de hacer una consulta trato de sobre-escribir el archivo genera el error.

Ahora aquí está el código de las dos rutinas, por si ayuda a ilustrar el problema:

Código: Seleccionar todo

Sub Cons1Empl(Codigo1 As Double)
'Rutina para Consultar los datos de "UN" codigo desde Bases de Datos
Dim sSQL As String			'instruccion SQL
Dim oDBC As Object			'Data Base Context
Dim oBD As Object			'Base de Datos
Dim oConexion As Object			'Conexion
Dim oDeclaracion As Object		'Declaracion
Dim sBaseDatos As String		'Nombre de la Base de Datos
Dim TablaBD As String			'Nombre de la tabla
Dim oResultado As Object		'Contenedor de resultados (se maneja diferente en DBF que en ODB)
	sBaseDatos = "BaseUno"
	TablaBD = "Tabla1"
	sSQL = "SELECT NOM, APELLIDO1, APELLIDO2, SEKKY, FIN, FTC, DIA1, ULTD, "
	sSQL = sSQL & "INI_INC, ULT_INC, CARGA, EST FROM "
	sSQL = sSQL & TablaBD & " WHERE IdCod='" & Codigo1 & "'"
	oDBC = createUnoService("com.sun.star.sdb.DatabaseContext")
	oBD = oDBC.getByName(sBaseDatos)
	oConexion = oBD.getConnection("","")
	oDeclaracion = oConexion.createStatement()
	oResultado = oDeclaracion.executeQuery( sSQL )
	If oResultado.next Then Cons1Empl = True



Dim oHoja As Object
Dim Busqueda As Object
Dim oEncontrado As Object
Dim oDir As Object		'Direccion de oEncontrado
Dim oBuscarEn As Object
	oHoja = oHjaDatos 		'(variable de ámbito publico)
	oBuscarEn = oCurHojaProg	'(variable de ámbito publico)
	Busqueda = oHoja.createSearchDescriptor	'Inicio Busqueda Codigo en ActEn__________________
	Busqueda.searchType = 1							'Buscamos por valores
	Busqueda.setSearchString(CodEmpl1)					'Busca el código
	oEncontrado = oBuscarEn.findAll(Busqueda)			'Contenedor de Rangos "TODOS"
	If Not IsNull(oEncontrado) Then
		oEncontrado = oEncontrado.getByIndex(0)			'El Primero UNO Solo -> Rango
		oDir = oEncontrado.getCellAddress()
		'MsgBox(oEncontrado.AbsoluteName)
	Else
		MsgBox("Codigo No Encontrado - Informacion NO actualizada *********")
		Exit Sub
	End If						'Fin Busqueda Codigo en ActEn___________________________________
	oHoja.getCellByPosition(1, oDir.Row).setString(oResultado.getString(1))
	oHoja.getCellByPosition(2, oDir.Row).setString(oResultado.getString(2) & " " & oResultado.getString(3))
	If oResultado.getString(4) = "001" Then
		oHoja.getCellByPosition(3, oDir.Row).setString("IC")
	ElseIf oResultado.getString(4) = "002" Then
		oHoja.getCellByPosition(3, oDir.Row).setString("IX")
	Else
		oHoja.getCellByPosition(3, oDir.Row).setString("N.D.")
	End If
	oHoja.getCellByPosition(4, oDir.Row).setString(oResultado.getString(5))
	If oResultado.getString(6) <> "" Then oHoja.getCellByPosition(5, oDir.Row).setValue(BDFecha(oResultado.getString(6)))
	If oResultado.getString(7) <> "" Then oHoja.getCellByPosition(6, oDir.Row).setValue(BDFecha(oResultado.getString(7)))
	If oResultado.getString(8) <> "" Then oHoja.getCellByPosition(7, oDir.Row).setValue(BDFecha(oResultado.getString(8)))
	If oResultado.getString(9) <> "" Then oHoja.getCellByPosition(8, oDir.Row).setValue(BDFecha(oResultado.getString(9)))
	If oResultado.getString(10) <> "" Then oHoja.getCellByPosition(9, oDir.Row).setValue(BDFecha(oResultado.getString(10)))
	If oResultado.getString(11) <> "" Then oHoja.getCellByPosition(10, oDir.Row).setValue(BDFecha(oResultado.getString(11)))
	oHoja.getCellByPosition(11, oDir.Row).setString(oResultado.getString(12))
	oHoja.getCellByPosition(12, oDir.Row).setString(oResultado.getString(13))



'Desde aqui pruebas para actualizar DBF
'	oDeclaracion.close()
'	oConexion.close()
'	oDBC.dispose()
End Sub
Y aquí la copia del archivo:

Código: Seleccionar todo

Sub ActEmplDeNOVA
'Rutina para Actualizar la Tabla1 desde NOVASOFT a ConexDBF
Dim URLOrig As String
Dim URLDest As String
Dim Msg As String
	URLOrig = "C:/novasoft/INOXCOL/Datvis6/NOM.F/BASE/Tabla1.dbf"
	URLOrig = Join(Split(URLOrig,"/"), getPathSeparator())
	URLOrig = ConvertToURL(URLOrig)
	Msg = "Tabla ""EMPLEA"" NO Encontrada en ""INOXCOL""..." & Chr(13) & "Tabla NO Actualizada..."
	If Dir(URLOrig) = "" Then MsgBox(Msg): Goto SaltaIC:
	URLDest = "C:/JPI/ConexDBF/oBaseIC/Tabla1.dbf"
	URLDest = Join(Split(URLDest,"/"), getPathSeparator())
	URLDest = ConvertToURL(URLDest)
	FileCopy(URLOrig, URLDest)
'PENDIENTE REVISAR QUE LA BASE ESTA CONECTADA PRODUCE ERROR ************* OJO *****
SaltaIC:
'_______________________ AQUI VAMOS _______________________________
End Sub
Bueno tratando de resumir, se puede copiar antes de ejecutar la consulta, después ya no, si se "Des-Registra" igual sigue registrando el archivo como: "en uso por LibreOffice", si se cierra las conexiones con la sentencia "oDBC.dispose()", ya permite hacer la copia pero ya las consultas producen error.

Gracias y espero haber podido ser claro.

Un muy cordial saludo,

Juan Pablo Iriarte
Juan P Iriarte - Libreoffice Ver 4.2.5.2 en Ubuntu y en Windows
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Conexión y Des-Conexión de Bases Registradas

Mensaje por fornelasa »

Si es que he entendido bien, bastaría con utilizar esta linea de codigo:

Código: Seleccionar todo

dbContext.revokeDatabaseLocation(dbName)
En vez de esta

Código: Seleccionar todo

dbContext.revokeObject (dbName)
Para que la macro Des_Registrar quede así:

Código: Seleccionar todo

  Sub Des_Registrar()
      Dim dbContext As Object
         dbName = "Base2"
      dbContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
         dbContext.revokeDatabaseLocation(dbName)
     end sub 
Tal vez vaya por ahí el asunto.

Saludos.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
jpiriarte
Mensajes: 13
Registrado: Sab Oct 25, 2014 4:59 pm
Ubicación: Bogotá, Colombia

Re: Conexión y Des-Conexión de Bases Registradas

Mensaje por jpiriarte »

Gracias Federico, lo intenté con tu sugerencia pero tampoco he obtenido el resultado deseado (igualmente considera que el archivo está en uso), he estado leyendo un poco en los foros en inglés y según lo que entendí con "dispose()" se cierra el puente (bridge) de conexión con el entono de java y de java no se absolutamente nada, si apenas medio entiendo OooBasic, gracias al libro de Mauricio y las ayudas de todos ustedes, con java si estoy perdido, entonces estoy considerando cerrar la conexión (oDBC.dispose()), hacer la actualización (copia para sobre- escribir el archivo) y obligar al usuario a reiniciar el LibreOffice para que al iniciar el programa establezca nuevamente las conexiones y así continuar trabajando las consultas.

Trataré de hacerlo y estaré publicando el resultado por si es de ayuda para alguien.

Reitero mis agradecimientos para todos los que han contribuido en todos los temas y tengan la certeza de que de cada uno he podido aprender algo y me han despertado una gran pasión, espero en un futuro poder retribuir con algún aporte de utilidad.

Saludos para todos,

Juan Pablo
Juan P Iriarte - Libreoffice Ver 4.2.5.2 en Ubuntu y en Windows
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Conexión y Des-Conexión de Bases Registradas

Mensaje por mauricio »

Con una base de datos ODB, puedes trabajar sin que este registrada previamente, solo se le pasa la ruta del archivo al conectar y listo: https://forum.openoffice.org/es/forum/v ... 390#p49462

ya conectada, puedes hacer las mismas consultas... puedes desconectar para actualizar el archivo y volver a conectar...
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
jpiriarte
Mensajes: 13
Registrado: Sab Oct 25, 2014 4:59 pm
Ubicación: Bogotá, Colombia

[Resuelto]Conexión y Des-Conexión de Bases Registradas

Mensaje por jpiriarte »

Bueno, ahora si la solución...

Gracias Mauricio, Federico y de SLV-es (no conozco tu nombre) por indicarme el camino, los aportes de cada uno contribuyeron a encontrar la solución sin su orientación no hubiera podido (y no solo en este tema sino en todo el camino que he podido recorrer) y les estoy inmensamente agradecido :bravo: .

En el tema que nos ocupa tengo que decir que en principio no me funcionaba nada :knock: y por un afortunado accidente pude determinar el problema y era que la rutina de conexión a la base de datos la incluí en una rutina que se cargaba al abrir el documento (lo aprendí con el libro de Mauricio) y cuando modificaba la rutina para cerrar la conexión con la base de datos no se desconectaba realmente, la conexión permanecía activa pese a que utilizaba las mismas variables para intentar desconectarla y por tanto cuando trataba de actualizar el archivo de la tabla DBF el sistema lo registraba como ocupado por LibreOffice generando en consecuente error.

Tratando de probar las diferentes soluciones y por un motivo que desconozco el programa se cerró inesperadamente iniciando el proceso de auto recuperación y en ese momento y para mi sorpresa la rutina y su correspondiente des-conexión de la base de datos funcionó correctamente y a partir de allí todo fue en bajada, todo empezó a funcionar estupendamente.

Mi conclusión y sin mucho conocimiento "SUPONGO" que en el servicio "oDBC = createUnoService("com.sun.star.sdb.DatabaseContext")" se almacenan las conexiones activas y por ese motivo lo único que me funcionaba era "matar" el servicio y luego no podía establecer nuevas conexiones. Ahora después de hacer algunas pruebas en este sentido he llegado a la conclusión de que al iniciar la aplicación (LO) no hay conexiones activas y para poder cerrarlas hay que hacerlo de manera lógica es decir establecer la conexión, procesar la respectiva consulta y cerrar la conexión.

Si se establece la conexión, se procesa la consulta, se vuelve a establecer la conexión y luego se intenta cerrar la conexión (así se utilicen los mismos nombres de las variables) el programa establece dos (o más) conexiones diferentes, luego al cerrar la última conexión permanecen las conexiones anteriores y el archivo (que pretendía actualizar) esta ocupado por la aplicación produciendo el error.

Espero haber explicado correctamente el problema y la solución, y dejo el código que me ha funcionado correctamente, aclarando que ha sido una recopilación de las soluciones que los colaboradores del foro han propuesto y que sin su ayuda y orientación no hubiera sido posible.

Código: Seleccionar todo

Sub Consultas1
Dim oDBC As Object
Dim oBD As Object
Dim Conex As Object
Dim Declaracion As Object
Dim Resultado As Object
Dim URLDest As String
Dim Msg As String
Dim Usr As String, Pass As String
Dim sSQL As String
	URLDest = "//192.137.1.4/ConexDBF/oBasesIC/ICRemoto.odb"
	URLDest = Join(Split(URLDest,"/"), getPathSeparator())
	URLDest = ConvertToURL(URLDest)
	oDBC = createUnoService("com.sun.star.sdb.DatabaseContext")
	oBD = oDBC.getByName(URLDest)
	Usr = ""
	Pass = ""
    On Error Goto not_access
    Conex = oBD.getConnection(Usr,Pass)
	MsgBox("Conexión realizada exitosamente")
	Declaracion = Conex.createStatement()
	sSQL = "SELECT NOM, APELLIDO, SEKKY, FIN, CARGAS, EST FROM TablaBD WHERE NOM='Jorge'"	
	Resultado = Declaracion.executeQuery(sSQL)
	
	'AQUI VA EL CODIGO QUE SE QUIERA PARA PROCESAR LA CONSULTA ...
	
	Declaracion.dispose()
	Conex.dispose()
	
	Exit Sub
not_access:
	Msg = "No se pudo conectar " & Chr(13) & "Error No." & Err & " - " & Error
	MsgBox(Msg, 16, "CONEXIONES...")
End Sub
Ahora, un par de consideraciones que me parecen relevantes:

1- El ejemplo utiliza bases de datos que no están registradas, pero creo que igual funcionaría con bases registradas (si llego a hacer la prueba lo publico).
2- La base de datos que trabajo está almacenada en un servidor remoto y de igual forma el código funciona perfectamente, tanto en las conexiones, consultas y actualizaciones.
3- Al iniciar la aplicación no hay conexiones activas pero una vez establecida una conexión y para poder cerrarla la variable debe apuntar a la conexión adecuada, si se vuelve a establecer una conexión con la misma variable se habrá creado una nueva conexión y la anterior no se cerrará, no se como trabajar con las conexiones activas pero creo que ese es otro tema.
4- El manejo de direcciones URL lo aprendí del libro de Mauricio y aportes en el foro, aquí personalmente tengo una particularidad y es que manejo un computador con Ubuntu 14.0 y otro con Windows, hay diferencias en los separadores de directorios en cada sistema ("/" o "\" en uno u otro) que en principio me dio dolores de cabeza, pero utilizando "getPathSeparator()" y aplicando lo aprendido en el libro y consultando el foro, llegue procesar las URL igual en ambos sistemas. (espero que le sirva a alguien).

Por todo doy el tema por Resuelto y agradezco nuevamente el apoyo de todos.

Saludos,

Juan Pablo
Juan P Iriarte - Libreoffice Ver 4.2.5.2 en Ubuntu y en Windows
Avatar de Usuario
SLV-es
Mensajes: 4894
Registrado: Jue Ago 26, 2010 1:25 am
Ubicación: España
Contactar:

Re: [RESUELTO] Conexión y Des-Conexión de Bases Registradas

Mensaje por SLV-es »

:super: :bravo:
Gracias por compartir la solución que has encontrado
+info en la web "no oficial" dedicada a OpenOffice en Español
AOO 4.1.2 y LibO 4.4.6 en W10 y en Lliurex
No respondo mensajes privados sobre AOO, por favor, utiliza el foro para tus preguntas
Responder