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.
Teniendo presentes estas consideraciones, pasemos a la solución del problema de ejemplo.
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.
Adjunto | Tamaño |
---|---|
test-mayor.odb | 5.38 KB |