stored query optimizar lentas iteraciones for ejemplos ejemplo consultas con ciclos ciclo bucle sql ms-access loops

sql - optimizar - query con ciclo for



¿Cómo ejecutar un bucle de consultas en el acceso? (4)

Aquí hay un código de muestra, está escrito, no probado.

Dim rs AS DAO.Recordset Dim rs2 AS DAO.Recordset Set rs=CurrentDB.OpenRecordset("querycrit") strSQL="SELECT * From Records WHERE " Do While Not rs.EOF Set rs2=CurrentDB.OpenRecordset(strSQL & rs![Query]) If Not rs2.EOF Then Debug.Print rs![Error] Debug.Print rs2.Fields(1) End If rs.MoveNext Loop

Tengo una base de datos con una tabla que está llena de condiciones y mensajes de error para verificar otra base de datos.

Quiero ejecutar un ciclo de modo que cada una de estas condiciones se compruebe contra todas las tablas en la segunda base de datos y genere un informe que proporcione los errores.

¿Es esto posible en ms access?

Por ejemplo,

tabla querycrit

id query error 1 speed<25 and speed>56 speed above limit 2 dist<56 or dist >78 dist within limit

Tengo más de 400 consultas como esta de diferentes variables.

La tabla en la que estoy ejecutando las consultas es

tabla de registros

id speed dist accce decele aaa bbb ccc 1 33 34 44 33 33 33 33 2 45 44 55 55 55 22 23

Respecto a ttk


Cuando dices "informe", ¿te refieres a un Informe de acceso, o escribirías en un archivo o en un Formulario de acceso?

Puede crear una función o sub en un Módulo para hacer esto. Abra un conjunto de registros en su tabla querycrit y recorra los registros de forma dinámica construyendo y ejecutando el SQL para la tabla de registros. Puede escribir los resultados de estas consultas dinámicas en un archivo, o un formulario, o insertar los resultados en una tabla temporal e impulsar el Informe de acceso desde allí.


Aquí hay un código de muestra más. Ilustra el uso de dos tipos diferentes de conjuntos de registros. Puede leer Traps de VBA: Trabajar con Recordsets por Allen Browne y Lista de palabras reservadas en Access 2002 y en versiones posteriores de Access .

Dim rs As DAO.Recordset Dim rs2 As ADODB.Recordset Set rs = CurrentDb.OpenRecordset("querycrit") Set rs2 = CreateObject("ADODB.Recordset") rs2.ActiveConnection = CurrentProject.Connection For Each tdf In CurrentDb.TableDefs ''EDIT: TableDefs includes Microsoft System tables and '' ''these should never be tampered with. They all begin with Msys '' ''so we can leave them out of the loop here. '' If Left(tdf.Name, 4) <> "msys" And tdf.Name <> "querycrit" Then rs.MoveFirst strSQL = "SELECT * From [" & tdf.Name & "] WHERE " Do While Not rs.EOF On Error Resume Next Debug.Print tdf.Name rs2.Open strSQL & " " & rs![query] If Err.Number = 0 Then On Error GoTo 0 If Not rs2.EOF Then Debug.Print rs![Error] Debug.Print rs2.GetString End If End If Err.Clear rs2.Close rs.MoveNext Loop End If Next End Sub


"en realidad, hay muchas tablas de registros para verificar y no todas las consultas se pueden ejecutar en todas las tablas, por ejemplo, en una tabla, la velocidad puede no estar allí y en la siguiente tabla la distancia puede no estar allí".

Creo que lo correcto sería crear una tabla de tablas y una tabla de unión de tabla de consulta que muestre qué consultas se ejecutarán en cada tabla, por ejemplo:

TableID QueryID 1 4 2 1 2 3 3 1

Esto se puede usar para ejecutar el conjunto correcto de consultas en cada tabla.