[RESUELTO] Consulta para un Libro Mayor

Discute sobre las herramientas de la base de datos

[RESUELTO] Consulta para un Libro Mayor

Notapor aventis » Jue May 05, 2011 8:26 pm

Buenas tardes:

Hay una consulta/informe que me está dando muchos quebraderos de cabeza.

Se me ha pedido hacer un Libro Mayor para una base de datos en la cual los registros están organizados de la siguiente manera:

Id_venta
Concepto
Precio
Fecha_venta
Fecha_cobro
Nota_cobro

Me 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.

Esto suponiendo que se haga con una consulta...

Muchas gracias de antemano.
Última edición por aventis el Lun May 09, 2011 11:05 am, editado 3 veces en total
OpenOffice 3.2 - Windows XP.
Avatar de Usuario
aventis
 
Mensajes: 74
Registrado: Vie Nov 12, 2010 8:10 pm

Re: Consulta para un Libro Mayor

Notapor RMG » Vie May 06, 2011 12:22 pm

Hola Aventis,

Si que lo puedes hacer con una consulta, pero debes usar el JOIN (derecho ó izquierdo). Una vez creada las dos primeras consultas con su id_ventas, las debes unir con la tabla en otra y en diseño picando con el botón derecho en las relaciones te aparecerá donde le asignas el tipo de relación (JOIN).
Aquí te dejo un enlace que te puede servir. Y si le dás una mirada a mi proyecto veras más de una consulta con este tipo de relación.

viewtopic.php?f=32&t=3764

Saludos
OpenOffice 4.1.9 y LibreOffice 6.2.4.2 en W-10, y LibreOffice 4.1.6.2 en Open Suse 13.1(VirtualBox)
RMG
 
Mensajes: 3835
Registrado: Mar Nov 17, 2009 6:59 am
Ubicación: Valencia - España

Re: Consulta para un Libro Mayor

Notapor aventis » Vie May 06, 2011 6:02 pm

No me has entendido
De esta forma no puedo conseguir un orden cronológico de los asientos.

Digamos que intento generar una columna "fecha" que aglutine todos los registros del "debe" + todos los registros del "haber", sería algo así como fusionar los campos fecha_venta y fecha_cobro en una misma columna.

He seguido dándole vueltas y sólo se me ocurre la descabellada idea de una tabla con todos los días del calendario (en el campo "fecha") que estuviera vinculada por un lado a fecha_venta y por otro a fecha_cobro. De esta manera, se haría una consulta con la tabla "calendario" y la tabla ventas de manera que mostraría todos los asientos que se produjeran por orden cronológico. Por supuesto, esto es una gilipollez.
OpenOffice 3.2 - Windows XP.
Avatar de Usuario
aventis
 
Mensajes: 74
Registrado: Vie Nov 12, 2010 8:10 pm

Re: Consulta para un Libro Mayor

Notapor RMG » Vie May 06, 2011 6:12 pm

Vale, efectivamente no te habia entendido, pero ahora te puedo dar una posible solucion.

Creas en la tabla un nuevo campo Fecha, y que este se cargue automaticamente con la fecha del dia que haces cualquier cambio en las otras fechas ó incluso que te ponga la misma fecha, asi lo tendrás cronologicamente y podras ordenar por este campo.

Espero que te sirva.

Saludos
OpenOffice 4.1.9 y LibreOffice 6.2.4.2 en W-10, y LibreOffice 4.1.6.2 en Open Suse 13.1(VirtualBox)
RMG
 
Mensajes: 3835
Registrado: Mar Nov 17, 2009 6:59 am
Ubicación: Valencia - España

Re: Consulta para un Libro Mayor

Notapor aventis » Vie May 06, 2011 6:23 pm

RMG escribió:Vale, efectivamente no te habia entendido, pero ahora te puedo dar una posible solucion.

Creas en la tabla un nuevo campo Fecha, y que este se cargue automaticamente con la fecha del dia que haces cualquier cambio en las otras fechas ó incluso que te ponga la misma fecha, asi lo tendrás cronologicamente y podras ordenar por este campo.

Espero que te sirva.

Saludos

Serviría en adelante, pero para los asientos que ya están hechos, no.

Gracias, RMG, de nuevo.
:super:

PD.: Lo dejo abierto por si alguien puede aportar algo más.
OpenOffice 3.2 - Windows XP.
Avatar de Usuario
aventis
 
Mensajes: 74
Registrado: Vie Nov 12, 2010 8:10 pm

Re: Consulta para un Libro Mayor

Notapor RMG » Vie May 06, 2011 7:57 pm

Puedes trasladar los datos a Calc, cargar la columna con la nueva fecha con formula, copias y pegas valores para que quede grabado el valor y no la formula, despues borras los datos antiguos de la tabla y cargas los nuevos con el nuevo campo fecha.

Podria ser no?

Saludos
OpenOffice 4.1.9 y LibreOffice 6.2.4.2 en W-10, y LibreOffice 4.1.6.2 en Open Suse 13.1(VirtualBox)
RMG
 
Mensajes: 3835
Registrado: Mar Nov 17, 2009 6:59 am
Ubicación: Valencia - España

Re: Consulta para un Libro Mayor

Notapor ifanlo » Vie May 06, 2011 8:05 pm

Estimados,

Está claro que lo que hace falta es una UNION entre la consulta DEBE y la consulta HABER, pero este tipo de consultas de UNION, presentan siempre unas complicaciones absurdas que hacen su manejo bastante intratable en OOo. Como es algo que me viene preocupando hace tiempo, he usado el planteamiento de aventis como ejercicio para desentrañar el tema.

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.

Consideraciones previas para poder esquematizar más adelante el "paso a paso" que seguirá:

- Para hacer una consulta de UNION no se puede hacer en la vista de diseño, hay que hacerla en la vista SQL

- Además hay que activar el botón "SQL" (o Editar > Ejecutar directamente comando SQL). Si no lo haces así, el Base te dice que la consulta de UNION no es una consulta válida. Por lo leído, este modo de ejecución directa de SQL de alguna manera "puentea" al OOo, accediendo directamente al controlador de la base de datos.

- Consecuencia de lo anterior, hay que ser más meticuloso con la sintaxis. Si en SQL "normal" es válido escribir:
Código: Seleccionar todo   Expandir vistaContraer vista
select * from Ventas

en el modo de "ejecución directa de SQL" hay que hacer:
Código: Seleccionar todo   Expandir vistaContraer vista
select * from "Ventas"


- 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 vista Debe como la vista Haber 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: al crear este campo calculado poniendo directamente el valor 0 en el diseño de vistas de tabla, se fundía el OOo. 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. :-D

Y ahora viene el paso a paso:

1) Disponemos de la tabla Ventas, según la estructura que propone aventis.

2) Creamos una vista de tabla VistaDebe, tal que así:
Código: Seleccionar todo   Expandir vistaContraer vista
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í:
Código: Seleccionar todo   Expandir vistaContraer vista
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 en modo SQL con las siguientes características:
- Editar > Ejecutar directamente comando SQL
- La instrucción SQL:
Código: Seleccionar todo   Expandir vistaContraer vista
select * from "VistaDebe" union select * from "VistaHaber" order by "Fecha"


¡Y ya lo tienes!

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.

Adjunto el ejemplo, donde se puede ver todo ello.

Saludos,
Adjuntos
test-mayor.odb.zip
(3.89 KiB) 402 veces
Ismael Fanlo

*ifanlo - soluciones libres* http://ifanlo.com
- Consultoría en migraciones a software libre
- Soporte ofimático online
- E-learning
- Formación informática presencial
Avatar de Usuario
ifanlo
 
Mensajes: 420
Registrado: Lun Mar 30, 2009 10:32 am

Re: Consulta para un Libro Mayor

Notapor RMG » Sab May 07, 2011 9:09 am

Tambien se me ocurre poner esta funcion en una consulta y sin crear un campo nuevo.

CASE WHEN "FechaCompra" ES VACIO THEN "FechaVenta" ELSE "FechaCompra" END

Tal cual esta no te crea una fecha sino un número, pero como solamente es para ordenar sería suficiente

Saludos
OpenOffice 4.1.9 y LibreOffice 6.2.4.2 en W-10, y LibreOffice 4.1.6.2 en Open Suse 13.1(VirtualBox)
RMG
 
Mensajes: 3835
Registrado: Mar Nov 17, 2009 6:59 am
Ubicación: Valencia - España

Re: Consulta para un Libro Mayor

Notapor aventis » Lun May 09, 2011 11:04 am

ifanlo escribió: :idea:


¡¡Brillante!!

Como no sé hacer consultas en sql, jamás hubiera llegado hasta allí. Creo que la clave está: 1º. en conseguir ese campo "debe" y ese campo "haber" igual a 0 (0*0 :lol: ) y luego, por supuesto, conseguir una unión entre las dos fechas.

Me pongo a ello, pero visto tu ejemplo... es un "resuelto" como un castillo. :bravo:

RMG escribió:Tambien se me ocurre poner esta funcion en una consulta y sin crear un campo nuevo.

CASE WHEN "FechaCompra" ES VACIO THEN "FechaVenta" ELSE "FechaCompra" END

Tal cual esta no te crea una fecha sino un número, pero como solamente es para ordenar sería suficiente

Saludos

Esto no lo entiendo muy bien, supongo que te refieres a "fecha_cobro" en lugar de "fecha_compra". Se supone que lo que hace esta función es sustituye un campo por otro cuando es vacío?
OpenOffice 3.2 - Windows XP.
Avatar de Usuario
aventis
 
Mensajes: 74
Registrado: Vie Nov 12, 2010 8:10 pm


Volver a Base

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados