Inicio de sesión

Quién está conectado

Actualmente hay 0 usuarios y 1 invitado en línea.

Sindicar

Distribuir contenido

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

Sin suscripción


Documentación LibreOffice en español

Comentarios recientes

Encuesta

¿Sobre qué programas esperas encontrar tutoriales y ejercicios en SuperAlumnos.net? :