Acceso a datos desde OpenOffice.org

Desde OpenOffice.org, aunque no dispongamos de una interfaz de usuario tan cómoda como la de Access, también podemos acceder a datos, crear formularios, obtener informes, etc.

En esta sección trataremos todos estos temas

Conexión a MySQL desde OOo (video tutorial)

Alexandro Colorado, del Grupo de Usuarios de Linux de Tabasco (México) nos facilita el video tutorial que ha realizado demostrando como insertar en un documento de OpenOffice.org Writer, varios registros de una base de datos MySQL.

¡Disfrutadlo!

Disponible en:
http://superalumnos.net/files/mysql2000.swf (Flash - 3,6 MB)

Conexión con mySQL desde GNU/Linux (Debian)

Los compañeros de Nodo50 comparten con nosotros este mini-tutorial que nos muestra como conectar con MySQL desde OpenOffice. Este material forma parte de los cursos de informática que imparte imparte en Madrid a precios muy populares esta organización de contrainformación en red.

HOW-TO Acceso a My SQL 3.23 desde la Fuente de Datos de OpenOffice 1.1.1 en Debian Woody

Curso de Introducción OpenOffice impartido por Nodo50

1.- Instalamos MySQL

apt-get install mysql-server

2.- Activamos la conexión por red al servidor MySQL

Para ello editamos el fichero de configuración de MySQL (/etc/mysql/my.cnf) y comentamos la linea "skip networking"

#skip networking

3.- reiniciamos el servidor MySQL

/etc/init.d/mysql stop

/etc/init.d/mysql start

4.- Asignamos passwdord al usuario root de MySQL

mysqladmin -u root password contraseña

5.- Iniciamos una sesión en el servidor, creamos la base de datos TRABAJO y la tabla CONTACTO (ver apuntes de ayer)

6.- Instalamos los paquetes libmyodbc y unixodbc-dev (reparar en sus dependencias)

7.- Editamos el fichero /etc/odbc.ini (estará en blanco) y le introducimos estas líneas:

[trabajo]
Trace = Off

TraceFile= stderr

Driver = /usr/lib/odbc/libmyodbc.so

DSN = trabajo

SERVER = localhost

USER = root

PASSWORD = contraseña

PORT = 3306

#OPTIONS = 1

#DATABASE= trabajo

#SOCKET = /tmp/mysql.soc

si bien en este ejercicio conectamos como root, lo correcto seria hacerlo como un usuario determinado de MySQL que tiene determinados privilegios sobre la base de datos TRABAJO. También es conveniente reparar en que la conexión se hace por el puerto por defecto por el que responde MySQL. Eso significa que aunque conectemos sobre la localhost, la conexión es una conexión de red, de ahí que hayamos tenido que habilitar las conexionesde red en el my.cnf

(Al instalar el paquete libmyodbc, encontraremos en /usr/share/doc/libmyodbc/exmples un ejemplo del fichero odbc.ini que podemos utilizar retocándolo con los datos de nuestro servidor MySQL y nuestra base de datos)

6.- Abrimos un documento de Write (OO) y vamos al menú Herramientas/Fuente de Datos. Creamos una nueva Fuente de Datos llamada Trabajo. Ponemos como tipo de Fuente de Datos la opción MySQL

7.- Vamos a la Pestaña MySQL, editamos la URL de Fuente de Datos y comprobamos que nos aparece el perfil que hemos creado en /etc/odbc.ini que se llamaba [trabajo] . En /etc/odbc.ini podríamos definir varios perfiles para accesos a múltiples bases de datos

8.- En la Pestaña Tablas comprobamos que hemos accedido a la base de datos TRABAJO y que se visualiza la tabla CONTACTO

9.- Con el editor de SQL o el Asistente Gráfico diseñamos una Consulta

10.- Ya podemos trabajar sobre la base de datos TRABAJO desde OO

Creación de consultas UNION con Base en OpenOffice.org y LibreOffice

Hay un tipo de consultas para las cuales no nos sirve el entorno gráfico de diseño de consultas que nos provee Base (el programa de bases de datos de OpenOffice.org o LibreOffice).

Se trata de las consultas de UNION que nos permiten agregar los resultados de dos tablas o consultas. Un ejemplo sería tener dos tablas diferentes con la misma estructura de datos conteniendo datos personales. Si deseamos una consulta que nos muestre la totalidad de registros de ambas tablas, precisamos de una UNION:

Tabla1 UNION Tabla2

En OpenOffice.org este tipo de consultas presentan unas dificultades especiales que hacen su manejo bastante intratable y hace tiempo que tenía pendiente el esclarecimiento de esta cuestión.

Un mensaje en el foro en español de OOo ha planteado un caso que me ha estimulado para ponerme manos a la obra.

La cuestión planteada por el compañero aventis:

Se me ha pedido hacer un Libro Mayor a partir de una tabla/registro de Ventas cuyos datos están organizados de la siguiente estructura de campos:

  • Id_venta
  • Concepto
  • Precio
  • Fecha_venta
  • Fecha_cobro
  • Nota_cobro

El resultado final debe quedar así:

Fecha------Concepto---------Debe-------Haber-------Saldo

Si quiero hacer el "Debe", hago una consulta con:

  • Concepto
  • Fecha_venta
  • Precio

Si quiero hacer el "Haber", hago una consulta con:

  • Fecha_cobro
  • Nota_cobro
  • Precio

La cuestión es.... ¿Cómo hago para juntar todos los movimientos en un informe guardando orden cronológico? Supongo que una consulta que debe duplicar los registros, uno para fecha_venta y otro para fecha_cobro (si existe) y que "baraje" todas las fechas de manera que estén ordenadas.

Está claro que lo que hace falta es una UNION entre la consulta Debe y la consulta Haber; nuestro objetivo será resolverlo con nuestra suite informática libre.

Como era de esperar, nuestros primeros intentos han provocado diferentes errores. Como es bastante difícil que seamos los primeros en tropezar con estos problemas he iniciado una búsqueda en internet para ver quien se ha peleado antes con ello. En español no encontré ninguna ayuda relevante, pero como era previsible, en los foros en inglés y picoteando de aquí y de allá encontré suficientes pistas para solucionarlo.

Lo que podría ser un planteamiento bastante fácil, se complica innecesariamente por las peculiaridades con que Base maneja estas consultas.

Por eso voy a estructurar la solución en dos partes: de una, las diferentes consideraciones que debemos tener presentes para trabajar con este tipo de consultas y, de otra, la guía paso a paso con sus capturas de pantalla.

Consideraciones previas:

  • Las consultas de UNION no se puede hacer en la vista de diseño ni con el asistente, hay que hacerlas en la vista SQL
  • Tampoco basta con escribir simplemente la consulta en SQL; también hay que activar el botón "SQL" (o Editar > Ejecutar directamente comando SQL). Si no lo hacemos así, el Base nos dice que la consulta de UNION no es una consulta válida. Este método equivale a las "consultas de paso a través" de Access y permite que nuestra instrucción SQL acceda directamente al controlador de la base de datos puenteando el motor del programa.
  • Consecuencia de lo anterior, hay que ser más meticuloso con la sintaxis.
    Si en SQL "normal" es válido escribir:
    SELECT * FROM Ventas
    en el modo de "ejecución directa de SQL" hay que hacer:
    SELECT * FROM "Ventas"
  • En Base, no se puede hacer una UNION de dos consultas, pero sí de dos tablas o vistas de tabla. Por eso no crearemos Debe y Haber como consultas, sino como vistas de tabla.
  • Tanto la VistaDebe como la VistaHaber deberán tener los mismos campos para poder hacer la UNION, por eso en la VistaDebe necesitamos crear un campo "Haber" con valores a cero, y en la VistaHaber un campo "Debe" con valores a cero.
  • Otro problema, en este caso por causa de los campos calculados: al crear este campo poniendo directamente el valor 0 en el diseño de vistas de tabla, se fundía el Base. Curiosamente, si lo hago en SQL, admite perfectamente "(...) 0 AS Debe (...)" dentro de la instrucción. Solución tonta para hacerlo desde la vista diseño: en vez de 0, escribir 0 * 0.

Teniendo presentes estas consideraciones, pasemos a la solución del problema de ejemplo.

Guía paso a paso:

Puedes pulsar sobre las imágenes para verlas a tamaño real, asi como, del pie del artículo, descargarte el adjunto test-mayor.odb con que se ha realizado la práctica.

1) Disponemos de la tabla Ventas, según la estructura propuesta.

2) Creamos una vista de tabla VistaDebe, tal que así:

La instrucción SQL correspondiente:

SELECT "Fecha_Venta" AS "Fecha", "Concepto" AS "Concepto", "Precio" AS "Debe", 0 * 0 AS "Haber", "IdVenta" FROM "Ventas"

3) Creamos una vista de tabla VistaHaber, tal que así:

La instrucción SQL resultante:

SELECT "Fecha_Cobro" AS "Fecha", "Nota_Cobro" AS "Concepto", 0 * 0 AS "Debe", "Precio" AS "Haber", "IdVenta" FROM "Ventas" WHERE "Fecha_Cobro" IS NOT NULL

4) Creamos una consulta Mayor en modo SQL teniendo presente activar el botón SQL o mediante el menú Editar > Ejecutar directamente comando SQL.  La instrucción a escribir es 

SELECT * FROM "VistaDebe" UNION SELECT * FROM "VistaHaber" ORDER BY "Fecha"

¡Y ya lo tenemos!

He dejado el arrastre de saldos acumulados para otra ocasión, aunque creo que sería mejor hacerlo en el informe más que en la propia consulta, no sé si con el Oracle Report Builder es fácil establecer este tipo de campos calculados.

Espero que esta receta os sirva de ayuda para alguno de vuestros proyectos.

¡Hasta la próxima!

PS.- Abajo verás el enlace para descargar el archivo de ejemplo test-mayor.odb.

AdjuntoTamaño
test-mayor.odb5.38 KB

FORMULARIOS DE OPENOFFICE CONECTADOS A UNA BASE DE DATOS EN UNA INTRANET

El objetivo es el siguiente: Tener una base de datos con una o varias tablas, a dichas tablas las alimentan diferentes personas de la intranet, entonces con OpenBase nos conectamos a mysql utilizando un conector en java. Con OpenBase se crean formularios para que la base de datos sea actualizada o consultada. Con mysql puedo tener diferentes usuarios con diferentes permisos.

ES NECESARIO:

  • Tener OpenOffice instalado.
  • Tener instalado y configurado mysql.
  • En este caso usaré PhpMyAdmin para la gestión de las bases de datos.

PASOS A REALIZAR:

  1. Crear la base de datos en Mysql con phpmyadmin y crear un usuario que pueda administrar esto, no deben crearse tablas en este punto del proceso.
  2. Debemos bajar este paquete  http://dev.mysql.com/downloads/connector/j/5.1.html. MySQL Connector/J es el driver JDBC oficial  para MySQL, este conector se le agrega a OpenOffice para que se conecte con Mysql.
  3. Después de bajar este paquete se procede a descomprimirlo, esta carpeta no debe borrarse o moverse después de instalar el conector.
  4. Abrir OpenOffice Write, ir al menú Herramientas – Opciones – Java
  5. Clic donde dice CLASS PATH
  6. Clic agragar archivo
  7. Buscar el archivo .jar que está dentro de lo que descomprimimos
  8. Se agrega y se le da aceptar
  9. Nos pide que reiniciemos Openoffice, procedemos a hacerlo.
  10. Abrimos OpenOffice Base, le damos conectar con una base de datos existente y buscamos Mysql
  11. Le decimos conectar usando JDBC
  12. Ahora debe aparecer una opción donde pide los datos del servidor
  13. En la URL del servidor se coloca 127.0.0.1 (para nuestro caso) y el nombre de la base de datos que se creó anteriormente, lo demás se deja como está.
  14. Luego siguiente, nos pide el usuario y seleccionamos que requiere contraseña, siguiente y finalizar.
  15. Nos pregunta que si registramos la base de datos y la abrimos para editar, le decimos que SI.
  16. Clic donde dice Tablas, ahí debe pedir la contraseña, se la damos y aceptar.
  17. Lo que sigue es crear las tablas donde se va a ingresar la información y luego los formularios para ingresar y modificar los datos. No olvidar que se muy importante definir una clave primaria para cada una de las tablas.
  18. El mismo Openoffice se encarga de conectarse con diferentes usuarios, por lo tanto los equipos de intranet, deben tener openoffice.
  19. Ahora veremos la conexión desde otro equipo.
  20. Lo primero es que el equipo cliente tenga instalado OpenOffice.
  21. En este equipo también debemos instalar el conector de Java para Msql que instalamos en el equipo servidor (Numeral 2). Funciona igual en Linux y en Windows.
  22. Hacemos la conexión a la base de datos de la siguiendo los mismos pasos que en el servidor, y cuando pide la url del servidor, le damos la IP de la máquina servidor.
  23. Se deja el puerto que trae por defecto.
  24. Al probar la conexión debería funcionar sin problema, pero en mi caso tuve varios (Numeral 29).
  25. Ahora nos pregunta si queremos guardar y editar y le decimos que si.
  26. Si no hay problemas, nos dirigimos a la tabla y podremos ver la información guardada en ella, y luego podemos acceder al formulario, que puede haber sido copiado del equipo servidor, o puede realizarse de la misma manera que se hizo en  el servidor.
  27. En mi caso realicé el formulario con el asistente y luego procedí a probarlo.
  28. Si todo funciona bien podremos ver la info registrada en el cliente a través del servidor.
  29. Mi primer problema fue el siguiente error1: el conductor de la clase no puede ser cargado, en el momento de probar la conexión.
    Solución: Reiniciar el equipo.
  30. Error2: communications link failure - last packet sent to the server was 0 ms ago
    Esto significa que Mysql está mal configurado y está corriendo solo en localhost
    Solución: Hacer que Mysql corra en todas las interfaces del equipo haciendo un cambio en el archivo my.cnf que en mi caso se encuentra en /etc/mysql , buscar skip-networking, encontramos una línea que dice bind-address = 127.0.0.1 y la cambiamos por bind-address = 0.0.0.0 , luego reiniciamos Mysql
  31. Error3: null, message from server: "Host '192.17.34.XXX' is not allowed to connect to this MySQL server"
    Esto es un error de permisos de Mysql.
    Solución: Con phpmyadmin revisar la configuración del usuario. En mi caso descubrí que el usuario tenía todos los privilegios, pero sólo en el localhost. Entré a editar el usuario y en la opción de servidor cambié local por cualquier servidor.

Lo siguiente es hacer pruebas con diferentes tipos de usuarios y disfrutar de este servicio.

Importar datos de Calc en Base

Esta semana, Héctor Hoshi preguntó en la lista de correo de OpenOffice.org sobre la posibilidad de pegar un rango de datos de Calc en una tabla de Base.

Mi errónea respuesta fue que no se podía hacer directamente, remitiéndome a una macro que Santiago Bossio había desarrollado para implementar esta funcionalidad.

Mi gran sorpresa ha sido leer ayer mismo el Linux Magazine nº 14, donde Dmitri Popov publica un artículo de título "Llegar a Base".

En este artículo, Dmitri nos explica lo fácil que resulta la importación de datos de nuestras hojas de cálculo a la novedosa aplicación Base de OpenOffice.org.

Lo cito textualmente, intercalando algunos comentarios:

¿Y si ya se tiene la información en una hoja de cálculo? En muchas ocasiones, simplemente se desea importar la información existente en la base de datos. Por ejemplo supongamos que se tiene un archivo de Calc que contiene una lista de contactos y se quiere importar a la tabla CONTACTS.

Ya que una fuente de datos con un formato adecuado puede simplificar enormemente el proceso de importación, merece la pena perder algo de tiempo en preparar esta tarea. Lo primero que se hace es modificar la estructura de la hoja de cálculo para que sea idéntica a la estructura de la tabla CONTACTS. Es preciso asegurarse que la primera fila contiene los mismos nombres de campos que los de la tabla de la base de datos. Idealmente, deberían esar también el mismo orden. Hay que asegurarse de que todos los bloques de datos están colocados en las columnas adecuadas.

Bueno, esto no es exactamente así. He comprobado que si hay el mismo número de campos, se puede asociar cada columna de Calc al campo de Base que corresponda (incluso si no están en el mismo orden). Sigo citando...

A continuación se seleccionan los datos de la hoja de cálculo y se copian al portapapeles ("Editar -> Copiar" o "Ctrl + C"). Se abre la base de datos, se pulsa en el botón "Tablas", y se selecciona la tabla CONTACTS. Se pulsa con el botón derecho sobre ella y se selecciona "Pegar". En el cuadro "Copiar tabla" se teclea exactamente el nombre de la tabla objetivo en el campo Nombre de la tabla y se selecciona la opción "Adjuntar datos".

Adicionalmente, si escribimos un nombre de tabla inexistente se creará una nueva tabla en nuestra base de datos.

En el cuadro de asignación de columnas se verifica que todos los campos de la ventana de tabla origen están seleccionados y alineados con los campos respectivos de la ventana de tabla destino. Para alinear los campos se usan las flechas azules. Por último se pulsa en "Crear" para importar los datos.

Bien, ya veis lo fácil que es. ¿Como no se nos ocurrió antes? :-)

Importar tablas de Access desde OpenOffice.org Base - parte I

En algunas de las experiencias de migración a OpenOffice.org en las que colaboramos, nos hemos encontrado con usuarios que manejan pequeñas bases de datos desarrolladas en Microsoft Access. En estos casos, para poder prescindir de Access, podemos usar el gestor de base de datos incorporado en OpenOffice.org, denominado Base. Podemos usar Base de dos maneras diferentes:

  • Accediendo desde Base a los datos almacenados en Access.
  • Importando a Base los datos de las tablas de Access.

Mediante el presente tutorial veremos la manera de realizar ambas tareas.

Dado que esta explicación es algo larga, hemos optado por dividirla en tres partes. En la primera -ésta que estas leyendo-, veremos como crear una base de datos que nos permite acceder a las tablas y consultas de Access; en la segunda parte, trataremos de la migración de datos propiamente dicha; reservando la tercera parte del tutorial para ampliar un poco algunos detalles relativos a la personalización de los campos o columnas a migrar.

Hemos ilustrado el texto con diferentes capturas de pantalla, en cuyas miniaturas podéis pulsar para verlas a tamaño real; y al final encontraréis un vídeo demostrativo que muestra todo el proceso.

Tengamos presente que una base de datos de Base se comporta de forma parecida a Access en el sentido de que en un sólo archivo, con extensión .odb almacena tanto las tablas y consultas, como los formularios e informes relacionados; presenta el inconveniente de ser mono-usuaria (no admite conexiones concurrentes), pero tiene la ventaja de poder ser enviada por correo fácilmente.

Tan sólo recomendaríamos esta solución para pequeñas bases de datos de escritorio. Si necesitamos acceso concurrente o la base de datos va a ser algo grande, con decenas de miles de registros, será mucho mejor plantearse la migración a una base de datos "real" como puedan ser MySQL o PostgreSQL (u Oracle si estás en una mega-corporación) Guiño , que igualmente pueden ser accedidas vía formularios e informes desde Base.

También debemos efectuar unas advertencias:

  • Sólo podremos convertir los datos almacenados en tablas y consultas.
  • No podemos convertir directamente formularios ni informes, que se podrán reescribir en Base con bastante facilidad.
  • Tampoco podremos convertir macros o módulos VBA, en cuyo caso habría que estudiar la solución con detenimiento.

Tras efectuar estas consideraciones, nos pondremos manos a la obra. El procedimiento a seguir para exportar tablas y consultas desde Access a Base consistirá en:

  1. crear una base de datos en Base que será la base de datos "contenedora" de los datos finales.
  2. crear otra base de datos en Base, que vincule los datos de la base de datos en Access.
  3. copiar las tablas vinculadas de esta última base de datos a la creada anteriormente.

Así que, en primer lugar, creamos una base de datos vacía (Archivo > Nuevo > Base de datos) seleccionando en el asistente la opción "Crear nueva base de datos"

 

 

En el paso siguiente del asistente escogeremos "Sí, registrar la base de datos", lo que permitirá poder usar los datos de esta base para combinar correspondiencia con el procesador de textos Writer o crear un piloto de datos con la hoja de cálculo Calc.

 

 

Tampoco es imprescindible hacerlo ahora mismo; siempre podemos registrar la base de datos en otro momento mediante Herramientas > Opciones > OpenOffice.org Base > Base de datos > Nuevo

Tras el paso siguiente, en que indicaremos la ubicación y nombre de la base de datos que estamos creando (en el ejemplo neptuno-base.odb), nos aparecerá la interfaz de Base, con una base de datos vacía; observemos en la barra de estado la información que indica que nos encontramos con una base de datos incrustada, que hace uso del motor HSQL . Este tipo de base de datos se comporta de una manera similar a Access, conteniendo en un solo archivo las tablas, consultas, formularios e informes de la misma.

 

 

Luego creamos otra nueva base de datos que permitirá conectarnos con los datos del archivo (.mdb) de Access.

En este caso, escogeremos la opción "Conectar con una base de datos existente" en el primer paso del asistente, para seguidamente escoger el controlador de bases de datos para Access.

 

 

Esto, que resulta tan fácil en Windows, no nos resultará tan sencillo si estamos usando OpenOffice.org en algún sistema GNU/Linux, para el cual no está disponible el controlador de Access. En ese caso se podrá acceder vía ODBC, para lo cual será preciso instalar diferentes utillerías, siendo tema para tratar en otro tutorial.

En el siguiente paso del asistente se nos pedirá seleccionar el archivo (.mdb) que contiene los datos que deseamos importar. En nuestro ejemplo, estamos usando "Neptuno", la conocida base de datos de ejemplo que incorporan todas las versiones de Access.

Como no deseamos acceder desde Writer ni Calc a estos datos (ya accederemos a ellos cuando estén importados en la base de datos que creamos al principio), en el siguiente paso del asistente, le indicaremos que no vamos a registrar la base de datos.

 

 

Después de asignar ubicación y nombre para esta base de datos (en el ejemplo neptuno-access.odb), nos encontramos con que la sección de Tablas, nos muestra todas las tablas y consultas que hay en el archivo Neptuno.mdb. Si accedemos a estos datos y los modificamos, se están modificando los datos en el archivo Neptuno.mdb original.

 

 

 

Observemos como lo que eran consultas en Access, se han importado como vistas de tabla en Base. Una vista, en este contexto, es muy parecida a una consulta, con la diferencia de que una vez creada, no podemos acceder a su diseño, pero su funcionalidad es muy parecida. Si los registros de las tablas se modifican, también las vistas relacionadas con esas tablas mostrarán resultados diferentes.

De hecho, si creamos una vista, podremos comprobar que en Access se ha creado una consulta que se puede ejecutar correctamente, pero no intentemos editarla, pues Access se alocará totalmente, incluso provocando un crash si intentamos acceder a la vista SQL.

¿Qué ocurre si en esta base de datos creamos una consulta? Pues que la consulta se creará y funcionará perfectamente, pero tan sólo en el .odb, no afectando para nada al archivo .mdb.

En la próxima entrega mostraremos como migrar los datos de una a otra, que como podéis intuir es tan sencillo como arrastrar las tablas de la base neptuno-access.odb hasta neptuno-base.odb.  No obstante, hay que tener en cuenta una serie de matices en relación a los formatos de los campos, que posiblemente nos obliguen a personalizarlos de alguna manera.  De eso trataremos en nuestra próxima entrega.

Ahora, podéis ver un vídeo demostrativo de los pasos dados hasta aquí.

 

 

Tutorial de OpenOffice.org Base

Hacía días que no consultaba las listas de correo de OpenOffice.org, y siguiendo el hilo y los enlaces de algunas discusiones sobre Base, llegué a este excelente tutorial de la Base de Datos de OOo:

http://tutorialopenofficebase.wordpress.com/

Es de perfil básico, pero será imprescindible para principiantes y cursos de iniciación. 

Actualización 16/03:

Dado su evidente interés, y vistas las peticiones de abundantes visitantes de la web original, hemos recopilado el material en formato ODF y PDF, que puedes descargar de los siguientes enlaces:

http://superalumnos.net/docs/tutorialOOoBase.odt (14,0 MB)

http://superalumnos.net/docs/tutorialOOoBase.pdf (5,8 MB)

De esta manera podréis disponer de una interesante guía de estudio y para impartir cursos.

Disfrutadlo!

 

 

Usando SQL "a tope" con OpenOffice y LibreOffice

Poniéndome al día en los foros de OpenOffice.org en español, me encuentro con un excelente tutorial de Eduardo Ponce, Usando SQL en Base de OOo, que nos muestra como crear y manejar una base de datos de OpenOffice mediante purito SQL, sin usar la interfaz gráfica para nada más que abrir el cuadro de diálogo que nos permitirá introducir las instrucciones SQL.

Para quienes nos iniciamos en SQL es una gran herramienta de aprendizaje de este lenguaje estructurado de consultas.

La pueden descargar en el adjunto del pie, además de el enlace que provee el autor.

¡Disfrútenla!

AdjuntoTamaño
USANDO SQL EN BASE DE OOo.pdf3.24 MB