Conectar mediante ODBC

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Responder
Noe
Mensajes: 6
Registrado: Jue Feb 25, 2010 7:56 pm

Conectar mediante ODBC

Mensaje por Noe »

Hola:
El otro día mandé un mensaje al foro de writer y creo que debería haberlo mandado a éste. Mi problema es que tengo que hacer una macro para conectarme a una base de datos mediante una ODBC. Llevo más de una semana leyendo, buscando, probando de todo, pero no hay forma. Lo más curioso es que hace unos años lo hice, pero ese proyecto ya no lo tengo y no recuerdo como volverlo a hacer.
Les agradecería cualquier sugerencia pues ya no sé que más probar. Se me agotan las ideas.

Muchas gracias y un saludo, Noemí.
OpenOffice 2.0. Windows XP S.P.2.
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Conectar mediante ODBC

Mensaje por mauricio »

Hola...

Vamos por partes...

¿No tienes problemas para crear la conexión ODBC?, es decir, para poder conectarte desde una macro, primero debes de crear esta conexión (si mal no recuerdo pues hace mucho que no uso Windows) desde el Panel de control | Herramientas administrativas | Orígenes de datos (ODBC), ¿a que base de datos o archivo te quieres conectar?. Después hay que hacer la conexión desde Base y estará disponible para usarlas desde las macros. Espero tus comentarios para ayudarte...

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Noe
Mensajes: 6
Registrado: Jue Feb 25, 2010 7:56 pm

Re: Conectar mediante ODBC

Mensaje por Noe »

Hola Mauricio:
La ODBC la tengo creada y funciona perfectamente. Luego creo una Base de datos con OpenOffice, la engancho con esta ODBC y veo todas las tablas e incluso he creado una consulta de la tabla que me interesa consultar. Hasta ahí muy bien.
Luego dentro de un documento Write engancho con ese documento de base de datos que acabo de crear y cuando pulso F4 me aparecen todas las tablas a las que puedo acceder a través de la ODBC, pero mi problema es que no quiero que se muestren todas las tablas, querría mostrar (en alguna ventana, por ejemplo) los datos de una de ellas.
Es decir, que al pinchar, por ejemplo, en un botón (que está asociado a una macro) se muestren los datos de una tabla en concreto y que cuando pinchen (o seleccionen) uno de ellos se inserte en el documento.
¿Me explico?. Si algo no queda claro me dices y lo intento explicar con un ejemplo.

Un saludo, Noemí.
OpenOffice 2.0. Windows XP S.P.2.
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Conectar mediante ODBC

Mensaje por mauricio »

Hola...

Perfectamente claro y tienes muchas opciones. Puedes agregar una cuadro de diálogo, puedes agregar directamente un control en el documento, pero la opción que más me gusta en estos casos es usar un campo, específicamente los del menú Insertar | Campos | Otros (CTRL+F2), seleccionas la ficha Funciones, en Tipo de campo seleccionas Lista de entrada, del lado derecho puedes añadir y quitar elementos y muy importante, establecerle un nombre al campo para ubicarlo por código. Te anexo un archivo con dos de estos campos, observa que al dar clic en ellos, se despliega una ventana para seleccionar el elemento que quieras de la lista que hayas agregado, uno de los cuales podemos actualizar con la siguiente macro:

Código: Seleccionar todo

Option Explicit


Sub LlenaCampos()
Dim oDoc As Object
Dim oCampos As Object
Dim oCampo As Object
Dim co1 As Integer
Dim mDatos()

	'Los datos que agregaremos al campo
	mDatos = Array("México","España","Argentina")
	'Este documento
	oDoc = ThisComponent
	'Los campos del documento
	oCampos = oDoc.getTextFields.createEnumeration()
	'Iteramos en todos
	Do While oCampos.hasMoreElements
		'Avanzamos al siguiente campo
		oCampo = oCampos.nextElement()
		'Verificamos que sea un campo de función y lista de entrada
		If oCampo.supportsService("com.sun.star.text.TextField.DropDown") Then
			'Verificamos el nombre del que nos interesa
			If oCampo.Name = "Datos" Then
				'Actualizamos sus datos
				oCampo.Items = mDatos
				Exit Do
			End If
		End If
	Loop
	'Refrescamos para ver los cambios
	oDoc.getTextFields.refresh()
	
End Sub
Ahora, si esto te convence, solo tenemos que llenar la matriz:

Código: Seleccionar todo

	mDatos = Array("México","España","Argentina")
Con los datos de tu tabla o consulta, esto es muy sencillo de hacer, pero primero checa si este método te convence para seguirte ayudando. En hojas de calculo me gusta más usar controles, pero en documentos de texto me gusta más el texto directamente en el documento, así no tienes que andar buscando donde insertarlo, pero cada quien tiene necesidades diferentes.

Saludos
Adjuntos
Campo en texto.odt
(10.07 KiB) Descargado 230 veces
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Noe
Mensajes: 6
Registrado: Jue Feb 25, 2010 7:56 pm

Re: Conectar mediante ODBC

Mensaje por Noe »

Hola Mauricio:
He probado el código que dices, pero tengo una duda. Cada vez que quiero insertar un valor del campo Datos, es decir, en el ejemplo, España, México,... ¿tengo que darle a Control+F2 para insertar primero la lista de entrada y luego ejecutar la macro?
Me gusta la ventana que sale cuando pinchas sobre el campo, pero para los usuarios que lo van a usar preferiría que tuvieran que hacer un sólo clic, para que no me la lien. ¿Es posible?.

Muchas gracias por tu ayuda, Noemí.
OpenOffice 2.0. Windows XP S.P.2.
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Conectar mediante ODBC

Mensaje por mauricio »

Hola...

No se como tengas estructurado tu documento, pero la idea es tener ya insertado el campo y después solo llenarlo con tu fuente de datos que, dependiendo de nuevo de tu estructura y necesidades puede ser al abrir el documento o llamarla en algún momento.

Caray si dar dos clic en mucho lío mejor cambia de usuarios (es broma), entiendo que cada quien tiene sus diferentes necesidades, si quieres que solo con un clic se muestre la lista tienes que insertar un cuadro de lista desplegable, el cual no se ve muy bien entre el texto y además no se ajusta al contenido como un campo de datos, pero tu decides...

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Noe
Mensajes: 6
Registrado: Jue Feb 25, 2010 7:56 pm

Re: Conectar mediante ODBC

Mensaje por Noe »

Hola Mauricio:
El problema es que el documento lo tienen que crear los usuarios. Son policías y tienen que hacer los modelos de los atestados. Los hacen los más avispados, pero no me fio nada de ellos... (je, je). Por eso te comentaba, que si tienen que insertar el campo y luego elegir el valor... ¡No sé!
De todas formas, el otro día busqué una solución temporal, pero que igual así se queda si no lo consigo hacer con las macros. Llamo desde la macro, mediante el comando shell, a un ejecutable echo con otro programa en el que se muestran los posibles valores a insertar. Desde este ejecutable, cuando hacen la selección, copio el valor al portapapeles de windows y luego desde la macro hago un "pegar". No he sido capaz de devolver por parámetros el valor seleccionado.
La idea era algo así pero sin el ejecutable, es decir, mostrar al ejecutar la macro una lista con los valores.

Muchas gracias, Noemí.
OpenOffice 2.0. Windows XP S.P.2.
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Conectar mediante ODBC

Mensaje por mauricio »

Hola...

Reitero, todo depende de la estructura de tu documento, pero das pocos detalles, podrías mostrar con algunas imágenes o archivos de ejemplo, como lo haces actualmente y como quieres el resultado, por ejemplo, podrías mostrar esa ventana que dices del otro programa en una cuadro de diálogo y seleccionar y copiar para que el usuario lo pegue donde quiera o insertar directamente en la posición actual del cursor o en alguna otra posición del documento, el campo si no lo tienes también se puede insertar por código, pero esto es útil si se usa el mismo documento con diferentes valores, si los usuarios lo van generando o después ya no hay cambios no es nada practico, en fin, tienes muchas opciones pero todas dependen, de nuevo, de la estructura de tu documento, de tus usuarios y del uso final del documento...

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Noe
Mensajes: 6
Registrado: Jue Feb 25, 2010 7:56 pm

Re: Conectar mediante ODBC

Mensaje por Noe »

Hola Mauricio:
Adjunto un pantallazo de un documento de ejemplo en donde los campos "variables", es decir, los que inserto desde mi base de datos, están entre corchetes "<>". Cuando pincho en el botón InsertarCampo (que no se ve pues ha quedado a la derecha de la pantalla), me muestra la ventana Seleccionar Campo desde la cual haciendo doble clic se inserta el valor seleccionado en la posición del cursor.
El botón InsertarCampo tiene la siguiente macro asignada:
Sub InsertarCampo
dim RetVal as Integer
RetVal = shell("C:\Aplicacion\Diligencia.exe, 1, "", True)
call Pegar
EndSub
Sub Pegar
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
EndSub

La verdad es que como funciona bien, creo que lo voy a dejar así.

Gracias y un saludo, Noemí.
Adjuntos
Ejemplo.pdf
(45.97 KiB) Descargado 257 veces
OpenOffice 2.0. Windows XP S.P.2.
Responder