Access, ComboBox. Optimizar Consulta muy pesada en un combobox

En mi formulario continuo tengo un combobox que se alimenta de una consulta con muchas operaciones detrás, por lo que al desplegarlo se hace eterno cuando lo que busco es agilizar el proceso; ya que por cada click en el combo lo que hago es que se me genera un registro y debería ser ágil.

¿Se os puede ocurrir alguna forma para poder agilizarlo? He pensado en meterme al mundo de las clases, pero aún estoy pez en este tema y tampoco sé si será la solución a mi problema.

Respuesta
2

Una forma muy fácil de aligerar el proceso sería pasar los datos de la consulta a una tabla temporal, y usar esa tabla como base para el cuadro combinado. De esta forma solo necesitas hacer una vez la consulta, con lo que notarás bastante mejoría.

La idea sería hacerlo en el evento "al cargar" o "al abrir" de tu formulario.

Aunque habría más formas de hacerlo, yo haría lo siguiente:

1º/ Crea una tabla (llamada Temp) con los mismos campos y tipos que devuelve tu consulta (esto lo harías "a mano" una sola vez).

2º/ Cambia el origen del combinado de la consulta a la tabla (solo lo haría una vez también)

3º/ En uno de los dos eventos que te comento de tu formulario continuo, le pones el código:

CurrentDb.Execute "DELETE * FROM Temp"
CurrentDb. Execute "INSERT INTO Temp SELECT * FROM NombreConsulta"

Con la primera borras los datos de la tabla, y con la segunda pasas los resultados de la consulta a la tabla.

Un saludo.


Hola Sveinbjorn,

Es una solución muy práctica la verdad... en otras ocasiones lo he volcado a una tabla existente, pero el tema de la tabla temporal realmente me ha fascinado y veré cómo aplicarlo en otros casos.

El problema es que para el caso que estoy comentando en el post creo que no me valdría ya que cada vez que accedo al combobox necesito obtener los datos actualizados de la consulta.

Para ser un poco más preciso lo expongo con ejemplo sencillo (espero no extenderme demasiado):

1.- Supongamos que tengo una  red de tubos con un origen A y un destino B (algo parecido a los laberintos de los niños) pero con tramos de diferentes tamaños y varias posibles soluciones de A a B; unas más cortas y otras más largas.

2.- Tengo que trazar 50 líneas de diferentes grosores entre A y B e indicar por cada línea la secuencia exacta de tubos desde A para llegar a B.

3.- Empiezo por indicar la ruta del camino más corto, pero dado que los tubos son de diferentes tamaños llegará un momento en que alguno se sature y tenga que empezar a ver otras alternativas.

4.- a medida que voy completando las rutas de las líneas se van saturando otros tubos y tengo que volver a revisar las rutas y sus alternativas.

5.- la última línea que voy a rutar seguramente sea la más larga y por la que más tramos pase ya que tiene que evitar todos los tubos saturados.

En mi caso, utilizo los combobox para seleccionar los tubos; en este combobox además de la identificación del tubo incluyo otra información (como el llenado actual de los tubos, nº de líneas que pasan por el tubo, tamaño del tubo, etc) que ayuda a detectar los tramos que ya están saturados y los que no. Una vez seleccionado el tubo, en el formulario enseño de nuevo el estado actual de ese tubo para indicar los estados y otras alarmas/incompatibilidades; este estado se actualizaría para todo el formulario donde se use el tubo (nota 1).

El combobox me va lento porque tira de una consulta de totales, mínimos y cuentas agrupados por los tubos que a su vez incluye diferentes operaciones entre estos resultados y que a su vez coge los datos de las dimensiones tanto de tubos (nota 1) como de líneas.

Una carga puntual de la consulta es asumible, pero se hace muy poco práctico cuando al definir una ruta (algo muy ágil) se tiene que esperar cada vez que defino un tubo por el que quiero pasar.

(nota 1) para agilizar la parte de la info de los tubos en el formulario (no en el combobox) lo que hago es crear en la tabla de tubos unos campos que voy actualizando con el afterupdate del combobox.

Para que te puedas hacer una idea todavía más exacta del volumen de operaciones; con el ejemplo más aproximado; serían 6.000 líneas de diferentes con diferentes orígenes y destinos, 3.000 tubos que definen la red de tubos que interconectan los diferentes orígenes y destinos, y unas 40.000 secuencias (línea + secuencia desde A a B + tubo).

Agradecería cualquier ayuda.

Gracias de nuevo

Llevo un buen rato pensando en tu problema, y partiendo de que desconozco la casuística de tu BD y cómo tienes hecha la consulta, se me ocurren un par de cosas que quizás te puedan funcionar:

1º/ Intenta que la consulta trabaje con menos registros, usando subconsultas.

El problema de las consultas con campos calculados es que hacen los cálculos para todos los registros, y filtrar la consulta no resuelve el problema (primero se calculan todos los registros y luego se muestran solo los del filtro).

Si usas subconsultas, puedes filtrar ya en el origen, con lo que se reducen los cálculos a realizar.

Por ejemplo, para saber los litros de agua consumidos en Madrid, en vez de usar esto:

SELECT SUM(Litros) AS TotalLitros FROM Consumo WHERE Provincia='Madrid'

usa esto otro:

SELECT SUM(A.Litros) AS TotalLitros FROM (SELECT Litros FROM Consumo WHERE Provincia='Madrid') AS A

2º/ Usar consultas de selección normales (no de totales) y realizar los cálculos a través de funciones VBA.

Por ejemplo, en vez la primera consulta del punto anterior usar otra así:

SELECT fncConsumo(Provincia) AS TotalLitros FROM Consumo WHERE Provincia='Madrid'

y en VBA tienes una función como:

Public Function fncConsumo(laProvincia As String) As Double
  fncConsumo=DSum("Litros","Consumos","Provincia='" & laProvincia & "'")
End Function

Por otro lado, usar clases no sé si te serviría o no para lo que quieres hacer (clases tengo hecho algunas, pero muy simples y con bastante trabajo)

Muy buena ayuda, creo que me podría servir!

Déjame unos días para ver cómo puedo encajar tus ideas y te hago saber si me ha funcionado alguna alternativa.

De nuevo gracias

Hola Sveinbjorn,

Siguiendo tu recomendación, finalmente opté por replicar en código VBA las consultas de las que se alimentaba el combobox y el resultado ha sido el deseado; se han optimizado increíblemente las operaciones y los tiempos a través del combobox.

Las consultas anteriores complejas las sigo usando ya que forman parte de un proceso más global y menos puntual.

La única pega (que sirva de aviso a navegantes) es que cualquier modificación de las consultas se tienen que reflejar idénticamente en el código; y sobretodo verificar que los resultados son los deseados y que coinciden.

Gracias!

Saludos

Me alegra ver que mis recomendaciones te sirvieron.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas