¿Es mejor tener la info en tablas o poca info en tablas y buenas consultas?

¿Es mejor tener la info impresa en tablas o poca info en tablas y buenas consultas?

¿Qué recomiendan?

Tengo una tabla con pedidos que calcula comisiones según variables como porcentaje de comisión, línea, etc y el resultado es:

1- Hace el calculo según condicionales e imprime el monto de comisión en una tabla. (Lo malo de esta opción es que si realice algo mal y lo quiero modificar ya no se soluciona para atrás)

2- Pongo las variablees y los cálculos los hace de manera constante con funciones vba, a las que llamo desde una consulta access.

Todos los informes que muestran estadisitcas llaman a estas consultas que en la opción 1 tienen los datos guardados en tablas y en la dos no tienen los datos sino las variables guardadas en las tablas y las cuentas se hacen por funciones.

Espero que se entienda. Mi pregunta es. Si uso la función 1 probablemente pueda haber más errores, o si hubo un error y luego lo quiero solucionar no es tan simple como mejorar la fórmula de la función. Y si uso la función 2 todo con consulta, me queda más limpio, pero creo que se hace muy lenta la base de datos cuando tengo que abrir algún reporte porque analiza mucho.

¿Qué recomiendan?

1 Respuesta

Respuesta
1

Pues nuevamente va a depender del uso que le vayas a dar a la BD y de lo que te interese más. Si te interesa tener almacenada la información histórica, vas a tener que optar por el método 1 que describes, si no, por el 2.

Con un ejemplo es más sencillo de ver:

Imagínate que tienes una BD para facturación de un negocio de frutas y verduras, que tienen un precio muy volátil.

Lo normal es que tengas una tabla de productos, otra de facturas (con los datos generales de la factura y el total de la misma) y otra de detalle de facturas (con los distintos productos, precios unitarios y cantidades de cada factura)

Si optas por opción 2 de las que planteas, en tu detalle de facturas almacenarás los datos mínimos, que en ese caso serían Id del producto y cantidad vendida, mostrando el precio unitario en un cuadro independiente y calculando los subtotales y el total de la factura, bien por código VBA o mediante consultas.

Este sistema es ideal si sólo te interesa hacer las facturas.

Como el precio de los productos cambia todos los días, lo actualizarás en la tabla productos. El problema está en que si necesitas refacturar (o consultar) una venta de un día anterior (con un precio distinto), la verás con los precios actuales (los que están recogidos en la tabla productos), lo que no es "real".

En este caso, la mejor opción es el sistema 1, por ejemplo, almacenando también el precio unitario de los productos en el detalle de facturas (los totales los puedes seguir calculando por consultas/código, pues tienes la base fija para los cálculos)

En resumen, lo mejor es tener la mínima información repetida en las tablas, pero en ocasiones no te quedará más remedio que tener alguna información repetida, pero hay que intentar que sea mínima.

Gracias por la respuesta,
Si mira tengo facturas, y tambien necesito ver lo historico total. 
En las factura hago como dices tu, deja en tabla las variables que afectan al precio, y el resto todo en calculo.
Ej:

PRECIO - CANTIDAD - SUBTOTAL - COMISION CLIENTE - COMISION PROVEEDOR - COMISION VENDEDOR
De todos esos campos solo el precio y la cantidad se toma y se imprime en la tabla. El resto son calculados por funciones en VBA que las llamo desde la consulta.
De esta forma siento que es mas seguro y prolijo. Ademas si modifico algun precio o cantidad se que el resto si o si estara modificado correctamente.
El problema es que los campos COMISION CLIENTE, COMISION VENDEDOR, COMISION PROVEEDOR, y otros... tienen funciones largas con condicionales IF evalua varias cosas para devolver el resultado correcto de la comision segun distintas variables.
Al querer revisar un informe estadistico detallado de ventas por ejemplo. O listar en un formulario todos los pedidos existentes y sus montos debe realizar todos estos calculos, subtotales, condicionales if, de 5000 registros distinos para devolverme las ventas anuales o el lista de ordenes. Este es el punto que me llama la atencion. 
Yo prefiero tenerlo en calculado todo (salvo las variables que afectan a los calculos) que impreso en tabla pero no se vuelve muy pesada la base de datos cuando abro un informe y tiene que calcular todo junto las comisiones y valores antes de devolver el informe/formulario.
¿Cual es tu opinión?

Yo, particularmente, me inclino, en general, por hacer los cálculos cuando los necesito (mediante VBA/consultas), pero si el tiempo de respuesta de las consultas/informes es elevado, en ocasiones no queda más remedio que almacenar en la tabla los "campos calculados". Como te digo, eso es cuestión personal mía.

Tu problema de retardo, probablemente se irá "agravando" con el tiempo, al aumentar el número de registros que manejes, pues tendrá que hacer cada vez más cálculos para mostrar los resultados.

Quizás puedas optimizar un poco los tiempos si "mejoras" las funciones de VBA (ojo, que no sé cómo las tienes ni si se pueden mejorar), por ejemplo usando select case en lugar de bloques If..ElseIf..Else...

Genial!
Creo que comparto lo mismo. Dejo en tabla solo los datos que afectan a la función. Todo lo que sea calculo creo una función primero en vba, luego en la consulta creo un campo y llamo a esa funcion.
1. ¿Esa es la forma no?

2. Yo suelo tener una tabla. Ejemplo PEDIDOS y luego una consulta general: PEDIDOS AMPLIADOS. Dentro de esta consulta general tengo tal vez 20 campos calculados por funcion VBA. Desde comisiones, hasta carteles informativos que segun fechas te dan la respuesta en textos del estado del pedido, y mas. 
Luego Todo lo que hago aunque necesite solo dos campos, lo hago llamando a la consulta madre PEDIDOS AMPLIADOS, que ya tiene todas las funciones correctas, y elijo los campos que quiero que muestre en esa nueva consulta que necesito. Esto lo hago para tener todas las funciones en una consulta madre centralizada. Para evitar error. ¿Puede ser que esto me haga que sea lento cualquier informe, porque al venir de la consulta madre calcula primero los 20 campos calculados y después me devuelve en mi informe solamente los dos que quiero mostrar?
Por que si no hago ninguna consulta madre, tengo que preocuparme en cada consultita que hago de tener que llamar a la Tabla PEDIDOS y volver a imputar las funciones, y si algún día cambio algo de alguna, tengo que entrar en las 30 consultitas que tengo y ajustar la funcion porque por ejemplo agregue una variable nueva.
¿Como lo planteas tu en términos generales? 
Y con esto termino, es que me estas sacando dudas muy grandes e importantes de planteo que son determinantes! Desde ya te voy agradeciendo !!

Yo no haría tu consulta PEDIDOS AMPLIADOS, y luego consultas sobre esa, si no que iría haciendo las distintas consultas a medida que las necesite, y sólo con los campos calculados que necesite. De ese modo verás que la aplicación trabaja más fluida, aunque sí es cierto que si cambias una función vas a tener que revisar más consultas.

Otra opción que tienes es hacer los cálculos en cuadros de texto indepedientes en los propios formularios (salvo que sean formularios continuos) o informes, con lo que sólo se realizan los cálculos para el registro que estás viendo (en el caso de los formularios)

Como comentario final, decirte que hay quien no guarda consultas en su BD, y las crea directamente en el origen de datos de los formularios o informe.

¡Gracias! 

Muchas gracias por toda tu experiencia! Muy interesante!! Me sirve todo! 

Experto, me surgió un solo problema respecto a esto, disculpa la molestia.
No pude hacer una función calculada con un campo Fecha.

Public function fncfecha (pedido, fechaconfirmacion) as Date
If pedido = True Then
fncfecha = fechaconfirmacion + 15
Else
fncfecha = Null
End If


Me da error por fecha nula


La idea es que si el campo pedido esta tildado la fecha de pedido sea 15 posterior a la fecha de confirmación, y si no hay un pedido tildado como confirmado que quede nula o vacia. Que no aparezca ninguna fecha.
Prefiero que sea calculada en una consulta, tal como vimos en los otros campos, para que no quede guardada en ninguna tabla y se actualice de manera correcta en todos los informes. Sin usar after updates. Son muchas fechas que necesito calcular.

Se me ocurren dos opciones:

1º/ Que la función la definas como Variant para poder usar Null, o que la definas como String y uses ="" en vez de =Null. El problema de este método es que el campo lo entenderá como texto, y si quieres operar con la fecha luego, tendrás que usar CFecha (o CDate) para convertirla en fecha

2º/ Que calcules directamente el camo en la consulta, sin función VBA:

fecha:SiInm(pedido=Verdadero;fechaconfirmacion+)

De este modo te devuelve la fecha o un campo vacío/blanco

Un saludo.
PD: Para otra ocasión, plantea la duda en una nueva pregunta, pues esto poco tiene que ver con la pregunta original... XD

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas