¿Tablas en vez de consultas?

Tengo una base de datos en donde las cuenta corriente de los clientes la saco a través de una consulta de unión (Facturas en Ctacte + Recibos) después a esa consulta la filtro por el campo cliente de un formulario en otra consulta, veo que cada vez se hace más pesada, ya que a su vez en la segunda consulta saco el saldo con Dsum .

Mi pregunta como soy nuevo en esto de Ctacte y cajas, es si conviene en vez de tantas consultas ir llevando la información en tablas como para no sacar cálculos cada vez que uno quiere averiguar los saldos.

Veo que por tablas por ej. Movimientos en donde se puede concentrar las ventas y los recibos podría ser más rápido.

Pido alguna idea.

2 Respuestas

Respuesta
2

Al no saber como están construidas las tablas, no puedo dar una opinión concreta, ya que no sé si la factura se considera un cobro y el recibo un gasto, o viceversa. Si tengo una tabla Clientes, con sus datos y una tabla Movimientos, relacionada con la anterior por IDcliente, y hago un formulario

El código del evento Después de actualizar del cuadro de texto Importe es

DoCmd. RunCommand acCmdSaveRecord
Saldo = Nz(DSum("importe", "movimientos", "concepto=""Factura"" and idcliente=" & Me.IdCliente & "")) - Nz(DSum("importe", "movimientos", "concepto=""Recibo"" and Idcliente=" & Me.IdCliente & ""))

Pero ya te digo, al no saber como funcionan los cargos no puedo decir más.

Te comento un poco mas, las tablas de entrada de plata serian Facturas de contado, y recibos, la de salida seria pagos, mi idea es unir esas 3 y de ahí sacar los resultados, para no ir llevando una tabla Movimientos que la eh visto por ahí que la usan pero llevaría datos repetidos.

Por ahora voy a intentar lo que me dice Sveinbjorn, de hacer las uniones ya filtradas así no se pone pesada.

No esta mal tu idea también en caso que me decida ir llevando una tabla movimientos.

Veremos que sale.

Muchas gracias.

Debes hacer lo que creas conveniente, pero te diré que te basta sólo con una tabla para los movimientos, ya que lo que diferencia un registro de otro es el concepto, y siempre puedes decirle que te muestre, o bien por formulario o bien por informe, aquellos registros del Cliente X en que concepto sea Factura de contado, o Recibos o ambas, o listado de facturas entre dos fechas, en un mes, etc. Por ejemplo

Si pulso el botón

Respuesta
2

Ya que quieres opiniones, ahí va la mía:

Yo no soy partidario de guardar en tablas ni datos "repetidos" ni datos "calculados" y siempre que puedo uso consultas (o código) para obtener esa información.

Lo que es importante es diseñar adecuadamente las consultas para que se ejecuten lo más rápido posible, usando filtros, por ejemplo.

En tu caso concreto, en vez de hacer una consulta de unión sobre dos tablas enteras y luego hacer otra consulta de totales sobre esa consulta y filtrarla por cliente, yo haría al revés, es decir, filtraría primero las tablas para hacer la consulta de totales, así ya obtienes un conjunto menor de registros sobre los que calcular la suma agrupada, y seguro que así aligeras la consulta.

Por ejemplo,, en vez de poner:

SELECT * FROM Tabla1

UNION ALL

SELECT * FROM Tabla2

hacer:

SELECT * FROM Tabla1 WHERE Cliente=10

UNION ALL

SELECT * FROM Tabla2 WHERE Cliente=10

Un saludo.


     bit.ly/ForoNkSv 

Gracias por responder, voy a ir por este lado, de no generar una tabla con datos repetidos,el tema es que yo hacia así, Unión de tablas Facturas(de contado) + Recibos (de los clientes)+ Pagos(Salidas de plata) con esta consulta de unión lograba tener una "Caja" general [CajaPlata] y no hacer una tabla.

Pero para que me saque bien el tema del orden, tengo otra consulta a esta unión en donde le agrego el campo Orden con: Orden: (SELECT COUNT(*) FROM CajaPlata AS T WHERE CSng(T.Fecha) & T.IDPagos<=CSng(CajaPlata.Fecha) & CajaPlata.IDPagos)

En donde le doy un Orden a cada linea ordenado por la fecha y el ID, esto es por si hay algún comprobante pasado con una fecha mal o cambiada igualmente me lo ordenaría por donde corresponde.

Y recién de esa consulta yo pedía los datos, al hacer esos 2 pases seguramente cuando la base tenia mas registros se ponía muy lento.

No pude poner Orden en la consulta de unión en forma directa que seria bárbaro así pido los datos filtrados y le doy un orden.

Quisiera lograrlo con consultas, si no voy a tener que recurrir a vba Ado o Dao recordset y hacer todo manual.

Muchas gracias

Gracias por responder, voy a ir por este lado, de no generar una tabla con datos repetidos,el tema es que yo hacia así, Unión de tablas Facturas(de contado) + Recibos (de los clientes)+ Pagos(Salidas de plata) con esta consulta de unión lograba tener una "Caja" general [CajaPlata] y no hacer una tabla.

Pero para que me saque bien el tema del orden, tengo otra consulta a esta unión en donde le agrego el campo Orden con: Orden: (SELECT COUNT(*) FROM CajaPlata AS T WHERE CSng(T.Fecha) & T.IDPagos<=CSng(CajaPlata.Fecha) & CajaPlata.IDPagos)

En donde le doy un Orden a cada linea ordenado por la fecha y el ID, esto es por si hay algún comprobante pasado con una fecha mal o cambiada igualmente me lo ordenaría por donde corresponde.

Y recién de esa consulta yo pedía los datos, al hacer esos 2 pases seguramente cuando la base tenia mas registros se ponía muy lento.

No pude poner Orden en la consulta de unión en forma directa que seria bárbaro así pido los datos filtrados y le doy un orden.

Quisiera lograrlo con consultas, si no voy a tener que recurrir a vba Ado o Dao recordset y hacer todo manual.

Muchas gracias

No, el campo Orden no lo puedes crear directamente en la consulta de unión, pues aunque sí permite crear campos calculados, tienen que ser dentro de cada SQL que se une, y el campo Orden, al querer ordenar toda la tabla, lo tienes que hacer "a posteriori".

Otra cosa que puedes hacer para aligerar las consulta, y que antes se me olvidó comentarte, es seleccionar los mínimos campos que necesites para hacer los cálculos y mostrar lo que quieres. Es decir, en vez de poner:

SELECT * FROM Tabla1

UNION ALL

SELECT * FROM Tabla2

poner:

SELECT Fecha, Concepto, Importe FROM Tabla1 WHERE Cliente=10

UNION ALL

SELECT Fecha, Concepto, Importe  FROM Tabla2 WHERE Cliente=10

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas