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.